# FluxCD v2 Monorepo Репозиторий Infrastructure as Code, управляемый [FluxCD v2](https://fluxcd.io/) с использованием Kustomize-оверлеев и Helm-релизов. ## Структура репозитория ``` ├── clusters/ # Точка входа для каждого кластера (Flux читает отсюда) │ └── contour/ # Кластер contour │ ├── flux-system/ # Автогенерируется через `flux bootstrap` (не редактировать) │ ├── helm-repositories.yaml # Определения HelmRepository │ ├── infrastructure.yaml # Flux Kustomization → ./infrastructure │ └── apps.yaml # Flux Kustomization → ./apps │ ├── infrastructure/ # Инфраструктурные компоненты │ ├── kustomization.yaml # Список всех инфра-сервисов │ └── example-infra/ # Пример инфра-компонента │ ├── kustomization.yaml # Собирает base + patches │ ├── base/ # Базовые манифесты (namespace, HelmRelease) │ └── patches/ # Патчи поверх base │ ├── apps/ # Прикладные сервисы │ ├── kustomization.yaml # Список всех приложений │ └── example-app/ # Пример приложения │ ├── kustomization.yaml # Собирает base + patches │ ├── base/ # Базовые манифесты (Deployment, Service, ConfigMap) │ └── patches/ # Патчи поверх base ``` ## Как это работает Flux отслеживает директорию `clusters/<имя-кластера>/`. Каждый кластер содержит два Flux Kustomization CRD верхнего уровня: 1. **infrastructure.yaml** — реконсилирует `./infrastructure`. Содержит HelmReleases и вспомогательные ресурсы. 2. **apps.yaml** — реконсилирует `./apps`. Содержит Deployments, Services и другие ресурсы приложений. `apps` зависит от `infrastructure`, что гарантирует готовность инфраструктуры до деплоя приложений. Каждый сервис (в `infrastructure/` или `apps/`) имеет собственную структуру: - **base/** — базовые манифесты, общие для всех окружений - **patches/** — патчи, применяемые поверх base - **kustomization.yaml** — на уровне сервиса, собирает base + patches через Kustomize ## Начало работы ### Бутстрап Flux ```bash flux bootstrap git \ --url= \ --branch=master \ --path=clusters/contour ``` ### Проверка реконсиляции ```bash flux get kustomizations flux get helmreleases -A flux events --watch ``` ## Добавление нового инфраструктурного компонента 1. Создайте директорию с base и patches: ``` infrastructure/my-component/ ├── kustomization.yaml # resources: [./base], patches: [patches/...] ├── base/ │ ├── kustomization.yaml │ ├── namespace.yaml │ └── helmrelease.yaml └── patches/ └── values.yaml ``` 2. Зарегистрируйте в `infrastructure/kustomization.yaml`: ```yaml resources: - example-infra - my-component # Добавьте эту строку ``` 3. Если нужен новый HelmRepository, добавьте его в `clusters/<кластер>/helm-repositories.yaml`. ## Добавление нового приложения 1. Создайте директорию с base и patches: ``` apps/my-app/ ├── kustomization.yaml # resources: [./base], patches: [patches/...] ├── base/ │ ├── kustomization.yaml │ ├── namespace.yaml │ ├── deployment.yaml │ └── service.yaml └── patches/ └── replicas.yaml ``` 2. Зарегистрируйте в `apps/kustomization.yaml`: ```yaml resources: - example-app - my-app # Добавьте эту строку ``` ## Добавление нового кластера 1. Создайте точку входа `clusters/<имя>/` с `infrastructure.yaml`, `apps.yaml` и `helm-repositories.yaml` 2. Выполните бутстрап Flux с `--path=clusters/<имя>` ## Справочник API-версий | Ресурс | apiVersion | |------------------|-----------------------------------------| | Kustomization | `kustomize.toolkit.fluxcd.io/v1` | | GitRepository | `source.toolkit.fluxcd.io/v1` | | HelmRepository | `source.toolkit.fluxcd.io/v1` | | HelmRelease | `helm.toolkit.fluxcd.io/v2` |