CRD платформы вокруг Application
Что нужно знать перед уроком
- M5.05 — Ограничения Application — нужно понимать модель мультитенантности перед разбором конкретных CRD, её реализующих
Что нужно знать перед уроком
M2 урок 3 — общая статусная модель платформы (conditions/status.summary) и объекты PackageRepository/PackageRepositoryOperation. Здесь — полная картина всех пяти CRD marketplace-модели платформы и как они связаны друг с другом.
Теория
Пять CRD полной resource-модели marketplace
| CRD | Scope | Роль |
|---|---|---|
PackageRepository (PR) | Cluster | подключение к registry + расписание сканирования на наличие новых пакетов/версий |
PackageRepositoryOperation (PRO, kubectl shortName pro) | Cluster | конкретная задача сканирования (аналог «джобы» на синхронизацию метаданных) |
ApplicationPackageVersion (APV, kubectl shortName apv) | Cluster | обнаруженная конкретная версия пакета — метаданные из package.yaml, requirements, ссылка на образы, а также сами OpenAPI v3-схемы настроек и values (status.packageSchemas.settingsSchema/valuesSchema), по которым платформа валидирует Application.spec.settings |
ApplicationPackage (AP) | Cluster | информационный агрегат — сводка по всем версиям одного пакета (используется каталогом marketplace для отображения) |
Application (APP) | Namespaced, shortName app | конкретный установленный инстанс — единственный из пяти, кто реально управляет деплоем через Nelm |
Только Application — namespace-scoped; все остальные четыре CRD существуют на уровне кластера, т.к. они описывают доступные для установки пакеты (аналог каталога), не привязанные к какому-то конкретному namespace до момента реальной установки конкретным пользователем.
Разбор потока данных
- Администратор создаёт
PackageRepository, указывая адрес registry и расписание сканирования. PackageRepositoryинициируетPackageRepositoryOperation— платформа сканирует registry на наличие пакетов/версий.- Результат сканирования — набор
ApplicationPackageVersion, каждая описывает одну конкретную версию одного пакета: метаданные из егоpackage.yaml, а также сами OpenAPI v3-схемы (status.packageSchemas.settingsSchema/valuesSchema), извлечённые платформой из релиз-образа пакета — именно по ним затем валидируются пользовательские настройки и effective-values. - Все версии одного и того же пакета агрегируются в единый
ApplicationPackage— именно этот объект видит пользователь в каталоге marketplace как «одна карточка приложения» с выбором версии. - Когда пользователь решает установить конкретную версию — он создаёт
Applicationв своём namespace, ссылаясь на конкретныйApplicationPackageVersion(через имя пакета и версию вspec); платформа валидируетspec.settingsпоsettingsSchemaиз этойApplicationPackageVersion, и только после успешной валидации Nelm (M4) реально разворачивает ресурсы в кластере.
Application CRD — полная схема
| |
shortName: app — то, что позволяет писать сокращённо d8 k get app вместо полного d8 k get application (аналог po для pod, deploy для deployment из M1). Реальный пример объекта:
| |
Частые ошибки и подводные камни
- Пытаться установить Application, указав несуществующую или не просканированную версию в
packageVersion. Без соответствующегоApplicationPackageVersion, обнаруженного черезPackageRepositoryOperation, платформа не сможет разрешить установку — сначала должно пройти сканирование registry. - Путать
ApplicationPackage(агрегат по всем версиям) сApplicationPackageVersion(конкретная версия). Первый — это «карточка в каталоге», второй — «конкретный устанавливаемый релиз» этой карточки. - Ожидать, что
PackageRepository/ApplicationPackage/ApplicationPackageVersionможно создать в конкретном namespace. Это cluster-scoped ресурсы — единственный namespace-scoped объект в этой пятёрке — самApplication. - Не находить эти CRD в старом кластере и списывать это на ошибку конфигурации. Marketplace-модель (все пять CRD) требует минимальной версии платформы, начиная с которой она появилась в DKP — если
d8 k get crd | grep -E 'application|package'не находит их, вероятная причина именно в версии платформы, а не в настройках.
Практика в кластере
- Изучите все пять CRD через
d8 k explain:
| |
- Если у вас настроен тестовый
PackageRepository(из предыдущих модулей или созданный для практики курса), изучите цепочку от репозитория до конкретной версии:
| |
- Создайте
Applicationдля Umami (используя пакет, собранный и опубликованный в предыдущих уроках, или заготовку для проверки синтаксиса):
| |
Практика разработки
Практики разработки в этом уроке нет — фокус на изучении CRD как готовой платформенной модели.
Шпаргалка команд урока
| |
Вопросы для самопроверки
Все остальные четыре CRD описывают доступные для установки пакеты на уровне кластера; только Application — конкретный установленный инстанс в namespace.
Источник: Deckhouse — Concepts
AP используется для отображения пакета в каталоге marketplace, APV — конкретный устанавливаемый релиз.
Источник: Deckhouse — Concepts
PRO — это задача сканирования, инициируемая PackageRepository согласно его расписанию.
Источник: Deckhouse — Concepts
shortNames — стандартный механизм Kubernetes CRD для удобных сокращений в CLI.
Источник: Deckhouse — Cr
Без ApplicationPackageVersion платформа не может разрешить установку конкретной версии — сначала нужно сканирование registry.
Источник: Рекомендуемая литература
Рекомендуемая литература
Официальная документация
Статьи и блоги
- Разворачиваем приложение в кластере Kubernetes под управлением Deckhouse c помощью werf — Flant на Habr.
- Готовим Gitea со вкусом werf CI/CD в кластере Deckhouse. Часть 3 — Flant на Habr.
- Вышла werf 2.0: новый движок развёртывания Nelm — Flant на Habr.
Книги
- Marko Lukša. Kubernetes in Action. 2nd ed., 2022. ISBN 978-1617297618.
Связанные материалы
- Предыдущий урок: M5.05 — Ограничения Application.
- Следующий урок: M5.07 — Множественные инстансы одного пакета.
- Общая статусная модель платформы: M2 урок 3.
✓ Урок пройден — все вопросы самопроверки отвечены верно