Я использую Metacontroller для реализации оператора Kubernetes.
Моя проблема заключается в следующем:
status.observedGeneration
Документация составного контроллера (в частности, ответная документация 1017 *) предполагает, что если нет никаких изменений в возвращенном родительском статусе или в дочерней коллекции, Metacontroller должен прекратить вызывать ловушку синхронизации.
Я дополнительно удалил spec.resyncPeriodSeconds и spec.parentResource.revisionHistory из составного манифеста контроллера (чтобы не вызывать никаких вызовов к ловушке синхронизации из-за событий таймера или изменений в поле status родителя).
spec.resyncPeriodSeconds
spec.parentResource.revisionHistory
status
К сожалению, ничего из этого не сработало. Как я могу сказать Metacontroller прекратить вызывать ловушку синхронизации и прекратить создание ресурса?
Возможно, вам необходимо включить подресурс "status" для вашей 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.
.metadata.resourceVersion
.metadata.generation
.status.observedGeneration
Смотрите здесь: https://github.com/GoogleCloudPlatform/metacontroller/blob/985572b9052a306f7e4d4fb84f2ced6f74247dd5/dynamic/clientset/clientset.go#L200
Я создал проблему для этого: https://github.com/GoogleCloudPlatform/metacontroller/issues/176
Надеюсь, это сделает эту ситуацию более очевидной в будущем.