聚焦目标
了解Informer在发现资源变化后,是怎么处理的
目录
Process
1 | func (c *controller) processLoop() { |
Index
Index
的定义为资源的本地存储,保持与etcd中的资源信息一致。
1 | // 我们去看看Index是怎么创建的 |
distribute
1 | // 在上面的Process代码中,我们看到了将数据存储到Indexer后,调用了一个分发的函数 |
Summary
Informer
依赖于Reflector
模块,它有个组件为 xxxInformer,如podInformer
- 具体资源的
Informer
包含了一个连接到kube-apiserver
的client
,通过List
和Watch
接口查询资源变更情况 - 检测到资源发生变化后,通过
Controller
将数据放入队列DeltaFIFOQueue
里,生产阶段完成 - 在
DeltaFIFOQueue
的另一端,有消费者在不停地处理资源变化的事件,处理逻辑主要分2步- 将数据保存到本地存储Indexer,它的底层实现是一个并发安全的threadSafeMap
- 有些组件需要实时关注资源变化,会实时监听listen,就将事件分发到对应注册上来的listener上,自行处理
Github: https://github.com/Junedayday/code_reading
Blog: http://junes.tech/
Bilibili:https://space.bilibili.com/293775192
公众号:golangcoding