首页 > 解决方案 > Metacontroller:如何停止调用同步钩子和资源生成

问题描述

我正在使用Metacontroller来实现 Kubernetes 运算符。

我的问题如下:

  1. Metacontroller 永远不会停止为我的控制器调用我的同步钩子(在这种情况下是复合控制器),并且
  2. 父资源status.observedGeneration字段不断更新(据我了解,这意味着资源已重新创建)。

复合控制器文档(特别是响应文档)建议,如果返回的父状态或子集合没有变化,元控制器应该停止调用同步钩子。

我还从复合控制器清单中删除了spec.resyncPeriodSecondsspec.parentResource.revisionHistory(由于计时器事件或对父status字段的更改,不会触发对同步挂钩的任何调用)。

可悲的是,这些都不起作用。如何告诉 Metacontroller 停止调用同步挂钩并停止创建资源?

标签: kuberneteskubernetes-operator

解决方案


您可能需要为您的 CRD 启用“状态”子资源:https ://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#status-subresource

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: myresource
spec:
...
  subresources:
    status: {}

没有它,Metacontroller 会将状态更新视为正常的资源更新,这反过来会创建一个新的.metadata.resourceVersion/.metadata.generation因为 Metacontroller 总是添加一个更新的.status.observedGeneration字段。

见这里:https ://github.com/GoogleCloudPlatform/metacontroller/blob/985572b9052a306f7e4d4fb84f2ced6f74247dd5/dynamic/clientset/clientset.go#L200

我为此创建了一个问题:https ://github.com/GoogleCloudPlatform/metacontroller/issues/176

希望这将使这种情况在未来更加明显。


推荐阅读