Client-go 源码结构及 kubeconfig 配置管理对象
Github: https://github.com/kubernetes/client-go
目录结构:
目录结构 | 含义 |
---|---|
.github | pull请求的模版 |
applyconfigurations | applyconfigurations 提供了⽤于构造服务器端应⽤请求的应⽤配置的类型安全的 go |
discovery | 提供DiscoveryClient发现客户端 |
dynamic | 提供DynamicClient动态客户端 |
examples | 此⽬录包含涵盖 client-go 的各种⽤例和功能的⽰例。 |
informers | 每种kubernetes资源的informer实现 |
kubernetes | 提供ClientSet客户端 |
kubernetes_test | 提供ClientSet客户端的测试 |
listers | 为每⼀个kubernetes资源提供Listers功能,该功能对Get和List请求提供只读的缓存数据 |
metadata | 包含关于client-go的元数据信息 |
pkg | 客户端认证及版本的包 |
plugin/pkg/client/auth | 认证插件包auth |
rest | 提供RestClient客户端,对kubernetes API Server执⾏Rest API操作 |
restmapper | 映射器的⼀些⽅法 |
scale | 提供scaleclient客户端,⽤于扩容和缩容deployment、replicaset、replication controller等资源对象 |
testing | ⼀些测试⽂件 |
third_party/forked/golang | ⼀些第三⽅的库 |
tools | 提供常⽤⼯具,例如sharedinformer、Reflector、DealtFIFO及Indexers。提供Client查询和缓存机制,以减少向kube-apiserv |
transport | 提供安全的TCP连接,⽀持HTTP STREAM,某些操作需要在客户端和容器之间传输⼆进制流,例如exec、attach等操作 |
util | 提供常⽤⽅法,例如workqueue⼯作队列,certificate证书管理等 |
kubeconfig 配置管理对象
kubeconfig ⽤于管理访问 kube-apiserver 的配置信息,同时也⽀持访问多 kube-apiserver 的配置管理,可以在不同的环境下管理不 同的 kube-apiserver 集群配置,不同的业务线也可以拥有不同的集群。 Kubernetes 的其他组件都使⽤ kubeconfig 配置信息来连接 kube-apiserver 组件,例如当 kubectl 访问 kube-apiserver 时,会默认加载 kubeconfig 配置信息。
kubeconfig 中存储了集群、⽤户、命名空间和⾝份验证等信息,在默认的情况下, kubeconfig 存放在 $HOME/.kube/config 路径下。
Kubeconfig
配置信息如下:
1 | apiVersion: v1 |
kubeconfig 配置信息通常包含 3 个部分,分别介绍如下。
clusters :定义 Kubernetes 集群信息,例如 kube-apiserver 的服务地址及集群的证书信息等。
users :定义 Kubernetes 集群⽤户⾝份验证的客户端凭据,例如 client-certificate、client-key、token 及 username/password 等。
contexts :定义 Kubernetes 集群⽤户信息和命名空间等,⽤于将请求发送到指定的集群。 client-go 会读取 kubeconfig 配置信息并⽣成 config 对象,⽤于与 kube-apiserver 通信,代码⽰例如下:
1 | package main |
在上述代码中, clientcmd.BuildConfigFromFlags 函数会读取 kubeconfig 配置信息并实例化 rest.Config 对象。其中 kubeconfig 最核⼼ 的功能是管理多个访问 kube-apiserver 集群的配置信息,将多个配置信息合并( merge )成⼀份,在合并的过程中会解决多个配置 ⽂件字段冲突的问题。
该过程由 Load 函数完成,可分为两步:
第1步,加载 kubeconfig 配置信息;
第2步,合并多个 kubeconfig 配置信息。代码⽰例如下。
一、加载 kubeconfig 配置信息
vendor/k8s.io/client-go/tools/clientcmd/loader.go
⼆、合并多个 kubeconfig 配置信息
有两份 kubeconfig 配置信息,集群分别为 cow-cluster
和 pig-cluster
,经过合并后,最终得到⼀份多集群的配置信息
vendor/k8s.io/client-go/tools/clientcmd/loader.go
1 | //由于值会被覆盖,但映射值不会被覆盖,所以我们可以将⾮映射配置合并到映射配置之上,并获得我们所期望的值。 config := clientcmdapi.NewConfig() |
mergo.MergeWithOverwrite
函数将 src
字段填充到 dst
结构中,私有字段除外,⾮空的 dst
字段将被覆盖。另外, dst
和 src
必须拥 有有效的相同类型结构。合并过程举例如下:
1 | src 结构: T {X: "two", Z: Z{A: "three", B: 4}} |