Два обязательных модуля одновременно

Уровень: advanced ~45 мин Практика: Immich-подобный пример (AGPL-3.0)

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

  • M6.02 — pgadmin + managed-postgres целиком — нужен опыт с одной mandatory-зависимостью перед разбором сценария с двумя одновременно

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

M6 уроки 1–2 — механизм и полный сценарий одной mandatory-зависимости. Здесь — что происходит, когда пакету нужно сразу два обязательных модуля, на примере, аналогичном реальному Immich (self-hosted альтернатива Google Photos, использующая и PostgreSQL, и Redis).

Теория

requirements.modules.mandatory со списком из двух модулей

1
2
3
4
5
6
7
8
# package.yaml
requirements:
  modules:
    mandatory:
      - name: managed-postgres
        constraint: ">= 1.0.0"
      - name: managed-redis
        constraint: ">= 1.0.0"

Синтаксически это тот же самый список (M5 урок 2/M6 урок 1), просто с двумя элементами вместо одного — никакого специального синтаксиса «И»/«ИЛИ» не требуется: все элементы списка mandatory обязательны одновременно (это не список альтернатив, а список требований, которые должны выполняться все сразу).

Почему Immich-подобным приложениям нужны оба модуля

Реальный Immich использует PostgreSQL для хранения метаданных (альбомы, теги, пользователи) и Redis для очередей фоновых задач (генерация превью, распознавание лиц на фотографиях, транскодирование видео) — две принципиально разные категории хранения данных, каждая обслуживается своим специализированным Module платформы.

Что произойдёт, если доступен только один из двух модулей

flowchart TD A["Application Immich-подобный"] --> B{"managed-postgres Ready?"} A --> C{"managed-redis Ready?"} B -->|Да| D["Первое условие выполнено"] C -->|Нет| E["Второе условие НЕ выполнено"] D --> F["Installed=False\nreason: InstallFailed (message: managed-redis)"] E --> F

Ключевой момент: даже если один из двух mandatory-модулей полностью готов (managed-postgresReady), а второй (managed-redis) отсутствует или не готов — Application не переходит в частично работающее состояние. Условие Installed требует всех mandatory-зависимостей одновременно — это булево «И», а не «хотя бы одна из». Статус явно перечисляет, какая именно зависимость всё ещё не удовлетворена:

1
2
3
4
- type: Installed
  status: "False"
  reason: InstallFailed
  message: "Required module 'managed-redis' is not enabled in the cluster (managed-postgres: OK)"

Диагностика при частичной неготовности

Практический вывод: при двух и более mandatory-зависимостях диагностика требует проверки каждой из них по отдельности, а не остановки на первой найденной проблеме — сообщение статуса должно (по конвенции хорошего Application-пакета) явно перечислять, какие конкретно зависимости не удовлетворены, а не просто «есть проблема с зависимостями» в общем виде.

1
2
3
4
for m in managed-postgres managed-redis; do
  echo "=== $m ==="
  d8 k get module "$m" -o jsonpath='{.status.phase}'; echo
done

Частые ошибки и подводные камни

  • Считать, что Application частично заработает, если готов хотя бы один из нескольких mandatory-модулей. Это неверно — mandatory список требует все зависимости одновременно, частичная готовность не даёт частичной работоспособности.
  • Останавливать диагностику после нахождения первой неготовой зависимости, не проверив остальные. Если модулей несколько, может быть неготово сразу несколько — стоит проверить все, чтобы не тратить несколько итераций «исправил одно — нашёл следующее».
  • Проектировать пакет с зависимостью от двух модулей без явного, информативного сообщения в статусе о том, какая конкретно зависимость не удовлетворена. Общее сообщение «зависимости не готовы» без конкретики резко замедляет диагностику пользователем пакета.

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

🧩 Практика урока: Immich-подобный пример · лицензия AGPL-3.0
  1. Подготовьте тестовый пакет (или расширьте структуру существующего учебного примера) с двумя mandatory-зависимостями:
1
2
3
4
5
6
7
requirements:
  modules:
    mandatory:
      - name: managed-postgres
        constraint: ">= 1.0.0"
      - name: managed-redis
        constraint: ">= 1.0.0"
  1. Включите только один из двух модулей и установите Application, наблюдая за статусом:
1
2
3
4
d8 k patch moduleconfig managed-postgres --type=merge -p '{"spec":{"enabled":true}}'
d8 k patch moduleconfig managed-redis --type=merge -p '{"spec":{"enabled":false}}'
d8 k apply -n course-m6-immich -f application.yaml
d8 k get app immich-demo -n course-m6-immich -o jsonpath='{.status.conditions}' | jq
  1. Включите второй модуль и убедитесь, что Application переходит к следующим стадиям статусной модели:
1
2
d8 k patch moduleconfig managed-redis --type=merge -p '{"spec":{"enabled":true}}'
d8 k get app immich-demo -n course-m6-immich -w

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

Практики разработки в этом уроке нет — фокус на понимании поведения при множественных зависимостях.

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

1
d8 k get module <name> -o jsonpath='{.status.phase}'

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

Что означает список из нескольких элементов в requirements.modules.mandatory?

mandatory — список требований, которые должны выполняться все сразу, не список 'ИЛИ'-альтернатив.

Источник: Deckhouse — Разработка Application-пакета

Что произойдёт, если из двух mandatory-модулей готов только один?

Частичная готовность зависимостей не даёт частичной работоспособности Application.

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

Зачем нужны реальные приложения вроде Immich сразу два разных типа Module (БД и очереди)?

PostgreSQL и Redis решают принципиально разные задачи хранения — метаданные vs очереди/кэш.

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

Какая рекомендация по диагностике применима при нескольких mandatory-зависимостях?

Проверка только первой найденной проблемы может привести к нескольким итерациям диагностики вместо одной полной проверки.

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

Почему важно, чтобы сообщение статуса явно называло, КАКАЯ именно зависимость не удовлетворена, при нескольких mandatory-модулях?

Общее сообщение 'зависимости не готовы' без конкретики затрудняет быструю диагностику при нескольких mandatory-модулях.

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

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

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

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

Книги

  • Michael Hausenblas, Stefan Schimanski. Programming Kubernetes. 2019. ISBN 978-1492047107.

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