То, что вы видите, является стандартным поведением. Пока вы ожидаете синхронизации, получаются уведомления и выполняются соответствующие обработчики уведомлений.
Ваш код отличается от кода, который использует API Informer, поскольку обработка происходит непосредственно в обработчиках уведомлений. Это пахнет как поведение, основанное на краях, в то время как Kubernetes поощряет поведение, основанное на уровнях.
Типичный шаблон при написании контроллера Kubernetes (это то, что вам следует делать) - это когда обработчики уведомлений ничего не делают, кроме как помещают ссылку (обычно имя в пространстве имен) на уведомленный объект в рабочей очереди и имеют пул рабочих (если вы используете go-подпрограммы), извлеките такие ссылки, используйте их для извлечения всего объекта из кэша Informer, а затем выполните фактическую обработку. Поэтому обычно выполняется синхронизация кешей информеров перед запуском рабочих, чтобы работники не начинали обработку до синхронизации кеша. Чтобы быть точным, updateIPs()
должен выполняться не в коде обработчиков уведомлений, а в теле рабочих.
На этой странице есть отдельный пример обычного шаблона. Более точно, см. этот код для примера типичных обработчиков уведомлений и этот код для примера того, как выполняется синхронизация с запуском рабочих.