- PVSM.RU - https://www.pvsm.ru -
Kubernetes-операторы — удобный механизм для расширения возможностей этой контейнерной платформы, по праву снискавший широкое признание в среде инженеров эксплуатации и им сочувствующих. О том, как они устроены и работают, мы рассказывали [1] в уже далёком 2017-м. А в апреле прошлого года мы представили [2] Open Source-проект shell-operator [3], который значительно упростил процесс создания Kubernetes-операторов.
Для этого был разработан фреймворк, позволяющий запускать произвольные скрипты (на Bash, Python и т.п.) в случае наступления определённых событий в K8s-кластере.
За минувшее время shell-operator обрёл свою пользовательскую базу (см. подробности в конце статьи) и, конечно, новые возможности. По случаю недавнего релиза v1.0.0-beta.11 [4] (о бета-статусе см. дальше) мы решили рассказать о том, к чему проект пришёл за время своего существования, с момента анонса первой публичной версии.
Но начнем с краткого пояснения, как работает shell-operator и для чего в принципе он может понадобиться.
Shell-operator запускается в pod’е Kubernetes-кластера. Он представлен там как:
Хуки:
Таким образом, shell-operator — это прослойка между событиями в Kubernetes API и скриптами для их обработки.
Зачем вообще был создан shell-operator? Операторы — это стандарт для «правильной автоматизации» в рамках Kubernetes, однако их полноценная разработка (на Go с привлечением соответствующего SDK [5]) не так проста. Наличие такого простого фреймворка, как shell-operator, значительно снижает порог вхождения в эту область, позволяя быстро и эффективно решать небольшие эксплуатационные задачи* внутри кластера. И, что не менее важно, делать это правильным путём.
О каких задачах идёт речь? Готовые примеры использования shell-operator можно найти в репозитории проекта [6]. У нас же, в компании «Флант», мы его применяем как библиотеку (да, так тоже можно было!). Он стал основой для addon-operator [7], управляющего дополнительными компонентами в Kubernetes.
NB: Анонс этого Open Source-проекта (addon-operator) можно найти здесь [8]. А в докладе «Расширяем и дополняем Kubernetes [9]» мы подробно рассказывали о причинах его появления, взаимосвязи с shell-operator и принципах функционирования.
Теперь — о главных изменениях, представленных в shell-operator за последний год.
В первых версиях shell-operator для хука был доступен только один объект — тот, который связан с событием от кластера. Развитие хуков, используемых в рамках addon-operator, привело к тому, что хук подписывался на изменение объекта, но вызывал kubectl
чтобы получить актуальный список других объектов. Чтобы убрать лишние вызовы kubectl
и тем самым ускорить работу хуков, реализовано несколько возможностей получить доступ к актуальным спискам объектов:
kubectl
. (Для подробностей см. флаги executeHookOnSynchronization
и executeHookOnEvent
.)Другие значительные нововведения:
kind
(тип ресурса в Kubernetes API), в том числе и Custom Resources.queue
). В дальнейшем для диагностики состояния очередей хуков была добавлена команда и соответствующие endpoints [16].LOG_TYPE
в переменных окружения [22]).listen-address
для возможности запуска в режиме hostNetwork: true
.kube-server
для указания адреса сервера Kubernetes API.SIGCHLD
и устраняющий процессы-сироты, которые могут порождаться Bash-скриптами. Вместо внутренней реализации теперь используется внешняя — tini [25].kubectl
(с 1.13 до 1.17.4) и сделана сборка на основе alpine-3.11.Проект shell-operator всё ещё официально имеет статус бета-версии. Несмотря на это, как уже отмечалось выше, мы весьма интенсивно используем его как основу для addon-operator [7] — инструмента, который постоянно эксплуатируется во множестве (100+) K8s-кластеров.
Для стабильного релиза shell-operator как публичного проекта мы планируем (как минимум):
context
и окончательно разобраться с кэшированием объектов в client-go (#188 [28]).За прошедшее время мы увидели явный интерес сообщества к shell-operator:
Спасибо за интерес к shell-operator! Если у вас появились вопросы — задавайте их здесь в комментариях или в tg-канале @kubeoperator [36].
Читайте также в нашем блоге:
Автор: Иван Михейкин
Источник [37]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/open-source/354849
Ссылки в тексте:
[1] рассказывали: https://habr.com/ru/company/flant/blog/326414/
[2] представили: https://habr.com/ru/company/flant/blog/447442/
[3] shell-operator: https://github.com/flant/shell-operator
[4] v1.0.0-beta.11: https://github.com/flant/shell-operator/releases/tag/v1.0.0-beta.11
[5] соответствующего SDK: https://github.com/operator-framework/operator-sdk
[6] репозитории проекта: https://github.com/flant/shell-operator/tree/master/examples
[7] addon-operator: https://github.com/flant/addon-operator
[8] здесь: https://habr.com/ru/company/flant/blog/455543/
[9] Расширяем и дополняем Kubernetes: https://habr.com/ru/company/flant/blog/449096/
[10] Synchronization: https://github.com/flant/shell-operator/blob/master/HOOKS.md#synchronization-binding-context
[11] reconcile loop: https://sdk.operatorframework.io/docs/golang/quickstart/#reconcile-loop
[12] получением snapshot'ов: https://github.com/flant/shell-operator/blob/master/HOOKS.md#snapshots
[13] группы snapshot'ов: https://github.com/flant/shell-operator/blob/master/HOOKS.md#binding-context-of-grouped-bindings
[14] CustomResource: https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/
[15] динамического клиента: https://github.com/kubernetes/client-go/tree/master/dynamic
[16] команда и соответствующие endpoints: https://github.com/flant/shell-operator/issues/8#issuecomment-577021602
[17] произвольные метрики: https://github.com/flant/shell-operator/blob/master/METRICS.md#custom-metrics
[18] отдельный порт: https://github.com/flant/shell-operator/pull/190
[19] фреймворк: https://github.com/flant/shell-operator/tree/master/frameworks/shell
[20] Добавлено: https://github.com/flant/shell-operator/issues/62
[21] logrus: https://github.com/sirupsen/logrus
[22] переменных окружения: https://github.com/flant/shell-operator/blob/master/RUNNING.md#environment-variables-and-flags
[23] libjq-go: https://github.com/flant/libjq-go
[24] Удалён: https://github.com/flant/shell-operator/pull/175
[25] tini: https://github.com/krallin/tini
[26] #63: https://github.com/flant/shell-operator/issues/63
[27] #184: https://github.com/flant/shell-operator/issues/184
[28] #188: https://github.com/flant/shell-operator/issues/188
[29] awesome-kubernetes: https://github.com/ramitsurana/awesome-kubernetes/
[30] Cloud Zone: https://dzone.com/articles/50-useful-kubernetes-tools-list-part-2
[31] Weaveworks: https://go.weave.works/multi-cloud-eks.html
[32] K8s Meetup Tokyo: https://speakerdeck.com/nwiizo/zi-dong-hua-hashell-operatortogong-ni
[33] книге: https://twitter.com/flant_com/status/1199618933168300033
[34] инсталлятор: https://github.com/kubesphere/ks-installer
[35] здесь: https://t.me/flant_ru/8
[36] tg-канале @kubeoperator: https://t.me/kubeoperator
[37] Источник: https://habr.com/ru/post/509896/?utm_source=habrahabr&utm_medium=rss&utm_campaign=509896
Нажмите здесь для печати.