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