2

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

问题

如何在 reconcile 循环中检测自定义资源 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 中有类似的东西吗?

每个答案都会有所帮助。先感谢您!

最好的问候, 赫斯蒂扬

4

1 回答 1

1

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

提出此建议的原因是,您从 Kubernetes 获得的事件的顺序不能保证是一致的,也不能保证您一定会在合理的时间内收到每个事件,或者您只会收到每个事件一次,因此最好根据请求的内容与实际请求的内容进行决策,而不是根据什么特定事件触发和解。

于 2020-02-06T17:30:22.080 回答