Контракт настроек — обе схемы
Что нужно знать перед уроком
- M5.02 — package.yaml: разбор каждого поля — нужно понимать общий манифест пакета перед погружением в контракт настроек
Что нужно знать перед уроком
M4 урок 1 — values.yaml как источник значений для шаблонов. M5 уроки 1–2 — место openapi/ в структуре пакета. Здесь — зачем нужны две отдельные схемы, а не одна.
Теория
Две схемы, два разных назначения
openapi/
├── config-values.yaml # (или settings.yaml) — контракт Application.spec.settings
└── values.yaml # полный helm-values контракт
config-values.yaml (иногда называется settings.yaml в зависимости от версии/конвенции) — JSON Schema, описывающая пользовательские настройки: то самое подмножество полей, которое конечный пользователь пакета указывает в spec.settings объекта Application при установке. Именно эта схема валидируется, когда пользователь пишет:
| |
openapi/values.yaml — полный контракт всех значений, которые видят Helm-шаблоны (.Values в терминах M4 урока 1), включая внутренние, недоступные напрямую пользователю поля (internal.*) — вычисляемые платформой или хуками значения (например, разрешённый IP управляемой БД после успешного подключения к Module-зависимости).
x-extend+internal.triggers
| |
Директива x-extend.schema: config-values.yaml буквально расширяет пользовательскую схему настроек в полный values-контракт — все свойства из config-values.yaml автоматически становятся частью values.yaml-схемы, плюс сверху добавляется секция internal (и, в частности, internal.triggers — служебные значения, используемые для внутренней координации между хуками и шаблонами, например, флаг «настройки БД уже подтянуты и провалидированы хуком»). Это архитектурное решение устраняет дублирование: не нужно вручную повторять каждое пользовательское поле в обеих схемах — config-values.yaml является единственным источником истины для пользовательской части, а values.yaml просто добавляет к ней внутренний слой.
Разбор типичных рассинхронов имён файлов
При сверке реальных примеров Application-пакетов (Applications/*) встречаются вариации именования, о которых важно знать заранее:
- Пакет minecraft использует
settings.yamlвместоconfig-values.yamlдля пользовательской схемы — оба имени признаются платформой, конкретное имя — вопрос конвенции конкретной версии инструментария, а не жёсткое ограничение. - Пакет quake3 демонстрирует расширенную вложенность настроек (
settings.server.maxPlayersвместо плоской структуры) — иллюстрирует, что JSON Schema поддерживает произвольную вложенность, а не только плоский список примитивов. - Пакет pgadmin (тот же пример, что и полный разбор зависимости в M6 уроке 2) показывает типичный паттерн
internal.*-полей, заполняемых хуком после проверки доступности зависимого Module, а не статически заданных пользователем.
Практическая схема для Umami
| |
| |
Частые ошибки и подводные камни
- Дублировать пользовательские поля вручную и в
config-values.yaml, и вvalues.yaml, не используяx-extend. Это создаёт риск рассинхрона схем при последующих изменениях — правильный подход всегда черезx-extend.schema. - Помещать внутренние вычисляемые значения (
internal.*) вconfig-values.yaml. Пользователь не должен (и не может по замыслу) задаватьinternal.postgresConnectionStringнапрямую — эти поля предназначены исключительно для заполнения хуками (M5 урок 8), а не пользователем. - Игнорировать разницу именования (
config-values.yamlvssettings.yaml) как «просто синоним без последствий». Хотя оба варианта признаются платформой, смешение конвенций в одном пакете (например, документация ссылается на один файл, а реально используется другой) сбивает с толку и затрудняет поддержку.
Практика в кластере
Практики в кластере в этом уроке нет — фокус на JSON Schema контракте, первая установка Application с валидацией настроек — в конце модуля.
Практика разработки
Добавьте обе схемы из теории урока в пакет Umami, созданный в M5 уроке 1.
Проверьте, что схема
config-values.yamlсинтаксически валидна как JSON Schema:
| |
- Смоделируйте установку с намеренно невалидными настройками (без обязательного
hostname) и без реального применения в кластер посмотрите, как выглядела бы ошибка валидации (черезnelm chart lint, зная итоговый values-контракт послеx-extend):
| |
- Убедитесь, что после добавления
x-extendвам не нужно вручную дублироватьhostname/replicas/databaseвvalues.yaml— они автоматически «наследуются» изconfig-values.yaml.
Шпаргалка команд урока
| |
Вопросы для самопроверки
Первая схема — то, что видит и задаёт пользователь; вторая — полный контракт для шаблонов, включая служебные вычисляемые поля.
x-extend делает config-values.yaml единственным источником истины для пользовательской части values-схемы.
Источник: Deckhouse — Structure
internal-секция — служебный слой, вычисляемый хуками (например, после подтверждения доступности зависимого Module), недоступный для прямого задания пользователем.
Оба варианта именования встречаются в реальных Application-пакетах и распознаются платформой.
config-values.yaml — обычная JSON Schema, полностью поддерживающая вложенные объекты и массивы.
Рекомендуемая литература
Официальная документация
Статьи и блоги
- Разворачиваем приложение в кластере 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.02 — package.yaml: разбор каждого поля.
- Следующий урок: M5.04 — Контекст Helm/Nelm-шаблонов Application.
- Заполнение internal.* хуками: M5 урок 8.
✓ Урок пройден — все вопросы самопроверки отвечены верно