Метаконтроллер: как остановить вызовы для синхронизации ловушек и генерации ресурсов
Я использую https://metacontroller.app/ для реализации оператора Kubernetes.
Моя проблема заключается в следующем:
- Metacontroller никогда не прекращает вызывать мою синхронизирующую ловушку для моего контроллера ( составные контроллеры в этом случае), и
- родительские ресурсы
status.observedGeneration
поле постоянно обновляется (насколько я понимаю, это означает, что ресурс был воссоздан).
Документация составного контроллера (в частности, документация по ответам) предполагает, что если нет никаких изменений в возвращенном родительском статусе или в дочерней коллекции, Metacontroller должен прекратить вызывать ловушку синхронизации.
Я дополнительно удалил spec.resyncPeriodSeconds
а также spec.parentResource.revisionHistory
из составного манифеста контроллера (чтобы не вызывать никаких вызовов к ловушке синхронизации из-за событий таймера или изменений родительского элемента status
поле).
К сожалению, ничего из этого не сработало. Как я могу сказать Metacontroller прекратить вызывать ловушку синхронизации и прекратить создание ресурса?
1 ответ
Возможно, вам необходимо включить подресурс "status" для вашей CRD: https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/
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
Надеюсь, это сделает эту ситуацию более очевидной в будущем.