[K8S]Kubernetes环境检测与API简介
创始人
2024-05-25 09:02:34

文章目录

    • 环境判断
      • docker环境检测
      • K8S环境检测
      • 获取POD的Namespace
    • API Server
      • 概述
      • API访问
        • 命令行方式
        • 编程方式

REST API是Kubernetes系统的重要部分,组件之间的所有操作和通信均由API Server处理的REST API调用。

环境判断

在使用API时,需要先判断是否是K8S环境。

docker环境检测

通过cgroup可判断出当前环境是docker、K8S、还是其他环境。

// Dockers:
//	11:blkio:/docker/3b9db3ef91bed85163973184bb848993ce79f7e23a451d0a806c7262e7784db1
//	10:memory:/docker/3b9db3ef91bed85163973184bb848993ce79f7e23a451d0a806c7262e7784db1
//	9:perf_event:/docker/3b9db3ef91bed85163973184bb848993ce79f7e23a451d0a806c7262e7784db1
// K8s:
//	11:cpuset:/kubepods/pod703e68e9-0a47-46f7-9cea-25d838510afa/358c08546c401e57b2f14632a700cb296c2a606eb67fdae963a2d66a3380f046
//	10:blkio:/kubepods/pod703e68e9-0a47-46f7-9cea-25d838510afa/358c08546c401e57b2f14632a700cb296c2a606eb67fdae963a2d66a3380f046
//	9:memory:/kubepods/pod703e68e9-0a47-46f7-9cea-25d838510afa/358c08546c401e57b2f14632a700cb296c2a606eb67fdae963a2d66a3380f046
// Other:
//	11:blkio:/init.scope
//	10:memory:/init.scope
//	9:perf_event:/func IsDocker() bool {grpFile := "/proc/1/cgroup"lines, err := files.ReadLines(grpFile, 1)if err != nil {return false}if len(lines) == 0 {log.Printf("[ERROR] read %v fail: no line got", grpFile)return false}return strings.Contains(lines[0], "/docker/")
}

K8S环境检测

通过API接口rest.InClusterConfig()可检测是否在K8S中;更方便的方式是,直接通过环境变量检测:

func IsK8s() bool {host := os.Getenv("KUBERNETES_SERVICE_HOST")return len(host) != 0
}

获取POD的Namespace

获取POD的Namespace最简单的方式,是直接读取namespace文件:

func GetNamespace() (string, error) {namespace := ""filePath := "/var/run/secrets/kubernetes.io/serviceaccount/namespace"nsRead, err := ioutil.ReadFile(filePath)if err != nil {log.Printf("[ERROR] read namespace fail: %v", err)return namespace, err} else {namespace = string(nsRead)return namespace, nil}
}

API Server

Kubernetes API Server提供了Kubernetes各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中心。

概述

Kubernetes API Server提供的功能:

  • 集群管理的REST API接口(包括认证授权、数据校验以及集群状态变更);
  • 模块之间的数据交互和通信的枢纽
  • 资源配额控制的入口;
  • 拥有完备的集群安全机制;
    k8s api structure

API访问

Kubernetes提供了多种访问方式。

命令行方式

可通过kubectl命令行访问:

kubectl get --raw /api/v1kubectl get --raw /api/v1/namespaces

编程方式

通过客户端库github.com/kubernetes/client-go/可方便使用接口。

每个Pod对象都只有一个服务帐户,若创建时未明确指定,会自动附加当前名称空间中默认服务帐户default。每个Pod都会自动关联一个存储卷,挂载至/var/run/secrets/kubernetes.io/serviceaccount

API的访问受RBAC的控制,可通过yaml分配权限与角色。测试时,可直接通过kubectl create clusterrolebinding serviceaccounts-view --clusterrole=cluster-admin --group=system:serviceaccounts授予账号访问权限。

接口使用方式:

  • 通过rest.InClusterConfig获取当前配置;
  • 通过kubernetes.NewForConfig创建客户端;
  • 通过客户端调用接口;

获取节点数量的样例:

import ("context""fmt"metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1""k8s.io/client-go/kubernetes""k8s.io/client-go/rest"
)func main() {// creates the in-cluster configconfig, err := rest.InClusterConfig()if err != nil {fmt.Println(err)return}// creates the clientclient := kubernetes.NewForConfigOrDie(config)pods, err := client.CoreV1().Pods("").List(context.Background(), metaV1.ListOptions{})if err != nil {fmt.Println(err)} else {fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))}
}

在获取的Pod中包含:

  • ObjectMeta信息:有节点的名称、所属的Namespace、labels、annotations等数据;
  • PodStatus信息:有Pod当前个阶段(Initialized、Ready、ContainersReady、PodScheduled)状态信息,主机地址(外部)、Pod地址(内部)
  • Spec信息:构建时的各种信息(如镜像信息、资源信息、启动参数、环境变量、影射的目录卷);

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...