在使用API时,需要先判断是否是K8S环境。
通过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/")
}
通过API接口rest.InClusterConfig()可检测是否在K8S中;更方便的方式是,直接通过环境变量检测:
func IsK8s() bool {host := os.Getenv("KUBERNETES_SERVICE_HOST")return len(host) != 0
}
获取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}
}
Kubernetes API Server提供了Kubernetes各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中心。
Kubernetes API Server提供的功能:

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中包含: