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
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1 
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3... - context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users: - name: kubernetes-admin
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURJVENDQWdtZ0F3SUJBZ...
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBL1VB...

kubeconfig 配置信息通常包含 3 个部分,分别介绍如下。

1
2
3
4
5
6
7
8
9
package main 
import ( "
k8s.io/client-go/tools/clientcmd"
)
func main() {
config, err := clientcmd.BuildConfigFromFlags("", "/root/.kube/config")
if err != nil {
panic (err)
...

在上述代码中, 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-clusterpig-cluster ,经过合并后,最终得到⼀份多集群的配置信息

vendor/k8s.io/client-go/tools/clientcmd/loader.go

1
2
3
//由于值会被覆盖,但映射值不会被覆盖,所以我们可以将⾮映射配置合并到映射配置之上,并获得我们所期望的值。 config := clientcmdapi.NewConfig()
mergo.Merge(config, mapConfig, mergo.WithOverride)
mergo.Merge(config, nonMapConfig, mergo.WithOverride)

mergo.MergeWithOverwrite 函数将 src 字段填充到 dst 结构中,私有字段除外,⾮空的 dst 字段将被覆盖。另外, dstsrc 必须拥 有有效的相同类型结构。合并过程举例如下:

1
2
3
4
src 结构: T {X: "two", Z: Z{A: "three", B: 4}} 
dst 结构: T {X: "One", Y:5, Z{A: "four", B: 6}}

merge后的结构: T {X: "two", Y:5, Z{A: "three", B: 4}}