client-go 编程式交互 熟练使用并掌握client-go是每个Kubernetes开发者必备的技术
首次选第五章节开始是基于‘Kubernetes 源码研习社’的活动参与进行,《Kubernetes 源码剖析》:第五章——Client Go章节本章主要阐述 client-go 编程式交互式工具的实现机制,本章节涉及 Kubernetes 开发者常用的多种 Client ,例如: RESTClient、ClientSet、DynamicClient、DiscoveryClient。详细剖析其内部运行机制,例如:Informer机制、DeltaFIFO队列、Indexer索引机制等等。开发者常使用 client-go 基于 Kubernetes 做二次开发。所以 client-go 是开发者熟练并掌握的必备技能。
client-go源码结构 1.如何查看源码的结构
#路径
cd kubernetes/vendor/k8s.io
#cloc代码统计工具统计
[root@building-kubernetes k8s.io]# cloc client-go/
Digest::MD5 not installed; will skip file uniqueness checks.
1244 text files.
1243 unique files.
28 files ignored.
/AlDanial/cloc v 1.86 T=0.98 s (1245.3 files/s, 129358.9 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
Go 963 16456 22422 76075
Bazel 238 905 0 9250
JSON 1 0 0 650
Markdown 11 133 0 349
Starlark 1 1 19 18
Bourne Shell 1 2 13 3
Dockerfile 1 1 13 3
-------------------------------------------------------------------------------
SUM: 1216 17498 22467 86348
-------------------------------------------------------------------------------
*** cloc统计显示kubernetes 1.14中client-go拥有8.6万行代码,其中Go语言代码占7.6万行***
2.代码目录结构说明
[root@building-kubernetes client-go]# tree -L 1
.
├── BUILD
├──
├── CONTRIBUTING.md
├── deprecated-dynamic
├── discovery #DiscoveryClient(用于资源发现)
├── dynamic #DynamicClient(非结构化的数据获取资源)
├── examples #几个使用的小例子
├── Godeps
├── informers #informer相关
├──
├── kubernetes #ClientSet(最重要的client)
├── kubernetes_test
├── LICENSE
├── listers #Lister相关(Get, List方法)
├── OWNERS
├── pkg
├── plugin #插件相关
├── rest #RESTClient最底层的client,其他client基于它)
├── restmapper
├── scale #ScaleClient、用于扩容或缩容
├── SECURITY_CONTACTS
├── testing
├── third_party
├── tools #提供常用工具类
├── transport #传输层相关
└── util #常用方法
19 directories, 7 files

Client客户端对象

RESTClient是最基础的客户端。RESTClient对HTTP Request进行了封装,实现了RESTful风格的API。ClientSet、DynamicClient及DiscoveryClient客户端都是基于RESTClient实现的。
ClientSet在RESTClient的基础上封装了对Resource和Version的管理方案。每一个Resource可以理解为一个客户端,而ClientSet则是多个客户端的集合,每一个Resource和Version都以函数的方式暴露给开发者。ClientSet只能够处理Kubernetes内置资源,它是通过client-gen代码生成器自动生成的。 DynamicClient与ClientSet最大的不同之处是,ClientSet仅能访问Kubernetes自带的资源(即Client集合内的资源),不能直接访问CRD自定义资源。DynamicClient能够处理Kubernetes中的所有资源对象,包括Kubernetes内置资源与CRD自定义资源 DiscoveryClient发现客户端,用于发现kube-apiserver所支持的资源组、资源版本、资源信息(即Group、Version、Resources) 以上4种客户端都可以通过kubeconfig配置信息连接到指定到Kubernetes API Server。
1.Kubeconfig配置管理 kubeconfig用于管理访问kube-apiserver的配置信息,支持多集群的配置管理,不同环境下管理不同kube-apiserver集群配置。kubernetes的其他组件都是用kubeconfig配置信息来连接kube-apiserver组件。kubeconfig存储了集群、用户、命名空间和身份验证等信息,默认kubeconfig存放在$HOME/.kube/config路径下。kubeconfig的配置信息如下:
cat $HOME/.kube/config
apiVersion: v1
kind: Config
preferences: {}
clusters: #定义kubernetes集群信息
- cluster:
name: my-cluster
users: #定义kubernetes集群用户身份验证的客户端凭据
- name: shl
contexts: #定义kuberntes集群用户信息和命名空间等
- context:
name: kubernetes
2.RESTClient客户端 RESTClient是最基础的客户端,其他的ClientSet、DynamicClient及DiscoveryClient都是基于RESTClient实现的。RESTClient对HTTP Request进行了封装,实现了RESTful风格的API。
@源码分析如何运作 3.ClientSet 客户端 ClientSet相比而言使用更加便捷,一般情况,对Kubernetes进行二次开发时通常使用ClientSet。 ClientSet在RESTClient的基础上封装了对Resource和Version的管理方法,每个Resource可以理解为一个客户端,而ClientSet则是多个客户端的集合,每个Resource和Version都以函数的方式暴露给开发者。
注意:ClientSet仅能访问Kubernetes自身的内置资源,不能直接访问CRD自定义资源;如果需要使用ClientSet访问CRD,则需要通过client-gen代码生成器重新生成ClientSet;DynamicClient可以访问CRD资源
@源码分析如何运作 4.DynamicClient客户端 DynamicClient客户端是一种动态客户端,可以对任意的Kubernetes资源进行RESTful操作,包括CRD资源。 DynamicClient内部实现了Unstructured,用于处理非结构化数据结构(即无法提前预知的数据结构),这也是DynamicClient能够处理CRD资源的关键。
DynamicClient不是类型安全的,因此在访问CRD自定义资源是要注意,例如,在操作不当时可能会导致程序崩溃。 DynamicClient的处理过程是将Resource(如PodList)转换成Unstructured结构类型,Kubernetes的所有Resource都可以转换为该结构类型。处理完后再将Unstructured转换成PodList。过程类似于Go语言的interface{}断言转换过程。另外,Unstructured结构类型是通过map[string]interface{}转换的。
@源码分析如何运作 5.DiscoveryClient客户端 DiscoveryClient是发现客户端,主要用于发现Kubenetes API Server所支持的资源组、资源版本、资源信息。 kubectl的api-versions和api-resources命令输出也是通过DiscoveryClient实现的。其同样是在RESTClient的基础上进行的封装。DiscoveryClient还可以将资源组、资源版本、资源信息等存储在本地,用于本地缓存,减轻对kubernetes api sever的访问压力,缓存信息默认存储在:/.kube/cache和/.kube/http-cache下。
@源码分析如何运作 6.配套Examples 的使用
[root@building-kubernetes examples]# tree -L 1
.
├── create-update-delete-deployment#获取pod列表和获取指定pod的信息来证明client创建成功
├── fake-client #构造一个假的集群来做单元测试
├── in-cluster-client-configuration #使用文件~/.kube/config获取连接Kubernetes凭证(获取client实例)
├── out-of-cluster-client-configuration #使用client-go编写程序来操作Kubernetes(获取client实例)
├── README.md
└── workqueue #client-go项目实现的一个队列
5 directories, 1 file