Application vs Module — официальная граница
Что нужно знать перед уроком
- M0.01 — Карта экосистемы — первое знакомство с разграничением Application/Module
- M1.11 — RBAC — методическая параллель: cluster-wide vs namespaced права
Что нужно знать перед уроком
M0 урок 1 уже вводил разграничение Application/Module на уровне интуиции. Здесь мы формализуем его дословно по официальной документации и закрепляем как критерий, который будет применяться к каждой следующей теме курса.
Теория
Package — общая абстракция
Платформа Deckhouse оперирует единой абстракцией Package. У Package есть ровно два конкретных вида — Module и Application. Официальное определение (Deckhouse — Концепции Application и Module):
Application или Module. Module: cluster-wide, один на кластер, может создавать CRD и cluster-wide объекты, предназначен для расширения инфраструктуры. Application: namespaced, неограниченное число инстансов, запрещено создавать CRD и cluster-wide объекты, предназначен для пользовательских workload’ов.Таблица сравнения
| Критерий | Module | Application |
|---|---|---|
| Область действия | cluster-wide | namespaced |
| Число инстансов в кластере | ровно один | неограниченное число |
| Может создавать CRD | да | нет |
| Может создавать cluster-wide объекты | да | нет |
| Назначение | расширение инфраструктуры платформы | пользовательские workload’ы |
| Линтер | dmtlint (9 линтеров) | pkglint (6 линтеров) |
| Пример | managed-postgres, ingress-nginx, cert-manager, alb | ваш веб-сервис, бот, внутренний инструмент |
Сравнение реальных деревьев файлов
Разница видна буквально на уровне структуры проекта. Дерево Module (по официальной документации Deckhouse — Структура Module, приводится только для контраста, не как учебный материал — курс не учит разработке Module):
my-module/
module.yaml
crds/ # ← только у Module: собственные CRD
my-crd.yaml
charts/
helm_lib/ # ← общая библиотека helm-хелперов платформы
hooks/
batch/ # ← cluster-wide хуки (OnKubernetesEvent и др.)
templates/
openapi/
config-values.yaml
conversions/ # ← версионирование схемы настроек модуля
v1.yaml
.werf/
workflows/
Дерево Application (по официальной документации Deckhouse — Разработка Application-пакета, разбирается подробно во всём M5):
my-app/
package.yaml # apiVersion, type: Application, name, requirements...
changelog.yaml
.gitlab-ci.yml
.pkglint.yaml
docs/
hooks/batch/ # ← хуки Application, ограничены namespace инстанса
images/
openapi/
config-values.yaml # схема пользовательских settings
values.yaml # helm-values контракт
templates/
oss.yaml
Отсутствие crds/ и полноценных .werf/workflows/ — не случайность, а прямое следствие архитектурного запрета: Application физически не может объявлять CRD, поэтому у него просто нет соответствующей директории в структуре проекта.
Почему это архитектурное решение, а не произвольное ограничение
Три причины, почему платформа проводит эту границу именно так:
- Изоляция. CRD и cluster-wide объекты влияют на весь кластер сразу. Если бы любой Application мог объявлять собственные CRD, два независимо установленных Application от разных разработчиков могли бы случайно (или злонамеренно) конфликтовать за одно и то же CRD-имя, ломая друг друга. Ограничение Application до namespaced-ресурсов делает установку одного Application физически не способной повлиять на любой другой namespace.
- Безопасность. Cluster-wide права требуют cluster-wide доверия. Позволяя Module создавать CRD/RBAC cluster-wide, платформа требует от Module более строгой проверки (отсюда — 9 линтеров
dmtlintпротив 6 уpkglint, подробно в M9), а Application, ограниченный namespace, может безопасно устанавливаться пользователями с меньшим уровнем доверия/прав. - Множественные инстансы. Пользовательские workload’ы — по природе штука, которую разумно ставить много раз с разными настройками (два независимых сайта, два инстанса Redis под разные задачи). Cluster-wide CRD физически не масштабируется на «поставить 10 раз с разными настройками» — CRD либо есть в кластере, либо нет, в единственном экземпляре схемы. Namespaced-модель Application снимает это противоречие.
Правило для любой новой темы курса
Всякий раз, когда в курсе встречается что-то, относящееся к платформе Deckhouse (а не к чистому Kubernetes из M1), задавайте себе вопрос: это про Application или про Module? Если про Module — курс раскрывает его ровно в объёме, нужном для понимания зависимости и диагностики (как в M6), но не для самостоятельной разработки.
Частые ошибки и подводные камни
- Пытаться «на всякий случай» добавить CRD в свой Application-пакет.
pkglint(см. M9 урок 2) явно проверяет это ограничение и отклонит такой пакет на этапеd8 package verify. - Считать, что «Module — это просто более сложный/старый способ упаковки», а Application — «новый, упрощённый». Разница не в возрасте или сложности API, а в архитектурной ответственности: инфраструктура vs пользовательский workload.
- Путать «неограниченное число инстансов Application» с «Application можно установить только один раз на namespace». Можно поставить сколько угодно инстансов и в одном namespace тоже (при условии, что имена ресурсов не конфликтуют — подробно в M5 уроке 7).
Практика в кластере
- Посмотрите список установленных в вашем кластере Module (cluster-wide, один экземпляр каждого):
| |
- Если в вашем CE-кластере уже есть установленные Application (после прохождения M5+) — сравните:
| |
- Явно убедитесь, что
Module— cluster-scoped тип API, а гипотетическийApplication— namespaced (когда установите первый в M5):
| |
Практика разработки
В этом уроке нет собственной сборки — мы только классифицируем существующие концепции платформы.
Шпаргалка команд урока
| |
Вопросы для самопроверки
Module — cluster-wide Package, устанавливается ровно в одном экземпляре на кластер, в отличие от Application.
Источник: Deckhouse — Concepts
Application по определению не может создавать CRD или cluster-wide объекты — это одно из фундаментальных ограничений, проверяемых линтером pkglint.
Источник: Deckhouse — Concepts
Три причины: изоляция инстансов друг от друга, требования безопасности к cluster-wide доверию, и физическая несовместимость CRD (единственная cluster-wide схема) с идеей множественных независимых инстансов.
dmtlint (Deckhouse Module Tool) с 9 линтерами проверяет Module; pkglint с 6 линтерами — Application-пакеты.
Источник: GitHub — deckhouse/dmt
Явно зафиксированное ограничение курса: фокус на Application, Module — только как зависимость и часть архитектуры платформы.
Источник: Рекомендуемая литература
Рекомендуемая литература
Официальная документация
- Deckhouse — Application и Module: концепции
- Deckhouse — Структура Module
- Deckhouse — Разработка Application-пакета
Статьи и блоги
- Разворачиваем приложение в кластере 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.
Связанные материалы
- Предыдущий урок: M1.11 — RBAC.
- Следующий урок: M2.02 — Как устроен Deckhouse изнутри.
- Глубокое погружение в структуру Application — весь M5, начиная с урока 1.
✓ Урок пройден — все вопросы самопроверки отвечены верно