在阅读k8s源码时经常会看到类似的代码片段ctx.InformerFactory.Apps().xxx,比如在创建deploymentcontroller时的代码如下,其会创建三种资源的informer(Deployments, RelicaSets和Pods),这里的informer是什么东西呢?每调用一次都会创建一个实例吗?
dc, err := deployment.NewDeploymentController(
ctx.InformerFactory.Apps().V1().Deployments(),
ctx.InformerFactory.Apps().V1().ReplicaSets(),
ctx.InformerFactory.Core().V1().Pods(),
ctx.ClientBuilder.ClientOrDie("deployment-controller"),
)
如下图所示,简单来说informer的作用就是从apiserver获取对象事件,比如增删pod等,保存到本地cache,同时将事件分发到不同的listener,由listener进行特殊处理。
image.png