- PVSM.RU - https://www.pvsm.ru -

Вслед за shell-operator [1] мы представляем его старшего брата — addon-operator [2]. Это Open Source-проект, который используется для установки в кластер Kubernetes системных компонентов, которые можно назвать общим словом — дополнения.
Не секрет, что Kubernetes это не готовый продукт всё-в-одном, и для построения «взрослого» кластера понадобятся различные дополнения. Addon-operator поможет установить, настроить и поддерживать эти дополнения в актуальном состоянии.
Необходимость дополнительных компонентов в кластере раскрыта в докладе [3] коллеги driusha [4]. Вкратце, ситуация с Kubernetes на данный момент такова, что для простой установки «поиграться» можно обойтись компонентами из коробки, для разработчиков и тестирования можно добавить Ingress, а вот для полноценной установки, о которой можно сказать «ваш production готов», необходимо добавить с десяток различных дополнений: что-то для мониторинга, что-то для логов, не забыть ingress и cert-manager, выделить группы узлов, добавить сетевые политики, приправить настройками sysctl и pod autoscaler’ом…

Как показывает практика, одной установкой дело не ограничивается. Для комфортной работы с кластером дополнения нужно будет обновлять, отключать (удалять из кластера), а что-то захочется протестировать перед установкой в production-кластер.
Так, может, тут и Ansible хватит? Возможно. Но полноценные дополнения в общем случае не живут без настроек. Эти настройки могут отличаться в зависимости от варианта кластера (aws, gce, azure, bare-metal, do, ...). Некоторые настройки нельзя задать заранее — их нужно получать из кластера. А кластер не статичен: для некоторых настроек придётся следить за изменениями. И тут уже Ansible не хватает: нужна программа, которая живёт в кластере, т.е. Kubernetes Operator.
Те, кто попробовал в работе shell-operator [5], скажут, что задачи установки и обновления дополнений и слежения за настройками вполне можно решить с помощью хуков [6] для shell-operator. Можно написать скрипт, который будет делать условный kubectl apply и следить, например, за ConfigMap, где будут храниться настройки. Примерно это и реализовано в addon-operator.
Создавая новое решение, мы исходили из следующих принципов:
Дополнением можно считать всё, что добавляет в кластер новые функции. Например, установка Ingress — отличный пример дополнения. Это может быть любой оператор или контроллер со своим CRD: prometheus-operator, cert-manager, kube-controller-manager, и т.д. Или что-то небольшое, но упрощающее эксплуатацию — например, secret copier, копирующий registry-секреты в новые пространства имён, или sysctl tuner, настраивающий параметры sysctl на новых узлах.
Для реализации дополнений Addon-operator предоставляет несколько концепций:
Как эти части работают вместе? Рассмотрим картинку из документации:

Сценария работы два:
Дополнение может быть реализовано виде одного единственного хука или как один Helm-чарт, или даже как несколько зависимых модулей — это зависит от сложности устанавливаемого в кластер компонента и от нужного уровня гибкости настроек. Например, в репозитории (/examples [7]) есть дополнение sysctl-tuner, которое реализовано как в виде простого модуля с хуком и Helm-чартом, так и с использованием хранилища values, что даёт возможность добавлять настройки через редактирование ConfigMap.
Несколько слов про организацию обновлений компонентов, которые устанавливает Addon-operator.
Чтобы запустить Addon-operator в кластере, нужно собрать образ с дополнениями в виде файлов хуков и Helm-чартов, добавить бинарный файл addon-operator и всё, что понадобится для хуков: bash, kubectl, jq, python и т.д. Дальше этот образ можно выкатывать в кластер как обычное приложение и скорее всего вы захотите организовать ту или иную схему тегирования. Если кластеров немного, может подойти тот же подход, что и с приложениями: новый релиз, новая версия, пойти по всем кластерам и поправить image у Pod’ов. Однако, в случае выката на ощутимое количество кластеров, нам больше подошла концепция самообновления из канала.
У нас это устроено так:
Это не best practice, о чем написано в документации Kubernetes [8]. Так делать не рекомендуется, но речь идёт про обычное приложение, которое живёт в одном кластере. В случае Addon-operator приложение — это множество Deployments, разбросанных по кластерам, и самообновление очень сильно помогает и упрощает жизнь.
Каналы помогают и в тестировании: если есть вспомогательный кластер, можно настроить его на канал stage и катать обновления в него перед выкатом в каналы ea и stable. Если c кластером на канале ea произошла ошибка, можно его переключить на stable, пока идёт расследование проблемы с этим кластером. Если кластер выведен из активной поддержки, он переключается на свой «застывший» канал — например, freeze-2019-03-20.
Помимо обновлений хуков и Helm-чартов может понадобиться обновить и сторонний компонент. Например, вы заметили ошибку в условном node-exporter и даже придумали, как его пропатчить. Далее открыли PR и ждёте нового релиза, чтобы пройтись по всем кластерам и увеличить версию образа. Чтобы не ждать неопределённое время, можно собрать свой node-exporter и переключиться на него до принятия PR.
В общем-то, это можно и без Addon-operator сделать, но с Addon-operator модуль для установки node-exporter будет на виду в одном репозитории, Dockerfile для сборки своего образа можно держать тут же, всем участникам процесса становится проще понимать, что происходит… А если кластеров несколько, то становится проще как тестировать свой PR, так и накатывать новую версию!
Эта организация обновления компонентов работает успешно у нас, но можно реализовать и любую другую подходящую схему — ведь в данном случае Addon-operator является простым бинарным файлом.
Принципы, реализованные в Addon-operator, позволяют выстроить прозрачный процесс создания, тестирования, установки и обновления дополнений в кластере, аналогичный процессам разработки обычных приложений.
Дополнения для Addon-operator в формате модулей (Helm-чарт + хуки) можно выкладывать в широкий доступ. Мы, компания Флант, планируем выложить в течение лета наши наработки в виде таких дополнений. Присоединяйтесь к разработке на GitHub (shell-operator [5], addon-operator [2]), пробуйте сделать своё дополнение на основе примеров [7] и документации [9], ждите новостей на Хабре и на нашем канале в YouTube [10]!
Читайте также в нашем блоге:
Автор: diafour
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/320496
Ссылки в тексте:
[1] shell-operator: https://habr.com/ru/company/flant/blog/447442/
[2] addon-operator: https://github.com/flant/addon-operator
[3] докладе: https://habr.com/ru/company/flant/blog/449096/
[4] driusha: https://habr.com/ru/users/driusha/
[5] shell-operator: https://github.com/flant/shell-operator
[6] хуков: https://github.com/flant/shell-operator/blob/master/HOOKS.md
[7] /examples: https://github.com/flant/addon-operator/tree/master/examples
[8] документации Kubernetes: https://kubernetes.io/docs/concepts/containers/images/#updating-images
[9] документации: https://github.com/flant/addon-operator/blob/master/README.md
[10] канале в YouTube: https://www.youtube.com/c/%D0%A4%D0%BB%D0%B0%D0%BD%D1%82
[11] Источник: https://habr.com/ru/post/455543/?utm_source=habrahabr&utm_medium=rss&utm_campaign=455543
Нажмите здесь для печати.