client类型
1.RestClient:最基础的,相当于底层数据结构,可以通过RestClient提供的RestFul方法,如Get(),Put(),Post(),Delete(),进行交互
- 同时支持json和protobuf
- 支持所有的原生资源和CRDs
- 但是一般而言,为了更为优雅的处理,需要进一步封装RestCLient为ClientSet,然后对外提供接口和服务
2.CleintSet:是调用kubernetes资源对象最常用的client,可以操作所有的内置资源对象,基于RestClient实现
- 访问资源时,需要执行G/v/r
- 优雅的方式是利用一个controller,再加上一个informer
- 只支持处理k8s内置资源(不包括CRDs)
3.DynamicClient:是一种动态的client,能处理k8s所有的资源,返回的是map[string]interface{}
- 如果一个controller中需要控制所有的API,可以使用DynamicClient,目前它在 garbage collector 和 namespace controller 中被使用。
- 只支持json
- 支持处理CRDs资源
4.DiscoveryClient:发现客户端,用于发现kube-apiserver支持的所有资源组、资源版本、资源信息(即Group、Versions、Resources)
- kubectl api-resources
- kubectl api-versions
informer机制
informer在kubernetes系统中,保证各个组件之间消息的实时性、可靠性、顺序性等。k8s各组件通过client-go的informer机制与k8s apiserver通信。
client-go核心组件
- Reflector
- 用于监控(Watch)指定的kubernetes资源,当监控的资源发生变化时,触发相应的变更事件,如add、update、delete等,并将其资源对象存入本地缓存DeltaFIFO中,然后Informer会从队列里面取数据。
- DeltaFIFO
- DeltaFIFO可以分开理解,FIFO是一个先进先出的队列,它拥有队列操作的基本方法,例如Add、Update、Delete、List、Pop、Close等,而Delta是一个资源对象存储,它可以保存资源对象的操作类型,例如Added(添加)操作类型、Updated(更新)操作类型、Deleted(删除)操作类型、Sync(同步)操作类型等
- Informer
- controller机制的基础,循环处理object对象,从Reflector取出数据,然后将数据给到Indexer去缓存,提供对象事件的handler接口
- indexer
- 是client-go用来存储资源对象冰紫带索引功能的本地存储,Refelctor从DeltaFIFO消费出来的资源对象存储至indexer。indexer与etcd集群保持一致。client-go可以很方便的从本地存储中读取响应的资源对象数据,而无需每次从etcd读取,以减轻kubernetes apiserver对etcd的压力。
- 总结
Informer 是 client-go 中较为高级的类型。无论是 Kubernetes 内置的还是自己实现的 Controller,都会用到它。
Informer 设计为 List/Watch 的方式。Informer 在初始化的时先通过 List 从 Kubernetes 中取出资源的全部对象,并同时缓存,然后后面通过 Watch 的机制去监控资源,这样的话,通过 Informer 及其缓存,我们就可以直接和 Informer 交互而不是每次都和 Kubernetes 交互。
Informer 另外一块内容在于提供了事件 Handler 机制,并会触发回调,这样上层应用如 Controller 就可以基于回调处理具体业务逻辑。
因为Informer 通过 List、Watch 机制可以监控到所有资源的所有事件,因此只要给 Informer 添加 ResourceEventHandler 实例的回调函数实例取实现 OnAdd(obj interface{}) OnUpdate(oldObj, newObj interface{}) 和 OnDelete(obj interface{})这三个方法,就可以处理好资源的创建、更新和删除操作。
controller 组件
- Informer reference
- controller需要创建合适的Informer才能通过Informer reference操作资源对象
- Indexer reference:
- controller创建Indexer reference然后去利用索引做相关处理
- Resource Event Handlers
- Informer会回调这些handlers
- Work queue
- Resource Event Handlers被回调后将key写到工作队列,这里的key相当于事件通知,后面根据取出事件后,做后续的处理
- Process Item
- 从工作队列中取出key后进行后续处理,具体处理可以通过Indexer reference,controller可以直接创建上述两个引用对象去处理,也可以采用工厂模式,官方都有相关示例