Определить обновление Spe c в функции согласования - PullRequest
2 голосов
/ 21 января 2020

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

Вопрос

Как обнаружить изменение конфигурации в пользовательском ресурсе yaml в согласовании l oop и выполнить действие в соответствии с изменением?

У меня есть некоторые свойства конфигурации, указанные в моей CR Spe c:

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

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

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

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

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

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

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

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

С наилучшими пожеланиями, Христиан

1 Ответ

1 голос
/ 06 февраля 2020

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

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

...