跳到主要内容

Client-go 源码结构及 kubeconfig 配置管理对象

· 阅读需 4 分钟

Client-go 源码结构及 kubeconfig 配置管理对象

Github: https://github.com/kubernetes/client-go

目录结构:

目录结构含义
.githubpull请求的模版
applyconfigurationsapplyconfigurations 提供了⽤于构造服务器端应⽤请求的应⽤配置的类型安全的 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 配置信息如下:

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 个部分,分别介绍如下。

  • clusters :定义 Kubernetes 集群信息,例如 kube-apiserver 的服务地址及集群的证书信息等。

  • users :定义 Kubernetes 集群⽤户⾝份验证的客户端凭据,例如 client-certificate、client-key、token 及 username/password 等。

  • contexts :定义 Kubernetes 集群⽤户信息和命名空间等,⽤于将请求发送到指定的集群。 client-go 会读取 kubeconfig 配置信息并⽣成 config 对象,⽤于与 kube-apiserver 通信,代码⽰例如下:

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

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

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

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}}