Обнаружить обновление спецификации в функции согласования
Сейчас я начинаю с 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-вызовы моему приложению, чтобы получить все каталоги и сравнить их с каталогами из спецификации. Это правильный способ понять, что произошли изменения?
Я думаю о двух других способах обнаружить, что что-то обновляется, но я не уверен, будут ли они работать должным образом и являются ли они лучшим способом сделать это.
Первая идея - запросить экземпляр StoreApp с помощью client.Get(...), но, насколько я понимаю, это вызовет сервер API и получит обновленную версию mystoreapp. Я читал о каком-то локальном индексе, который действует как кеш для этих объектов, и могу проверить, есть ли разница между кешированным объектом и объектом, возвращаемым с сервера API. Но я не нашел, как получить объект из этого локального индекса, поэтому мне не удалось сравнить два объекта.
Чтобы создать карту, в которой я храню хэш объекта спецификации отверстия, и каждый раз проверять этот хеш с хешем объекта, полученного с помощью client.Get(...). Я думаю, это сработает, но должен быть способ сделать это лучше.
Я читал несколько операторов Java для K8s, и были такие методы, как onAdd, onUpdate, onDelete. Ничего подобного в Operatod SDK найти не удалось. Есть ли что-нибудь подобное в Operator SDK?
Каждый ответ будет полезным. Заранее спасибо!
С уважением, Христиан
1 ответ
Рекомендуемая практика - посмотреть на полученную вами спецификацию и сравнить ее с состоянием мира / кластера, поэтому получение каталогов и сравнение их со спецификацией - действительно правильный способ сделать это.
Причина этой рекомендации заключается в том, что порядок событий, которые вы получаете от Kubernetes, не гарантируется единообразием, а также не гарантируется, что вы обязательно получите каждое событие в разумное время или что вы получите только каждое событие один раз, поэтому лучше всего основывать свое решение на том, что было запрошено, по сравнению с тем, что есть, а не на том, какое конкретное событие вызвало согласование.