Kubernetes informer controller 原理笔记
整理了一张思维导图,比较乱:
我主要关注的是数据流(从 K8s client 获取数据到分发到自定义的 handler):
- controller Run 时:
- ListAndWatch
- List 从 K8s 中强制同步,并根据获取到的数据覆盖 Queue 中的数据
- Watch 监听数据的
Add
Modified
Delete
,然后Add
Update
Delete
对象到 Queue 中
- ProcessLoop
- 从 Queue 中 Pop 数据
- 对取出来的数据执行 process 函数,他是个 callback 函数,实际执行的是
HandleDeltas
(在 sharedIndexInformerRun
中绑定)
- ListAndWatch
- HandlerDeltas 处理流程:
- 判断事件类型(在 controller Run 中不区分数据类型),Sync、Added、Updated、Deleted
- 封装成各种
Notification
,将数据发送给:listener.add(obj)
- listener 封装了用户自定义的
AddEventer
UpdateEventer
DeleteEventer
等回调函数,干事情的是下面两个函数:pop
干了两件事情- 在 HandlerDeltas 中添加的数据会放到
addCh
管道中,阻塞的从addCh
中取数据,然后将数据添加到RingGrowing
中> =WriteOne
,并将数据给了nextCh
- 从
RingGrowing
中取一个数据删除ReadOne
- 在 HandlerDeltas 中添加的数据会放到
run
就比较简单了,等待nextCh
中的数据,然后回掉之前用户自己注册的AddEventer=、=UpdateEventer=、=DeleteEventer
这里一共有两个队列:
- 从 K8s 中获取到的数据,缓存在 Queue 中,内容不区分类型的
- listener 中的
RingGrowing
,订阅前一个 Queue 中的数据,内容被封装成了各种Notification
理解了两个队列之后,就好理解 WaitForCacheSync
函数,他阻塞到 Cache 同步完成,那么完成的标准是什么呢?
ListAndWatcher 中 List 成功之后,会替换掉 Queue 中的所有数据,首次的所有数据全部分发给 listener 中的
RingGrowing
队列,分发完成则认为是同步完成。
扩展: