Kubernetes 源码解析 - Informer
上篇扒了 HPA 的源码,但是没深入细节,今天往细节深入。 开局先祭出一张图: 为什么要有 Informer? Kubernetes 中的持久化数据保存在 etcd中,各个组件并不会直接访问 etcd,而是通过 api-server暴露的 RESTful 接口对集群进行访问和控制。 资源的控制器(图中右侧灰色的部分)读取数据也并不会直接从 api-server 中获取资源信息(这样会增加 api-server 的压力),而是从其“本地缓存”中读取。这个“本地缓存”只是表象的存在,加上缓存的同步逻辑就是今天要是说的Informer(灰色区域中的第一个蓝色块)所提供的功能。 从图中可以看到 Informer 的几个组件: Reflector:与 api-server交互,监听资源的变更。 Delta FIFO Queue:增量的 FIFO 队列,保存 Reflector 监听到的资源变更(简单的封装)。 Indexer:Informer 的本地缓存,FIFO 队列中的数据根据不同的变更类型,在该缓存中进行操作。 Local Store: 上篇 提到了水平自动伸缩的控制器HorizontalController,其构造方法就需要提供 Informer。 //pkg/controller/podautoscaler/horizontal.go type HorizontalController struct { scaleNamespacer scaleclient.