LINUX.ORG.RU

Оператор кубернетеса для медиасервера: управлять каждым инстансом или всем кластером?

 ,


0

1

Мы потихоньку развиваем оператор кубернетеса для нашего медиасервера Flussonic и возникает вот какой вопрос по самой концепции: вот один инстанс CRD должен отвечать за один экземпляр медиасервера или за целый кластер разнообразных серверов с разными версиями, конфигурациями железа и дисков?

Вводная такая, что софт у нас расчитан на то, чтобы забирать под себя весь сервер и не особо кого ещё там видеть. Т.е. это не 500 маленьких приложух, а одна большая на все 100 ядер.

Я так посмотрел, вроде как Cloud Native Postgres управляет сразу всем кластером.

У меня ситуация такая, что есть ряд настроек, которые будут разные у разных инстансов и если управлять из одного ресурса всем кластером, то неизменно возникают такие настройки, как:

configPerNode:
- hostname: "node1"
  disks:
  ....
- hostname: "node2"
  hasGpu: true
  disks: []
     

А ещё наверное неплохо было бы (ну так, чисто теоретически) на разных серверах иметь разный логин-пароль и соответственно это тоже надо куда-то складывать.

И вот получается, что если ресурс и контроллер описывает весь кластер, то к нему понятно как ходить, но по сути его настройки легко могут превратиться в портянку из кучи разных вариаций для разных нод. Уже не говоря о том, что если с этим одним большим контроллером что-то пойдет не так, то он вполне может положить вообще всё.

А если создавать по одному инстансу CRD на каждый экземпляр (т.е. ноду), то получается, что у нас на каждый сервак отдельная запись и не будет ли это тяжело поддерживать?

Какой опыт? Читал в https://sdk.operatorframework.io/docs/best-practices/best-practices/ и ответов не нашел. В чатгпт не ходил.

Мне нравится подход fluent-operator: есть разные CRD для настройки разных логически изолированных элементов конфигурации и есть оператор, который из всего этого склеивает настоящий конфиг и приглядывает за реальными кубернетесовскими объектами.

P.S. Ну и доступы уж точно не должны быть частью CRD. Для доступов есть секреты, на которых в CRD нужно ссылаться.

ugoday ★★★★★
()
Последнее исправление: ugoday (всего исправлений: 1)
Ответ на: комментарий от ugoday

да, доступы конечно в секретах.

Вопрос в том, что если я делаю один единый ресурс на все экземпляры медиасервера в кластере на 100 нод, то что получается:

..
spec:
  derParol:
    valueFrom:
      secretKeyRef:
        name: password-storage
        key: common_password

и получается, что на всех единый пароль. Или тут тоже городить 100 одинаковых записей?

max_lapshin ★★★★★
() автор топика
Ответ на: комментарий от max_lapshin

Я использую helm, там можно сильно упростить себе жизнь

param: {{ $value.secretKeyRef | default $.Values.defaultSecretKeyRef }}

Тогда задаёшь одно значение по умолчанию и в узлах переопределяешь, если нужно.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

P.S. Впрочем, с оператором можно и так:

  1. CRD NodeConfig

  2. CRD DefaultNodeConfig

после чего снова общекластерные параметры определяешь один раз, специфичные для узла — по потребности.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

Если я правильно понимаю, по сути ты рекомендуешь так и делать: один CRD на ноду и если припрет, ещё один для объединения их всех вместе или хельмом генерировать - на выбор.

max_lapshin ★★★★★
() автор топика
Ответ на: комментарий от max_lapshin

Предполагая, что у вас есть одно окружение, состоящиее из многих узлов, я бы так и сделал:

  1. CRD для окружения
kind: Environment
metadata:
  labels:
    env-name: my-env
spec:
  default-node-values:
…
  1. CRD для узла
kind: Node
metadata:
  labels:
    env-name: my-env

через labels узлы и окружение связаны, как, например, связывают deployment и pod. Данные берутся из default-node-values и при нужде переопределяются.

ugoday ★★★★★
()

Я бы подумал о том, чтобы добавить в софт автодетект наличие видеокарты, размера диска и т. д. Тогда конфиг можно будет сделать более однородным.

Или, например, сделать конфиг с белым/чёрным списком видеокарт (хоть по моделям, хоть вообще по серийникам), которые надо использовать, заданием объёма диска который можно использовать в процентах, а не абсолютных единицах (или настраивать сколько должно остаться свободно, а не сколько можно занять) и т. д. Тогда можно будет тоже уменьшить разнообразие конфигов, но сохранить некоторую гибкость.

Иными словами, как часто вам нужно игнорировать видеокарту при её наличии, занимать малую долю огромного диска и т. д.? Со стороны кажется, что это редкие экзотические случаи и их можно избегать.

KivApple ★★★★★
()

Мне больше нравится вариант с отдельными CR под каждую ноду - проще управлять, проще реконсайлить в контроллер-менеджере, более понятное логическое разделение ресурсов

George
()