文章目录
- 环境判断
- 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接口(包括认证授权、数据校验以及集群状态变更);
- 模块之间的数据交互和通信的枢纽
- 资源配额控制的入口;
- 拥有完备的集群安全机制;
API访问
Kubernetes提供了多种访问方式。
命令行方式
可通过kubectl命令行访问:
kubectl get --raw /api/v1
kubectl 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 config
config, err := rest.InClusterConfig()
if err != nil {
fmt.Println(err)
return
}
// creates the client
client := 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信息:构建时的各种信息(如镜像信息、资源信息、启动参数、环境变量、影射的目录卷);