0%

Client-Go笔记

Client-go简介

Client-go是负责与Kubernetes APIServer服务进行交互的客户资源,利用Client-go与Kubernetes APIServer进行交互访问,以此来对Kubernetes中的各类资源对象进行管理操作,包括内置的资源对象及CRD。

Client-Go不仅被Kubernetes项目本身使用,其它围绕着Kubernetes的生态,也被大量的使用,例如:kubectl,ETCD-operator等等。

Client-go客户端对象

Client-go共提供了4种与Kubernetes APIServer交互的客户端对象。分别是RESTClient、DiscoverClient、ClientSet、DynamicClient。

RESTClient:最基础的客户端,主要是对HTTP请求进行了封装,支持Json和Protobuf格式的数据。

DiscoveryClient:发现客户端。负责发现APIServer支持的资源组、资源版本和资源信息。

~#: kubectl api-resources

ClientSet:负责操作Kuernetes内置的资源对象。例如:Pod、Service等。

DynamicClient:动态客户端,可以对任意的Kubernetes资源进行通用操作,包括CRD。

RESTClient

RESTClient是所有客户端的父类,他是最基础的客户端。

他提供了RESTful对应的方法的封装,如:GET()、Put()、Post()、Delete()等。通过这些封装的方法与Kubernetes APIServer进行交互。

因为它是所有客户端的父类,所以它可以操作kubernetes内置的所有资源对象以及CRD。

准备需要:

1.k8s的配置文件

在 ~/.kube/config文件中

2.保证你的开发机能通过这个配置文件连接到k8s集群

书写:

1.加载配置文件,生成config对象

1.加载

2.配置api路径

如:config.APIPath = “api” // pods, /api/v1/pods

或 config.APIPath = “api” //developments, /apis/apps/v1/namespace/{namespace}/developments/{development}

3.配置分配版本

需要pod,核心资源组

分无名和有名资源组

4.配置数据的编解码工具

5.实例化RESTClient对象

6.定义接受返回值的变量

7.与APIServer交互

GET请求方式

指定命名空间

指定需要查询的资源,传递资源名称

参数及参数的序列化工具

触发请求

写入返回结果

GET,定义请求方式,返回了一个Request结构体对象,这个Request结构体对象,就是构建访问APIServer请求用的,依次执行了Namespace,Resource,VersionedParams,构建与APIServer交互的参数。Do方法通过request发起请求,然后通过transformResponse解析请求返回,并绑定到对应资源对象的结构体对象上,同时,request方法先是检查了是否有可用的Client,在这里开始使用net/http包的功能。

ClientSet

相对上面更加优雅

ClientSet是基于RESTClient的封装,同时ClientSet是使用预生成的API对象与APIServer进行交互的,这样做更方便我们进行二次开发。

ClientSet是一组资源对象对客户端的集合,例如负责操作Pods、Service等资源的CoreV1Client等。通过这些资源对象客户端提供的操作方法,即可对Kubernetes内置的资源对象进行Create、Update、Get、List、Delete等操作。

书写

1.加载配置文件

2.实例化(相对之前省去很多过程)

ClientSet与API交互过程

返回CoreV1Client实例

指定查询的资源以及指定资源的namespace,namespace如果为空,则表示查询所有的namespace

查询pod列表

CoreV1返回了CoreV1Client实例对象

Pods调用了newPods函数,该函数返回的是PodInterface对象,PodInterface对象实现了Pods资源相关的全部方案,同时在newPods里面还将RESTclient实例对象赋值给了对应的Client属性。

List内使用RestClient与K8S APIServer进行了交互。

DynamicClient(动态客户端)

DynamicClient是一种动态客户端,通过动态指定资源组、资源版本和资源等信息,来操作任意的Kubernetes资源对象的一种客户端,即不仅仅通过操作Kubernetes内置的资源对象还可以操作CRD这这也是与ClientSet最明显的一个区别。

使用ClientSet的时候,程序会将所用的版本与类型紧密耦合,而DynamicClient使用嵌套的map(string)interface{}结构存储Kubernetes APIServer的返回值,使用反射机制,在运行的时候,进行数据绑定,这种方式更加灵活,但是却无法获取强数据类型的检查和验证。

补充:

1.Object.runtime接口和Unstructed结构体。

Object.runtime:kubernetes中的所有资源对象,都实现了这个接口·,其中包含DeepCopyObject和GetObjectKind的方法,分别用于对象深拷贝和获取对象的具体资源类型。

Unstructed:包含map(string)interface{}类型字段,在处理无法预知结构的数据时,将数据值存入interface{}中,待运行时利用反射判断。该结构体提供了大量的工具方法,便于处理非结构化的数据。

书写:

1.加载配置文件生成config对象

2.实例化客户端对象,这里是实例化动态客户端对象

3.配置我们需要用的GVR

4.发送请求,且得到返回结果

三种客户端对象都是针对资源对象管理的。而DiscoverClient则是针对GVR的,用于查看当前Kubertnetes集群支持哪些资源组、资源版本、资源信息。

将GVR数据缓存到本地

GVR数据其实是很少·1变动的,因此我们可以将GVR数据缓存在本地,减少Client与APIServer交互,减少网络损耗。

在discoverery/cached中,有另外两个客户端是来实现将GVR数据缓存到本地文件和内存中的,分别是CachedDiscoveryClient和memCacheClient。

其实,我们平时管理的k8s的集群的kubectl命令也是使用这样的方式来使用我们的GVR与APIServer交互的。它的缓存文件默认是在~/.kube/cache中的。

Informer

Informer负责与Kubernetes APIServer进行Watch操作,Watch的资源,可以是Kubernetes内置资源对象,也可以是CRD。

Informer是一个带有本地缓存以及索引机制的核心工具包,当请求数据为查询操作时,会优先从本地缓存去查找数据,而创新、更新、删除,这类的操作则会根据事件通知写到deltaFIFO中,同时对对应的事件处理过后,更新本地缓存,使本地缓存与ETCD的数据保持一致。

Informer抽象出来的这个缓存器,将查询相关操作的压力接收下来,这样就不必每次都调用APIServer的接口,减轻了APIServer的数据交互压力。

书写:

1.加载配置文件,生成config对象

2.实例化Informer对象

3.定义接受返回值的变量

4.与APIServer交互

5.写入返回结果

监听资源对象

1.定义接受返回值的变量

2.与APIServer交互

3.写入返回结果

书写控制器

replicaset controller

例子ReplivaSet控制器负责保证有desire number of pods来match所规定的selector

如果match selector的pod少于所预期,则增加pod

反之,减少pod