Flux CD GitOps: Sources, Kustomizations
Flux — GitOps-инструмент от CNCF, который разбивает задачи CD на независимые контроллеры: Source Controller отслеживает Git и реестры образов, Kustomize Controller применяет манифесты, Helm Controller управляет Helm-релизами. Эта модульность позволяет комбинировать инструменты под конкретные нужды.
Flux — альтернатива ArgoCD. Принципиальное отличие: Flux работает как набор независимых контроллеров, каждый из которых отвечает за свою задачу. Это делает архитектуру более модульной, но требует больше начальной конфигурации.
Key Takeaways
- Flux разбит на контроллеры: Source, Kustomize, Helm, Notification, Image Automation — можно использовать только нужные
flux bootstrap githubустанавливает Flux и кладёт его манифесты в сам Git-репозиторий — self-hosted GitOpsdependsOnв Kustomization гарантирует порядок: infrastructure применяется раньше приложений- Image Automation автоматически обновляет тег образа в Git при появлении новой версии
flux reconcile kustomization my-app --with-sourceпринудительно синхронизирует без ожидания интервала
Компоненты Flux
- Source Controller — отслеживает Git-репозитории, Helm-репозитории, OCI-артефакты
- Kustomize Controller — применяет Kustomize/манифесты из Source
- Helm Controller — управляет Helm-релизами (HelmRelease CRD)
- Notification Controller — отправляет уведомления о событиях в Slack, Teams, PagerDuty
- Image Automation Controller — автоматически обновляет теги образов в Git
Bootstrap
# Предварительно: установить Flux CLI
curl -s https://fluxcd.io/install.sh | sudo bash
# Установка Flux с привязкой к GitHub
flux bootstrap github \
--owner=my-org \
--repository=fleet-infra \
--branch=main \
--path=clusters/production \
--personal
# Или к GitLab
flux bootstrap gitlab \
--owner=my-group \
--repository=fleet-infra \
--branch=main \
--path=clusters/production
Flux создаёт репозиторий (если не существует), добавляет свои манифесты в clusters/production и начинает синхронизацию. Сам Flux хранится в Git — его конфигурация тоже управляется GitOps.
GitRepository Source
# Источник: репозиторий с манифестами приложения
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: my-app
namespace: flux-system
spec:
interval: 1m # как часто проверять Git
url: https://github.com/my-org/k8s-manifests
ref:
branch: main
secretRef:
name: github-credentials # SSH key или Personal Access Token
---
# Секрет для доступа к приватному репозиторию
apiVersion: v1
kind: Secret
metadata:
name: github-credentials
namespace: flux-system
type: Opaque
stringData:
username: git
password: ghp_token123
Для SSH-аутентификации:
flux create secret git github-credentials \
--url=ssh://git@github.com/my-org/k8s-manifests \
--ssh-key-algorithm=ed25519
Kustomization
# Применить manifests из GitRepository
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: my-app
namespace: flux-system
spec:
interval: 5m
path: ./apps/my-app/overlays/production
prune: true # удалять ресурсы не из Git
sourceRef:
kind: GitRepository
name: my-app
healthChecks:
- apiVersion: apps/v1
kind: Deployment
name: my-app
namespace: production
timeout: 3m
# Зависимость: сначала infrastructure, потом приложения
dependsOn:
- name: infrastructure
dependsOn гарантирует порядок: если infrastructure Kustomization не Ready, my-app не будет синхронизироваться.
HelmRelease
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: HelmRepository
metadata:
name: bitnami
namespace: flux-system
spec:
interval: 1h
url: https://charts.bitnami.com/bitnami
---
apiVersion: helm.toolkit.fluxcd.io/v2beta2
kind: HelmRelease
metadata:
name: postgresql
namespace: production
spec:
interval: 1h
chart:
spec:
chart: postgresql
version: ">=13.0.0 <14.0.0"
sourceRef:
kind: HelmRepository
name: bitnami
namespace: flux-system
values:
auth:
database: myapp
valuesFrom:
- kind: Secret
name: postgresql-values
valuesKey: values.yaml # секреты из отдельного Secret
upgrade:
remediation:
retries: 3
rollback:
cleanupOnFail: true
Flux Helm Controller выполняет helm upgrade при изменении HelmRelease или появлении новой версии чарта в указанном диапазоне.
Image Automation
Flux может автоматически обновлять тег образа в Git при появлении новой версии:
# Мониторить образ в реестре
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageRepository
metadata:
name: my-app
namespace: flux-system
spec:
image: my-registry/my-app
interval: 5m
---
# Политика выбора тега
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImagePolicy
metadata:
name: my-app
namespace: flux-system
spec:
imageRepositoryRef:
name: my-app
policy:
semver:
range: ">=1.0.0"
---
# Автоматически коммитить обновления в Git
apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImageUpdateAutomation
metadata:
name: my-app
namespace: flux-system
spec:
interval: 30m
sourceRef:
kind: GitRepository
name: fleet-infra
git:
checkout:
ref:
branch: main
commit:
author:
name: flux-bot
email: flux@example.com
messageTemplate: "ci: update {{range .Updated.Images}}{{.}}{{end}}"
push:
branch: main
В файле манифеста добавляется маркер для автообновления:
image: my-registry/my-app:1.2.3 # {"$imagepolicy": "flux-system:my-app"}
Flux обновит тег при появлении новой версии, соответствующей политике semver, и сделает коммит в Git.
Уведомления
# Уведомления в Slack
apiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Provider
metadata:
name: slack
namespace: flux-system
spec:
type: slack
channel: deployments
secretRef:
name: slack-token
---
apiVersion: notification.toolkit.fluxcd.io/v1beta3
kind: Alert
metadata:
name: flux-alerts
namespace: flux-system
spec:
providerRef:
name: slack
eventSeverity: info
eventSources:
- kind: Kustomization
name: "*"
- kind: HelmRelease
name: "*"
Мониторинг и диагностика
# Статус всех ресурсов Flux
flux get all -n flux-system
# Детальный статус конкретного ресурса
flux get kustomization my-app -n flux-system
# Логи конкретного контроллера
flux logs --kind=Kustomization --name=my-app
# Принудительная синхронизация без ожидания интервала
flux reconcile kustomization my-app --with-source
# Проверка что всё в порядке
flux check
Flux vs ArgoCD
| Аспект | Flux | ArgoCD |
|---|---|---|
| Архитектура | Независимые контроллеры | Монолитный сервер |
| UI | Нет встроенного | Богатый веб-интерфейс |
| Мультикластер | Нативный (каждый кластер автономен) | Через ApplicationSet |
| Image Automation | Встроенный | Через Argo Image Updater |
| Сложность настройки | Выше | Ниже |
| CNCF Graduated | Да | Да |
Flux лучше для команд, предпочитающих CLI и не нуждающихся в UI. ArgoCD лучше, когда важна визуализация состояния деплоев в браузере.
Итог
Flux разбивает GitOps на независимые компоненты: Source Controller отслеживает Git и реестры, Kustomize Controller применяет манифесты, Helm Controller управляет релизами. Image Automation автоматизирует обновление образов без участия человека. Это мощная модель для команд, которые хотят полностью автоматизировать CD-пайплайн.
Следующий шаг — Terraform для управления инфраструктурой: state и remote backend.