Как устроен Deckhouse изнутри
Что нужно знать перед уроком
- M2.01 — Application vs Module — нужно понимать границу, о которой пойдёт речь при разборе хуков модулей
- M0.02 — Установка инструментов и обзор d8 CLI — здесь мы разбираем группы команд d8 подробнее
Что нужно знать перед уроком
M2 урок 1 — граница Application/Module. Этот урок — обзорный (не для разработки, а для ориентации): как Deckhouse устроен «под капотом», чтобы вы понимали, что происходит, когда что-то не работает.
Теория
deckhouse-controller, addon-operator, shell-operator
deckhouse-controller — центральный Pod платформы, который следит за состоянием всех Module (включение/выключение, применение ModuleConfig, обновление по release channel). Внутри он использует библиотеки addon-operator (общий фреймворк управления модулями — рендер их Helm-чартов, выполнение хуков в нужном порядке) и shell-operator (низкоуровневый механизм подписки на события Kubernetes API и запуска произвольных скриптов/бинарников в ответ).
Типы хуков модулей (обзорно, не для написания)
Хуки — это код (Go-бинарники или скрипты), который модуль исполняет в определённые моменты жизненного цикла. Основные типы (перечисляются здесь только для понимания архитектуры, поскольку они относятся к разработке Module, что вне фокуса курса — Go-хуки Application, доступные вам как разработчику, разбираются отдельно и подробно в M5 уроке 8):
| Тип хука | Когда срабатывает |
|---|---|
OnStartup | один раз при старте deckhouse-controller |
BeforeHelm | перед рендером/применением Helm-чарта модуля |
AfterHelm | после успешного применения чарта |
Schedule | по cron-расписанию |
OnKubernetesEvent | при изменении объектов Kubernetes API, подходящих под заданный фильтр |
Из чего состоит релиз Deckhouse и release channels
Сам Deckhouse поставляется как версионируемый артефакт, публикуемый по тем же принципам, что и Module/Application (общий registry, см. M9 урок 1). Каналы стабильности, упорядоченные от самого нестабильного до самого консервативного:
alpha → beta → early-access → stable → rock-solid
Кластер подписан на конкретный канал (настраивается администратором через ресурс DeckhouseRelease/конфигурацию), и по мере продвижения новой версии по каналам (от alpha к rock-solid) увеличивается уверенность в её стабильности перед тем, как она дойдёт до вашего продакшен-кластера.
d8 CLI — полная таблица групп команд (повторение и расширение M0)
В M0 уроке 2 мы уже видели таблицу групп команд d8. Здесь — контекст, зачем каждая нужна с точки зрения устройства платформы:
d8 k— прямой доступ к Kubernetes API, включая CRD Deckhouse (Module,ModuleConfig,ModuleSource, и позже —Application,PackageRepository).d8 system— операции именно с внутренностямиdeckhouse-controller: просмотр очереди обработки модулей, системные логи самого контроллера, диагностика застрявших модулей.d8 status— агрегированный срез состояния платформы (обёртка над несколькимиd8 k getпод капотом, для удобства).d8 package— встроенная команда дляbootstrap/build/verifyApplication-пакетов (детально — M5 урок 9).d8 plugins— механизм подгружаемых расширений CLI для прочих плагинов; технически плагины скачиваются компонентом кластераregistry-packages-proxy.
Частые ошибки и подводные камни
- Пытаться писать хуки модулей, думая, что это часть разработки Application. Хуки из таблицы выше (
OnStartup,BeforeHelmи т.д.) — механизм Module, у Application — совершенно другой, гораздо более узкий и safe-by-design механизм хуков (ApplicationHookInput, толькоsettingscheck), разбираемый в M5 уроке 8. - Путать
deckhouse-controllerсkube-controller-manager. Это независимые компоненты:kube-controller-manager— часть стандартного control-plane Kubernetes (управляет ReplicaSet/Job и т.п. из M1),deckhouse-controller— надстройка платформы, управляющая именно модулями/Application. - Считать release channel свойством конкретного модуля. Канал — свойство всей платформы (или отдельно настраиваемое для источника модулей через
ModuleSource), а не индивидуальная настройка каждого Module.
Практика в кластере
| |
Найдите текущий release channel вашей установки:
| |
Практика разработки
В этом уроке нет собственной сборки — это обзорный урок про внутреннее устройство платформы.
Шпаргалка команд урока
| |
Вопросы для самопроверки
shell-operator — механизм, на котором построена реакция модулей на события Kubernetes API.
Источник: Рекомендуемая литература
Официальный порядок: alpha, beta, early-access, stable, rock-solid — возрастающая уверенность в стабильности версии.
Источник: Deckhouse — Общая архитектура релизов
Это механизм именно Module; у Application — отдельный, гораздо более узкий механизм хуков (ApplicationHookInput/settingscheck), разбираемый в M5.
Источник: Deckhouse — Хуки Application и Module
package — плагин d8, устанавливаемый/обновляемый через d8 plugins, с авторизацией через ClusterRole d8:registry-packages-proxy:cli-download.
Источник: GitHub — deckhouse/deckhouse-cli
Это независимые уровни: стандартный Kubernetes control-plane и надстройка Deckhouse поверх него.
Источник: Рекомендуемая литература
Рекомендуемая литература
Официальная документация
Статьи и блоги
- Разворачиваем приложение в кластере Kubernetes под управлением Deckhouse c помощью werf — Flant на Habr.
- Установка Deckhouse в kind — Flant на Habr.
- Вышла werf 2.0: новый движок развёртывания Nelm — Flant на Habr.
Книги
- Marko Lukša. Kubernetes in Action. 2nd ed., 2022. ISBN 978-1617297618.
Связанные материалы
- Предыдущий урок: M2.01 — Application vs Module.
- Следующий урок: M2.03 — Module как зависимость.
- Go-хуки Application (контраст с хуками Module из этого урока): M5 урок 8.
✓ Урок пройден — все вопросы самопроверки отвечены верно