iac/CLAUDE.md

14 KiB
Raw Blame History

Карта репозитория

Навигационный индекс infra/iac: где что лежит, какие здесь конвенции путей и на чём легко ошибиться. Для быстрого входа новым людям и для агентов (файл автоматически подхватывается Claude Code).

Не дублирует README.md (как пользоваться Flux, как добавить компонент) и IAC-CATALOG.md (подробный каталог всего estate infra/*) — отсылает к ним.

Что это за репозиторий

Только FluxCD v2 (GitOps) + Kustomize-оверлеи + HelmRelease.

Здесь принципиально нет и искать бесполезно:

Что Где искать
Terraform / Terragrunt infra/terraform, infra/terraform-contour, infra/terraform-contour-mirror
Ansible infra/ansible-playbooks, ansible-patroni-cluster, ansible-minio-cluster
Провижининг кластеров infra/kubespray, infra/k8s-provision
ArgoCD (контур ГПН) infra/iac-gpn
CI сборки образов generic/common-ci, generic/base-image
Push-деплой через .helm/ (ветка = контур) ~60 компонентных репозиториев, см. IAC-CATALOG.md §4

Чарты тянутся из oci://cr.yandex/crp3ccidau046kdj8g9q/charts, образы — cr.yandex/crp3ccidau046kdj8g9q/<name>:<tag>. Все приложения ставятся на общий чарт universal-chart; значения обёрнуты в ключ _default и выбираются по global.env.

Дерево

Путь Что
clusters/ 17 точек входа Flux + шаблон contour — источник истины «что где раскатано»
infrastructure/ 44 платформенных компонента
apps/ 39 прикладных сервисов
docs/apps/ 34 mermaid-диаграммы по сервисам + README.md с доменной группировкой
docs/architecture/ модель контура в ArchiMate + скрипты-сканеры (scan_calls.py, scan_contour.py) и сборка (build_archimate.py); реальные значения инсталляций сюда не кладутся, только *.example.json
docs/closed-contour-deployment.md ранбук поднятия закрытого контура
ci/, .gitlab-ci.yml, Dockerfile на тег vX.Y.Z: образ офлайн-зеркала iac-offline и публикация «слайсов» контуров (см. ниже)
README.md mermaid-мегакарта платформы, структура репозитория, инструкции по добавлению app / infra / кластера
IAC-CATALOG.md каталог всего infra/*; §5 — про этот репозиторий
inventory.yaml сгенерированный снимок прода: 59 namespace → kind → имена

Конвенции путей

Кластер. clusters/<cluster>/kustomization.yaml — плоский список ../../apps/<app>/<cluster>. Инфраструктура подключается двумя разными способами:

  • d8-ugmk-prod, sarex-contour, ugok, uralkal, vad — прямо в корневом kustomization как ../../infrastructure/<comp>/<c>;
  • brusnika-prod, brusnika-stage, vk-infra, vk-prod — через clusters/<c>/infrastructure/kustomization.yaml, который ссылается на оверлеи ../../../infrastructure/<comp>/<c> (base + патч HelmRelease + сопутствующие манифесты компонента);
  • wb, yc-cps-prod, yc-infra-prod, yc-k8s-test-02 — через clusters/<c>/infrastructure/kustomization.yaml, который ссылается на ../../../infrastructure/<comp> (резолвится в base), а различия лежат в clusters/<c>/infrastructure/patches/*.yaml;
  • stand — послойно: layers.yaml объявляет Flux-Kustomization 00-vault → 10-mesh → 20-data → 30-platform → 40-routing (каталоги clusters/stand/<NN>-<layer>/). Слои ссылаются на оверлеи infrastructure/<comp>/contour-template, а значения контура (${STORAGE_CLASS}, ${HOST_*}, ${GATEWAY_REPLICAS}) Flux подставляет через postBuild.substituteFrom из ConfigMap contour-vars.

Кластеры с приложениями: asterus, brusnika-prod, brusnika-stage, d8-ugmk-prod, sarex-contour, ugok, uralkal, vad, wb, yc-ecp, yc-k8s-test. Только инфраструктура: stand, vk-infra, vk-prod, yc-cps-prod, yc-infra-prod, yc-k8s-test-02. Шаблон: contour.

Приложение. apps/<app>/base/ — по одному .yaml на процесс (backend.yaml, celery.yaml, frontend.yaml) плюс namespace.yaml; оверлеи в apps/<app>/<cluster>/. Namespace = имя приложения. Рядом с манифестами лежит документация: CONFIGURATION.md (все env-переменные и откуда берутся), ENDPOINTS.md (исходящие HTTP-вызовы), openapi.yaml (входящий контракт), .env.example. Если процессов несколько — файлы с префиксом процесса: api.ENDPOINTS.md, pdm.CONFIGURATION.md, frontend.CONFIGURATION.md.

Инфра-компонент. infrastructure/<comp>/base/ + оверлеи <comp>/<cluster>/. Корневой infrastructure/<comp>/kustomization.yaml всегда указывает просто на base. Оверлей contour-template (есть у vault, istio-*, cert-manager, postgresql, kafka, rabbitmq, zitadel, camunda, istio-config) — параметризованный ${VAR}, а не привязанный к конкретному кластеру. Чарты идут с суффиксом контура: vault-contour, keycloak-contour, postgresql-contour и — внимание — idp-contour это Zitadel.

Слайсы. На тег vX.Y.Z ci/publish-slice.py generate создаёт child-pipeline с отдельной джобой на каждый clusters/*/kustomization.yaml. Джоба вызывает ci/build-slice.py: тот обходит дерево Kustomize от clusters/<c> и упаковывает только нужные файлы в tar. Результат публикуется как OCI-артефакт cr.yandex/crpct2b2lsmao4nm0cjk/<c>-iac:<tag> (media type application/vnd.sarex.slice.config.v1+json). Так закрытый контур получает только свой срез. Тесты — ci/tests/test_build_slice.py.

Где искать конкретное

Вопрос Файл
Что развёрнуто в контуре X clusters/X/kustomization.yaml (+ clusters/X/infrastructure/kustomization.yaml)
Откуда Flux тянет контур clusters/X/flux-system/gotk-sync.yaml
Внешние хосты, TLS, path-роутинг infrastructure/istio-config/<cluster>/istio-config.yaml либо clusters/<c>/infrastructure/patches/istio-config.yaml
Кто кого зовёт (граф сервисов) apps/*/ENDPOINTS.md + env-переменные с *.svc.cluster.local в apps/**/*.yaml
Что делает сервис, его БД / брокер / S3 docs/apps/<app>.md
Значение env-переменной apps/<app>/CONFIGURATION.md
Секреты Vault Agent Injector; путь secrets/data/apps/<app>/postgres, role = имя приложения, SA = <app>-vault
Тег образа в контуре apps/<app>/<cluster>/*.yaml, поле image.tag
Что реально в проде по namespace inventory.yaml
Где лежит исходный код приложения IAC-CATALOG.md §5.3.8
Что попадёт в слайс контура python3 ci/build-slice.py по clusters/<c> (логика сбора — там же)
Переменные шаблонного контура ${...} в infrastructure/*/contour-template; значения — ConfigMap contour-vars в кластере, не в репозитории

Ловушки

  • dsinv/ — оверлей есть у 25 приложений, но clusters/dsinv/ не существует. Это материализованный снимок живого контура WB, а не источник деплоя. Развёрнутым не считать.
  • Две несовместимые конвенции оверлеев (IAC-CATALOG.md §5.3.4). d8-ugmk-prod, yc-k8s-test, vad, uralkal, sarex-contour, dsinv наследуют base и патчат его. brusnika-prod, brusnika-stage, yc-ecp, asterus — полные копии HelmRelease, которые молча дрейфуют от base. Правка base на них не влияет. wb (4 из 27) и ugok (9 из 33) смешанные — проверяйте resources: конкретного оверлея; в ugok причина обычно указана комментарием в его kustomization.yaml.
  • asterus подключён почти пустым: оверлеи есть у 26 приложений, но в clusters/asterus/kustomization.yaml активен только auth-flow, остальные закомментированы. Инфраструктуры в кластере нет.
  • Слайс публикуется для каждого clusters/*/kustomization.yaml — в том числе для тестовых и инфраструктурных кластеров. Новая папка в clusters/ с этим файлом автоматически станет слайсом на следующем теге. У contour такого файла нет, поэтому для него слайс не собирается.
  • IAC-CATALOG.md — снимок на 05.08.2026 и по составу приложений на контур уже расходится с реальностью (там у wb ноль приложений, фактически 26 оверлеев). Всегда сверяться с clusters/*/kustomization.yaml.
  • Мегадиаграмма в README.md идеализирована — рисована руками, показывает все приложения на одной Postgres и все фронтенды за control-interface. Проверяемые источники — env-переменные и istio-config.
  • clusters/contour/ — не кластер, а шаблон: в нём нет flux-system, только apps.yaml, infrastructure.yaml, helm-repositories.yaml.
  • Path-роутинг лежит в infrastructure/istio-config/<c>/ у большинства контуров, но не у WB. В clusters/wb/infrastructure/patches/istio-config.yaml через Istio публикуются только платформенные UI (Gitea, Grafana, OpenObserve, Superset, Vault, GoAlert), а прикладной трафик разводится вне репозитория. В Brusnika схема смешанная: часть путей идёт напрямую в сервисы, остальное — одним правилом в yet-another-nginx-service.global-ingress.
  • vk-prod маршрутизирует в namespace с суффиксом -prod (eav-prod, pm-prod, inspections-prod), а приложений из apps/ в этом кластере нет: сервисы раскатываются не этим репозиторием.
  • Имена namespace расходятся между источниками: inventory.yaml и vk-prod используют суффикс (flows-prod), apps/ — голое имя (flows).
  • 66 оверлеев приложений не подключены ни к одному кластеру: 25 — dsinv, 25 — закомментированные в asterus, остальные 16 — мёртвый код (в основном brusnika-prod, плюс bi/iam в wb и yc-k8s-test).
  • Нет диаграмм в docs/apps/ для ams-sync, auth-flow, bi, iam, premises.
  • Чистые фронтенды без бэкенда в этом репозитории: auth-flow, control-interface, cross-section, document-link, prescriptions, projects, remarks, reviews, stamp-verification. Бэкенд projects живёт в planning/projects-backend.
  • Самые центральные сервисы по числу входящих ссылок: documentations (~85), processing / workflow (~76), django (~53), eav (~47), resources (~44), bim (~39), flows (~38). Менять их конфигурацию — дороже всего.

Поддержка файла

Карта описывает структуру и конвенции, а не текущий состав. Обновлять при появлении нового кластера, смене конвенции оверлеев или когда очередная ловушка перестаёт быть правдой. Списки приложений и версии сюда не дублировать — для этого есть clusters/*/kustomization.yaml и IAC-CATALOG.md.