Client-go 客户端 使用
简介
Client-Go 共提供了 4 种与 Kubernetes APIServer 交互的客户端。分别是 RESTClient、DiscoveryClient、ClientSet、DynamicClient。
- RESTClient:最基础的客户端,主要是对 HTTP 请求进行了封装,支持 Json 和 Protobuf 格式的数据。
- DiscoveryClient:发现客户端,负责发现 APIServer 支持的资源组、资源版本和资源信息的。
- ClientSet:负责操作 Kubernetes 内置的资源对象,例如:Pod、Service等。
- DynamicClient:动态客户端,可以对任意的 Kubernetes 资源对象进行通用操作,包括 CRD。
RESTClient
上图可以看出 RESTClient 是所有 Client 的父类
它就是对 HTTP Request 进行了封装,实现了 RESTFul 风格的 API,可以直接通过 RESTClient 提供的 RESTful 方法 GET(),PUT(),POST(),DELETE() 操作数据
- 同时支持 json 和 protobuf
- 支持所有原生资源和 CRD
示例
使用 RESTClient 获取 k8s 集群 pod 资源
|
|
程序结果如下:
|
|
RESTClient 原理
初始化 RESTClient,可以发现对原生 HTTP 库进行了封装了
|
|
RESTClient 实现了 Interface 接口
|
|
RESTClient 的链式调用主要是设置 namespace,资源 name,一些选择器等,最终调用 Do() 方法网络调用
|
|
ClientSet
ClientSet 在调用 Kubernetes 内置资源非常常用,但是无法操作自定义资源(需要实现自定义资源的 ClientSet 才能操作)。
ClientSet 是在 RESTClient 的基础上封装了对 Resource 和 Version 的管理方法,Client-go 对 Kubernetes 每一个内置资源都封装了 Client,而 ClientSet 就是多个 Client 的集合。
示例
使用 ClientSet 获取 k8s 集群 pod 资源
|
|
ClientSet 原理
NewForConfig 获取 ClientSet
|
|
NewForConfigAndClient 获取每个 groupVersion 下的资源 Client
|
|
拿 admissionregistrationv1.NewForConfigAndClient 介绍
|
|
pod 资源实现了一系列方法,比如 List(),可以发现最终调用 RESTClient 的方法
|
|
DynamicClient
DynamicClient 见名之义,是一种动态客户端,通过动态指定资源组,资源版本和资源信息,来操作任意的 Kubernetes 资源对象。DynamicClient 不仅能操作 Kubernetes 内置资源,还能操作 CRD 。
DynamicClient 与 ClientSet 都是对 RESTClient 进行了封装
示例
DynamicClient 返回的结果不像 ClientSet 那样返回具体资源类型,它返回的是一个动态数据即 map 结构,所以需要将结果进行解析到具体资源类型
|
|
DynamicClient 原理
dynamic.NewForConfig(config) 初始化 dynamicClient
|
|
可以看出 dynamicClient 与 ClientSet 一样都是封装了 RESTClient
dynamicClient.Resource(gvr).Namespace(“kube-system”).List(context.TODO(), metav1.ListOptions{})
dynamicClient 链式调用中,Resource() 需要传入需要操作对象的 gvr
最终也是调用 RESTClient 来获取数据
|
|
DynamicClient 返回的结果是 *unstructured.UnstructuredList
Unstructured 是非结构化数据,用 map[string]interface{} 存储。
|
|
所以拿到结果需要 decode 成结构化数据类型
|
|
DiscoveryClient
DiscoveryClient 是发现客户端,用于发现 Kube-apiserver 支持的资源组、资源版本、资源类型等。
kubectl api-resources 和 kubectl api-versions 命令就是通过 DiscoveryClient 实现的。
DiscoveryClient 支持本地目录缓存,一般在 ~/.kube/cache 会存储集群所有 gvr 信息,避免每次访问 kube-apiserver
示例
通过 DiscoveryClient 查询集群所有的 gvr
|
|
结果如下:
|
|
DiscoveryClient 原理
discovery.NewDiscoveryClientForConfig(config) 初始化 DsicoveryClient,与 ClientSet 和 DynamicClient 原理类似,都是封装了 RESTClient,这里不再赘述。
discoveryClient.ServerGroupsAndResources() 返回集群所有的资源对象,这里可能会有疑问,这些资源是什么时候存储到 etcd 中的,猜想是 kube-apiserver 启动时将这些资源类型存储到 etcd 中。,需要看 kube-apiserver 来佐证。
总结
Client-go 四种客户端,在平时开发中 ClientSet 使用频率最高,其他三种了解原理一般就行。