client-go组件详解

  1. client类型
  2. informer机制

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核心组件
  1. Reflector
  • 用于监控(Watch)指定的kubernetes资源,当监控的资源发生变化时,触发相应的变更事件,如add、update、delete等,并将其资源对象存入本地缓存DeltaFIFO中,然后Informer会从队列里面取数据。
  1. DeltaFIFO
  • DeltaFIFO可以分开理解,FIFO是一个先进先出的队列,它拥有队列操作的基本方法,例如Add、Update、Delete、List、Pop、Close等,而Delta是一个资源对象存储,它可以保存资源对象的操作类型,例如Added(添加)操作类型、Updated(更新)操作类型、Deleted(删除)操作类型、Sync(同步)操作类型等
  1. Informer
  • controller机制的基础,循环处理object对象,从Reflector取出数据,然后将数据给到Indexer去缓存,提供对象事件的handler接口
  1. indexer
  • 是client-go用来存储资源对象冰紫带索引功能的本地存储,Refelctor从DeltaFIFO消费出来的资源对象存储至indexer。indexer与etcd集群保持一致。client-go可以很方便的从本地存储中读取响应的资源对象数据,而无需每次从etcd读取,以减轻kubernetes apiserver对etcd的压力。
  1. 总结

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{})这三个方法,就可以处理好资源的创建、更新和删除操作。

  1. 图谱
controller 组件
  1. Informer reference
  • controller需要创建合适的Informer才能通过Informer reference操作资源对象
  1. Indexer reference:
  • controller创建Indexer reference然后去利用索引做相关处理
  1. Resource Event Handlers
  • Informer会回调这些handlers
  1. Work queue
  • Resource Event Handlers被回调后将key写到工作队列,这里的key相当于事件通知,后面根据取出事件后,做后续的处理
  1. Process Item
  • 从工作队列中取出key后进行后续处理,具体处理可以通过Indexer reference,controller可以直接创建上述两个引用对象去处理,也可以采用工厂模式,官方都有相关示例
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值