什么是informer机制
Informer机制是kubernetes中不依赖任何中间件的情况下仅通过HTTP协议实现消息的实时性、可靠性、顺序性通信的一种机制。k8s是典型的server-client架构。etcd存储集群的数据信息,apiserver作为统一的操作入口,任何对数据的操作都必须经过apiserver。客户端通过ListAndWatch机制查询apiserver,而informer模块则封装了List-wat
Informer机制是kubernetes中不依赖任何中间件的情况下仅通过HTTP协议实现消息的实时性、可靠性、顺序性通信的一种机制。
k8s是典型的server-client架构。etcd存储集群的数据信息,apiserver作为统一的操作入口,任何对数据的操作都必须经过apiserver。
客户端通过ListAndWatch机制查询apiserver,而informer模块则封装了List-watch。
ListAndwatch是k8s统一的异步消息处理机制,保证了消息的实时性、可靠性、顺序性等,为声明式风格的API奠定了良好的基础,是k8s架构的精髓。
Informer也被称为Shared Informer,它是可以共享使用的。
1. Reflector
Reflector 用于监控(Watch)指定的Kubernetes资源,当监控的资源发生变化时,触发相应的变更事件,例如Added事件,Updated事件,Deleted事件,并将其资源对象存放到本地缓存DeltaFIFO中。
List在Controller重启或Watch中断的情况下,调用资源的list API罗列资源对象以进行全量更新,基于HTTP短链接实现
curl http://127.0.0.1:8080/api/v1/pods
(1)r.listerWatcher.List用于获取资源下的所有对象的数据,例如,获取所有Pod的资源数据。获取资源数据是由options的ResourceVersion控制的。如果ResourceVersion为0,则表示获取所有Pod的资源数据;如果ResourceVersion非0,则表示根据资源版本号继续获取。
(2)listMetaInterface.GetResourceVersion用于获取资源版本号。
(3)meta.ExtractList用于将资源数据(runtime.Object对象)转换成资源对象列表([]runtime.Object对象)。
因为r.listerWatcher.List获取的是资源下的所有对象的数据,例如所有的Pod资源数据,所以它是一个资源列表。
(4)r.syncWith用于将资源对象列表中的资源对象和资源版本号存储至DeltaFIFO中,并会替换已存在的对象。
(5)r.setLastSyncResourceVersion用于设置最新的资源版本号。
Watch则在多次List之间进行,调用资源的watch API,基于当前的资源版本号监听资源变更(如Added、Updated、Deleted)事件。
通过在Http请求中带上watch=true,表示采用Http长连接持续监听apiserver发来的资源变更事件。
curl http://127.0.0.1:8080/api/v1/watch/pods?watch=true
apiserver在response的HTTP Header中设置Transfer-Encoding的值为chunked,表示采用分块传输编码。每当有事件来临,返回一个WatchEvent。
2. DeltaFIFO
DeltaFIFO可以分开理解,FIFO是一个先进先出的队列,它拥有队列操作的基本方法,例如Add、Update、Delete、List、Pop、Close等,而Delta是一个资源对象存储,它可以保存资源对象的操作类型,例如Added操作类型、Updated操作类型、Deleted操作类型、Sync操作类型等。
DeltaFIFO与其他队列最大的不同之处是,它会保留所有关于资源对象的操作类型,队列中会存在拥有不同操作类型的同一个资源对象,消费者在处理该资源对象时能够了解该资源对象所发生的事情。queue字段存储资源对象的key,item字段通过map数据结构的方式存储,value存储的是对象的Delta数组。
DeltaFIFO本质上是一个先进先出的队列,有数据的生产者和消费者,其中生产者是Reflector调用Add方法,消费者是Controller调用的Pop方法。
3. Indexer
Indexer是client-go用来存储资源对象并自带索引功能的本地存储,Reflector从DeltaFIFO中将消费出来的资源对象存储至Indexer。Indexer与Etcd集群中的数据完全保持一致。client-go可以很方便地从本地存储中读取相应的资源对象数据,而无需每次从远程Etcd集群中读取,以减轻Kubernetes API Server和Etcd集群的压力。
更多推荐
所有评论(0)