Kubernetes Operators:告密者与协调循环

Kubernetes Operators: Informers vs. reconcile loop

我最近开始构建 Kubernetes operator. I'm using the Fabric8 Java Kubernetes Client,但我认为我的问题更笼统,也适用于其他编程语言和库。

在阅读解释运算符模式的博客文章、文档或教科书时,我发现设计运算符似乎有两种选择:

  1. 使用无限协调循环,其中从 API 检索所有相应的 Kubernetes 对象,然后执行一些操作。
  2. 使用 informers,只要观察到的 Kubernetes 资源发生变化,就会调用它们。

但是,我没有找到任何源代码讨论在哪种情况下应该使用哪个选项。有什么最佳做法吗?

你应该两者都用。

使用线人时,处理程序可能会乱序获取事件,甚至根本不会获取事件。前者意味着处理程序需要定义和协调状态——这种方法被称为 level-based, as opposed to edge-based。后者意味着需要定期触发协调以解决这种可能性。

按照 controller-runtime 做事的方式,协调是由与控制器和计时器监视的资源相关的集群事件(在幕后使用通知程序)触发的。此外,根据设计,事件不会传递给协调器,因此它被迫定义状态并根据状态采取行动。