Кто такой Deckhouse-разработчик: карта экосистемы
Что нужно знать перед уроком
Ничего — это первый урок курса. Единственное ожидание: базовый опыт работы в терминале Linux/macOS (cd, ls, редактирование текстовых файлов) и общее представление о том, что такое контейнер (Docker или аналог). Если контейнеры вам не знакомы вообще — не страшно, к ним мы вернёмся подробно в M3 уроке 1, а пока достаточно понимать: контейнер — это упакованное вместе с зависимостями приложение, которое можно запустить где угодно одинаково.
Теория
Зачем нужен весь этот стек
Представьте, что вы написали веб-приложение и хотите, чтобы оно надёжно работало «в проде»: переживало падение сервера, автоматически обновлялось, масштабировалось при росте нагрузки, было доступно по человеческому доменному имени, безопасно хранило пароли от БД. Решать все эти задачи вручную — воспроизводить велосипед, который уже изобретён. Экосистема, которую вы изучаете в этом курсе, — это набор проверенных индустрией инструментов, решающих эти задачи по отдельности, но работающих как единое целое:
Дальше разбираем каждый слой этой схемы отдельно — подробно, но пока без практики (практика начнётся с урока 2).
Kubernetes — оркестратор контейнеров
Kubernetes (сокращённо K8s — «8 букв между K и s») — система оркестрации контейнеров с открытым кодом, изначально разработанная в Google, сейчас — проект Cloud Native Computing Foundation. Задача Kubernetes — управлять жизненным циклом контейнеризированных приложений на кластере серверов (узлов, node): решать, на каком узле запустить контейнер, перезапускать его при падении, распределять входящий трафик, масштабировать число копий приложения.
Kubernetes работает декларативно: вы не пишете скрипт «запусти 3 копии, потом ещё 2, потом удали одну», а описываете желаемое состояние («хочу 3 реплики этого контейнера») в YAML-манифесте, а специальные управляющие циклы (controllers) внутри Kubernetes непрерывно сверяют текущее состояние кластера с желаемым и приводят одно к другому. Этот принцип — «декларативность + постоянное приведение в соответствие» — центральный для всего курса и будет повторяться на каждом уровне: в Kubernetes-объектах (M1), в Application (M5) и в механике деплоя Nelm (M4, M7).
Базовые объекты Kubernetes, которые мы разберём в M1: Pod (единица запуска контейнеров), Deployment (декларативное управление количеством и версией Pod’ов), Service (стабильная точка доступа к Pod’ам), ConfigMap/Secret (конфигурация), Ingress/Gateway API (внешний доступ), Job/CronJob (разовые и периодические задачи), объекты RBAC (права доступа).
Deckhouse — платформа поверх Kubernetes
Голый Kubernetes — это только оркестратор. Чтобы получить продуктив-готовый кластер, вам ещё нужны: сетевой плагин (CNI), система мониторинга, Ingress-контроллер, управление сертификатами, бэкапы, консистентная СУБД, механизм обновлений самого Kubernetes и десятки других компонентов. Собирать и поддерживать их вручную — огромный объём инженерной работы, которую большинство команд не готовы делать самостоятельно.
Deckhouse — платформа (дистрибутив Kubernetes с батарейками), которая берёт эту работу на себя. Технически Deckhouse — это набор модулей (Module), каждый из которых закрывает одну инфраструктурную задачу (cert-manager, ingress-nginx, alb для Gateway API, managed-postgres, prometheus/observability, backup и десятки других), и управляющий контроллер (deckhouse-controller), который следит за состоянием этих модулей.
Здесь — первое ключевое разграничение курса, которое будет повторяться постоянно:
Платформа Deckhouse оперирует абстракцией Package, у которой есть два вида:
- Module — cluster-wide компонент платформы (один на весь кластер), может создавать CRD и cluster-wide объекты, предназначен для расширения инфраструктуры. Пример:
managed-postgres,ingress-nginx,cert-manager. - Application — namespaced пользовательский workload, неограниченное число инстансов в кластере, не может создавать CRD или cluster-wide объекты. Пример: ваш веб-сайт, бот, внутренний сервис.
Этот курс целиком про Application. Module мы будем упоминать только тогда, когда Application от него зависит (например, ваше приложение требует БД из модуля managed-postgres) — подробно эта граница разбирается в M2 уроке 1, а весь процесс разработки Application — в M5.
Werf и Nelm — от кода к работающему кластеру
Написанный вами код нужно превратить в работающий в кластере сервис. Это происходит в два принципиально разных этапа:
- Сборка образа — превращение исходного кода в OCI-образ контейнера (по сути — архив с файловой системой + метаданными запуска). Этим занимается Werf — CLI-инструмент для сборки и поставки, разработанный компанией Флант (той же, что разрабатывает Deckhouse). Werf умеет собирать образы двумя способами («билдерами»): через обычный
Dockerfileили через собственный механизм Stapel с более гибким кэшированием стадий. Подробно — в M3. - Рендер и применение чарта — превращение шаблонов Helm-чарта (по сути, параметризованных YAML-манифестов Kubernetes) в конкретные объекты и их создание/обновление в кластере. Раньше эту роль в экосистеме Werf/Deckhouse играл штатный Helm 3, но у него есть архитектурная проблема при работе с реальным дрейфом состояния кластера (разберём в M4 уроке 3) — поэтому появился Nelm, деплой-инструмент нового поколения, который использует Server-Side Apply вместо клиентского сравнения версий. Nelm — то, что реально рендерит и применяет ваш Application в кластере.
Обе команды werf build/werf converge и nelm release install вы будете использовать в каждом модуле начиная с M3.
Application — то, что вы разрабатываете
Application — пакет, который вы, как разработчик, создаёте: набор Helm/Nelm-шаблонов (templates/), схема допустимых пользовательских настроек (openapi/), метаданные (package.yaml), опционально — хуки для валидации настроек. Всё это компилируется через d8 package build в образы + чарт, публикуется в OCI Registry, и после этого любой пользователь платформы может установить ваш Application через объект kind: Application, указав нужные settings.
Подробный разбор структуры пакета — весь модуль M5, это ядро курса.
Registry — точка встречи всех компонентов
OCI Registry (container registry) — не просто хранилище Docker-образов. В экосистеме Deckhouse через registry публикуются: сами образы контейнеров, Helm/Nelm-чарты (упакованные как OCI-артефакты), метаданные версий Module и Application (ApplicationPackageVersion), даже сам Deckhouse и плагины d8. Единая точка публикации артефактов — то, что связывает разработку (werf build/d8 package build) с установкой в кластер (ModuleSource/PackageRepository). Подробную структуру путей registry разберём в M9 уроке 1.
Частые ошибки и подводные камни
- Путать Kubernetes и Deckhouse. Kubernetes — универсальный оркестратор от CNCF, работает у любого облачного провайдера и в любом дистрибутиве. Deckhouse — конкретный продукт-дистрибутив (как Ubuntu — дистрибутив Linux). Все объекты Kubernetes из M1 работают одинаково в любом кластере; Deckhouse добавляет свои CRD и модули поверх.
- Путать Application и Module с первого дня. Если сомневаетесь, к какой категории относится задача — задайте себе вопрос: «это то, что ставится один раз на весь кластер и служит инфраструктурой, или то, что можно поставить много раз с разными настройками как конкретный сервис?». Первое — Module, второе — Application.
- Считать Helm и Nelm одним и тем же. Nelm — не форк Helm, а независимый деплой-движок с иной моделью применения манифестов (SSA вместо 3-Way Merge). Он совместим с форматом Helm-чартов, но так не работает.
Шпаргалка команд урока
Команд в этом уроке не было — весь набор инструментов и первые команды появятся в следующем уроке. Общие шпаргалки уже доступны в разделе «Шпаргалки» и будут пополняться по ходу курса.
Вопросы для самопроверки
Deckhouse — платформа (дистрибутив) поверх стандартного Kubernetes API, состоящая из модулей и deckhouse-controller, который ими управляет.
Источник: Deckhouse — Concepts
Официальная граница: Module — cluster-wide, единственный экземпляр, может создавать CRD/cluster-wide объекты; Application — namespaced, неограниченное число инстансов, без CRD и cluster-wide объектов.
Источник: Deckhouse — Concepts
Werf — CLI-инструмент сборки (Dockerfile-builder или Stapel-builder) и поставки; Nelm отвечает за рендер и применение чарта в кластере, а не за сборку образов.
Источник: Werf — документация
Server-Side Apply перекладывает вычисление диффа на API-сервер, что устойчивее к внешним изменениям состояния кластера, чем клиентское сравнение трёх версий манифеста в Helm 3.
Источник: Nelm — README на GitHub
Registry в этой экосистеме — универсальная точка публикации артефактов: образы, чарты как OCI-артефакты, версии пакетов, сам Deckhouse, плагины CLI.
Источник: Deckhouse — Структура реестра артефактов
Рекомендуемая литература
Официальная документация
- Deckhouse — Application и Module: концепции
- kubernetes.io — What is Kubernetes?
- ru.werf.io — документация
- Nelm — README на GitHub
Статьи и блоги
- Установка Deckhouse в kind: пробуем K8s-платформу на ноутбуке — Flant на Habr.
- Разворачиваем приложение в кластере Kubernetes под управлением Deckhouse c помощью werf — Flant на Habr.
- Первые шаги с werf: собираем и деплоим простое приложение в Kubernetes — Flant на Habr.
Книги
- Marko Lukša. Kubernetes in Action. 2nd ed., 2022. ISBN 978-1617297618.
Связанные материалы
- Следующий урок: M0.02 — Установка инструментов разработчика.
- Глоссарий: Application, Module, Package.
- Дальше эта же граница Application/Module будет раскрыта строже в M2 уроке 1, а весь Application — в M5.
✓ Урок пройден — все вопросы самопроверки отвечены верно