Обнаружить обновление спецификации в функции согласования

Сейчас я начинаю с Kubernetes и Operator SDK, и я пытаюсь создать своего первого оператора, и у меня, вероятно, есть простой вопрос.

Вопрос

Как обнаружить изменение конфигурации в 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

Я хочу, чтобы при добавлении нового настраиваемого ресурса такого типа мой контроллер создавал новый модуль с моим изображением приложения, работающим внутри (на веб-сервере). Когда мое приложение запускается и запускается впервые, я хочу его настроить (добавить каталоги из спецификации) с помощью HTTP-запроса от оператора. Пока все в порядке, но я также хочу изменить эти каталоги, пока мое приложение работает.

Например, я хочу добавить в спецификацию новый каталог (через патч kubectl). Будет вызван метод согласования моего оператора, и как я могу понять, что спецификация изменилась? Я не уверен, что делать HTTP-вызовы моему приложению, чтобы получить все каталоги и сравнить их с каталогами из спецификации. Это правильный способ понять, что произошли изменения?

Я думаю о двух других способах обнаружить, что что-то обновляется, но я не уверен, будут ли они работать должным образом и являются ли они лучшим способом сделать это.

  1. Первая идея - запросить экземпляр StoreApp с помощью client.Get(...), но, насколько я понимаю, это вызовет сервер API и получит обновленную версию mystoreapp. Я читал о каком-то локальном индексе, который действует как кеш для этих объектов, и могу проверить, есть ли разница между кешированным объектом и объектом, возвращаемым с сервера API. Но я не нашел, как получить объект из этого локального индекса, поэтому мне не удалось сравнить два объекта.

  2. Чтобы создать карту, в которой я храню хэш объекта спецификации отверстия, и каждый раз проверять этот хеш с хешем объекта, полученного с помощью client.Get(...). Я думаю, это сработает, но должен быть способ сделать это лучше.

Я читал несколько операторов Java для K8s, и были такие методы, как onAdd, onUpdate, onDelete. Ничего подобного в Operatod SDK найти не удалось. Есть ли что-нибудь подобное в Operator SDK?

Каждый ответ будет полезным. Заранее спасибо!

С уважением, Христиан

1 ответ

Решение

Рекомендуемая практика - посмотреть на полученную вами спецификацию и сравнить ее с состоянием мира / кластера, поэтому получение каталогов и сравнение их со спецификацией - действительно правильный способ сделать это.

Причина этой рекомендации заключается в том, что порядок событий, которые вы получаете от Kubernetes, не гарантируется единообразием, а также не гарантируется, что вы обязательно получите каждое событие в разумное время или что вы получите только каждое событие один раз, поэтому лучше всего основывать свое решение на том, что было запрошено, по сравнению с тем, что есть, а не на том, какое конкретное событие вызвало согласование.

Другие вопросы по тегам