Как устроен Deckhouse изнутри

Уровень: intermediate ~45 мин

Что нужно знать перед уроком

  • 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/verify Application-пакетов (детально — 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.

Практика в кластере

🧩 Практика урока: Без нового приложения — инспектируем deckhouse-controller
1
2
3
4
d8 k get pods -n d8-system -l app=deckhouse
d8 k logs -n d8-system -l app=deckhouse --tail=50
d8 system queue list 2>/dev/null || echo "команда может отличаться в зависимости от версии — см. d8 system --help"
d8 k get moduleconfig deckhouse -o yaml   # настройки самого Deckhouse через тот же механизм ModuleConfig

Найдите текущий release channel вашей установки:

1
d8 k get moduleconfig deckhouse -o jsonpath='{.spec.settings.releaseChannel}'

Практика разработки

В этом уроке нет собственной сборки — это обзорный урок про внутреннее устройство платформы.

Шпаргалка команд урока

1
2
3
4
d8 k get pods -n d8-system
d8 system queue list
d8 status
d8 k get moduleconfig deckhouse -o yaml

Вопросы для самопроверки

Какой компонент отвечает за низкоуровневую подписку на события Kubernetes API и запуск хуков модулей?

shell-operator — механизм, на котором построена реакция модулей на события Kubernetes API.

Источник: Рекомендуемая литература

В каком порядке идут release channels Deckhouse от самого нестабильного к самому консервативному?

Официальный порядок: alpha, beta, early-access, stable, rock-solid — возрастающая уверенность в стабильности версии.

Источник: Deckhouse — Общая архитектура релизов

Хуки типа OnStartup/BeforeHelm/AfterHelm/Schedule/OnKubernetesEvent относятся к разработке чего?

Это механизм именно Module; у Application — отдельный, гораздо более узкий механизм хуков (ApplicationHookInput/settingscheck), разбираемый в M5.

Источник: Deckhouse — Хуки Application и Module

Через какой механизм технически поставляется группа команд d8 package?

package — плагин d8, устанавливаемый/обновляемый через d8 plugins, с авторизацией через ClusterRole d8:registry-packages-proxy:cli-download.

Источник: GitHub — deckhouse/deckhouse-cli

Чем deckhouse-controller отличается от kube-controller-manager?

Это независимые уровни: стандартный Kubernetes control-plane и надстройка Deckhouse поверх него.

Источник: Рекомендуемая литература

Рекомендуемая литература

Официальная документация

Статьи и блоги

Книги

  • Marko Lukša. Kubernetes in Action. 2nd ed., 2022. ISBN 978-1617297618.

Связанные материалы