我现在开始使用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

我想在我的 Controller 中添加这种新的自定义资源时,使用运行在内部(在Web服务器中)的应用程序镜像创建一个新的pod。当我的应用程序首次启动并运行时,我想通过运算符(operator)的HTTP请求对其进行配置(从规范中添加目录)。
到目前为止,还可以,但是我还可以在应用程序启动和运行时更改这些目录。

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

我正在考虑另外两种方法来发现某些内容已更新,但是我不确定它们是否可以正常工作,并且它们是执行此操作的最佳方法。
  • 第一个想法是使用client.Get(...)请求StoreApp的实例,但据我所知,它将调用API服务器并获取mystoreapp的更新版本。我了解了一些本地索引,这些索引的作用类似于这些对象的缓存,并且可以检查缓存的对象与从API服务器返回的对象之间是否存在差异。但是我没有找到如何从本地索引中获取对象,因此无法比较这两个对象。
  • 创建 map ,在其中存储小孔规范对象的哈希,并每次使用client.Get(...)获取带有对象哈希的哈希值。我认为这会奏效,但应该有更好的方法来做到这一点。

  • 我阅读了一些针对K8的Java运算符,并且有诸如onAdd,onUpdate,onDelete之类的方法。我在Operatod SDK中找不到类似的东西。 Operator SDK中有类似的东西吗?

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

    最好的祝福,
    克里斯蒂安

    最佳答案

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

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

    关于go - 在协调功能中检测规范更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59842559/

    10-15 19:24