1. Client-go介绍
client-go
是kubernetes
官方提供的go语言的客户端库,go应用使用该库可以访问kubernetes
的API Server
,这样我们就能通过编程来对kubernetes
资源进行增删改查操作。- 除了提供丰富的
API
用于操作kubernetes
资源,client-go
还为controller
和operator
提供了重要支持,如下图,client-go
的informer
机制可以将controller
关注的资源变化及时带给此controller
,使controller
能够及时响应变化:
架构图:
2. Client-go代码结构
$ tree -L 2 client-go
client-go
├── discovery # 包含dicoveryClient,用于发现k8s所支持GVR(Group/Version,/Resource),'kubectl api-resources'命令正是使用它来列出cluster中的各种资源。
├── dynamic # 包含dynamicClient,它封装了 RESTClient,可以动态的指定api资源的GVR,结合unstructured.Unstructured类型来访问各种类型的k8s资源(如: Pod,Deploy...),也可以访问用户自定义资源(CRD)。
├── informers # 为了减少client对于apiserver的频繁访问,需要informer来缓存apiserver中资源,只有当api资源对象发生变化的时候才收到通知。每种api资源会有自己的informer实现,也是按照api分组与版本来区分。
├── kubernetes # 主要定义ClientSet,它也对restClient进行了封装,并且包含对各种k8s资源和版本的管理方法。每个api资源有单独的client,而ClientSet则是多个客户端的集合。ClientSet以及每种k8s内置资源的client的所有请求最终还是由restClient发出的;在typed目录包括具体每种k8s内置资源的client实现,也是按照api分组与版本来区分。
│ ├── clientset.go
│ └── typed
├── listers # 包含各种k8s内置资源的只读客户端。每种lister都有Get()和List()方法,并且结果都是从缓存中读取的。
├── rest # 包含真正给apiserver发请求的client,实现了Restful的API,同时支持Protobuf和JSON格式数据。
├── scale # 只要包含scalClient用于Deploy, RS等的扩/缩容。
├── tools # 各种类型的工具包,常见的比如获取kubeconfig的方法,以SharedInformer、Reflector、DealtFIFO和Indexer等工具,这些工具主要用于实现client查询和缓存机制,减轻apiserver的负载等。
$ tree -L 2 client-go
client-go
├── discovery # 包含dicoveryClient,用于发现k8s所支持GVR(Group/Version,/Resource),'kubectl api-resources'命令正是使用它来列出cluster中的各种资源。
├── dynamic # 包含dynamicClient,它封装了 RESTClient,可以动态的指定api资源的GVR,结合unstructured.Unstructured类型来访问各种类型的k8s资源(如: Pod,Deploy...),也可以访问用户自定义资源(CRD)。
├── informers # 为了减少client对于apiserver的频繁访问,需要informer来缓存apiserver中资源,只有当api资源对象发生变化的时候才收到通知。每种api资源会有自己的informer实现,也是按照api分组与版本来区分。
├── kubernetes # 主要定义ClientSet,它也对restClient进行了封装,并且包含对各种k8s资源和版本的管理方法。每个api资源有单独的client,而ClientSet则是多个客户端的集合。ClientSet以及每种k8s内置资源的client的所有请求最终还是由restClient发出的;在typed目录包括具体每种k8s内置资源的client实现,也是按照api分组与版本来区分。
│ ├── clientset.go
│ └── typed
├── listers # 包含各种k8s内置资源的只读客户端。每种lister都有Get()和List()方法,并且结果都是从缓存中读取的。
├── rest # 包含真正给apiserver发请求的client,实现了Restful的API,同时支持Protobuf和JSON格式数据。
├── scale # 只要包含scalClient用于Deploy, RS等的扩/缩容。
├── tools # 各种类型的工具包,常见的比如获取kubeconfig的方法,以SharedInformer、Reflector、DealtFIFO和Indexer等工具,这些工具主要用于实现client查询和缓存机制,减轻apiserver的负载等。
3. Client-go版本
client-go官方提供了多个版本,并且给出了和kubernetes版本的匹配列表,具体访问官方 github 查看
4. Client-go客户端对象
Client-go 提供了以下四种客户端对象与kubernetes的API Server进行交互
4.1 RESTClient
这是最基础的客户端对象,仅对HTTPRequest进行了封装,实现RESTFul风格API,这个对象的使用并不方便,因为很多参数都要使用者来设置,于是client-go基于RESTClient又实现了三种新的客户端对象
4.2 ClientSet
把Resource和Version也封装成方法了,用起来更简单直接,一个资源是一个客户端,多个资源就对应了多个客户端,所以ClientSet就是多个客户端的集合了,这样就好理解了,不过ClientSet只能访问内置资源,访问不了自定义资源。
4.3 DynamicClient
可以访问内置资源和自定义资源,拿出的内容是Object类型,按实际情况自己去做强制转换,当然了也会有强转失败的风险。
4.4 DiscoveryClient
用于发现kubernetes的API Server支持的Group、Version、Resources等信息
4.5 各模块的依赖关系
从上面可以看到,不管是各种静态类型的客户端 ClientSet
,动态客户端 DynamicClient
还是资源发现客户端 DiscoveryClient
都封装了 RESTClient
,也就是说最后请求的发送都是有 RESTClient
发送给 kube-apiserver
的。而 k8s.io/api-machinery
中 API
资源的分组与版本是所有类型客户端的基础,具体每种 API
资源的定义则是包含在 k8s.io/api
模块