在协调功能中检测规范更新

Detect Spec update in the reconcile function

我现在开始使用 Kubernetes 和 Operator SDK,我正在尝试构建我的第一个 Operator,我可能有一个简单的问题。

问题

如何在协调循环中检测自定义资源 yaml 中的配置更改并根据更改采取措施?

我的 CR 规范中指定了一些配置属性:

apiVersion: my.example.com/v1alpha1
kind: StoreApp
metadata:
  name: mystoreapp
spec:
  username: technicalUser
  password: abcd1234
  catalogs:
    - name: Bikes
       description: Bikes_description
    - name: Cars
      description: Cars_description

我希望当我添加此类新的自定义资源时,我的控制器使用我的应用图像 运行 在内部(在网络服务器中)创建一个新的 pod。当我的应用程序启动并且第一次 运行 时,我想通过操作员的 HTTP 请求对其进行配置(从规范中添加目录)。 到目前为止没问题,但我还可以在我的应用程序启动和 运行.

时更改这些目录

例如我想在规范中添加新目录(通过 kubectl 补丁)。我的操作员的协调方法将被调用,我如何理解规范已更改?我不确定对我的应用程序进行 HTTP 调用以获取所有目录并将它们与规范中的目录进行比较是个好主意。这是理解有变化的正确方法吗?

我正在考虑其他两种方法来发现某些内容已更新,但我不确定它们是否会正常工作以及它们是否是执行此操作的最佳方法。

  1. 第一个想法是使用 client.Get(...) 请求 StoreApp 的实例,但据我所知,这将调用 API 服务器并将获得mystoreapp 的更新版本。我读到了一些本地索引,它充当这些对象的缓存,我可以检查缓存的对象和从 API 服务器返回的对象之间是否存在差异。但是我没有找到如何从这个本地索引中获取对象,所以我无法比较这两个对象。

  2. 创建地图,我在其中存储孔规范对象的哈希值,并在每次使用 client.Get(...) 获得的对象哈希值时检查此哈希值。我认为这会奏效,但应该有更好的方法。

我读了一些 K8s 的 Java 操作符,其中有 onAdd、onUpdate、onDelete 等方法。我在 Operatod SDK 中找不到类似的东西。 Operator SDK中有这样的东西吗?

每个答案都会有所帮助。提前致谢!

此致, 赫斯蒂扬

推荐的做法是查看您收到的规范,并将其与 world/cluster 的状态进行比较,因此检索目录并将它们与规范进行比较确实是正确的做法。

此建议的原因是,不能保证您从 Kubernetes 获得的事件顺序是一致的,也不能保证您一定会在合理的时间内收到每个事件,或者您只会收到每个事件一次,因此最好根据请求的内容与请求的内容进行比较,而不是根据触发协调的具体事件来做出决定。