K8S源码分析Controller Manager - 2、SharedInformer结构

绝大多数Controller的实现都依赖一种特殊结构-SharedInformer,它主要负责订阅etcd上资源的变更并调用注册的Handlers。

SharedInformer相关的类结构如下图:

SharedInformer是一个复杂的嵌套结构,自底向上总共包含四层

Queue

DeltaFIFO结构实现了Queue(以及Store)接口,在内部使用一个叫做items的map来存储Delta数据。items的key是通过一个预先传入的keyFunc对每个入队的object计算出来的。

基于map的存储结构能够使得DeltaFIFO快速检索到任意一个内部元素(这也是为了实现Store接口),同时queue存储了元素的进入顺序。

Reflector

Reflector结构能够通过listWatcher监控etcd上的变更,实时同步到本地的store结构中。

Controller

Controller初始化了一个DeltaFIFO结构,并将它作为store创建了一个Reflector结构,用来监控特定的etcd资源的变更。listWatcher观察到的变更会被存储到DeltaFIFO中,同时Controller会不断消费DeltaFIFO中的元素,将它作为入参call构造时传入的Process Func。

sharedIndexInformer

sharedIndexInformer实现了SharedInformer接口,它用自己的HandleDeltas()方法作为Process Func来构造Controller。Controller检测到的所有资源变更都会回调sharedIndexInformer.HandleDeltas()。

indexer是一种cache结构,它存储了监控资源的最新数据。当Controller接收到变更的时候,可以通过indexer来获取变更数据在变更前的值。

sharedProcessor用来存储所有注册的Listener。当HandleDeltas被回调时,会触发sharedProcessor上的distribute()方法,来最终调用所有注册的Listeners。

 

通过以上四种数据结构的配合使用,最终实现了从资源监控到Listener回调的整个数据链路。

转载于:https://my.oschina.net/zhuhui/blog/3080846

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值