Что такое Flux?

Flux — это GitOps оператор для Kubernetes, который автоматически синхронизирует состояние кластера с конфигурациями, хранящимися в Git репозиториях. Это инструмент непрерывной доставки, следующий принципам GitOps.

Основные компоненты Flux v2

  • Source Controller — управление Git репозиториями и Helm чартами
  • Kustomize Controller — применение Kustomize конфигураций
  • Helm Controller — управление Helm releases
  • Notification Controller — отправка уведомлений
  • Image Reflector/Automation — автоматическое обновление образов

Установка Flux

 1# Установка Flux CLI
 2curl -s https://fluxcd.io/install.sh | sudo bash
 3
 4# Проверка совместимости кластера
 5flux check --pre
 6
 7# Bootstrap Flux в кластер
 8export GITHUB_TOKEN=your-token
 9flux bootstrap github \
10  --owner=your-username \
11  --repository=fleet-infra \
12  --branch=main \
13  --path=./clusters/my-cluster \
14  --personal
15
16# Проверка установки
17flux check

Создание GitRepository

 1# gitrepository.yaml
 2apiVersion: source.toolkit.fluxcd.io/v1beta2
 3kind: GitRepository
 4metadata:
 5  name: myapp-source
 6  namespace: flux-system
 7spec:
 8  interval: 1m
 9  ref:
10    branch: main
11  url: https://github.com/user/myapp-config
12  secretRef:
13    name: git-credentials

Kustomization для развертывания

 1# kustomization.yaml
 2apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
 3kind: Kustomization
 4metadata:
 5  name: myapp
 6  namespace: flux-system
 7spec:
 8  interval: 5m
 9  path: "./deploy"
10  prune: true
11  sourceRef:
12    kind: GitRepository
13    name: myapp-source
14  healthChecks:
15    - apiVersion: apps/v1
16      kind: Deployment
17      name: myapp
18      namespace: default
19  dependsOn:
20    - name: common-config

Helm Release управление

 1# helmrepository.yaml
 2apiVersion: source.toolkit.fluxcd.io/v1beta2
 3kind: HelmRepository
 4metadata:
 5  name: bitnami
 6  namespace: flux-system
 7spec:
 8  interval: 24h
 9  url: https://charts.bitnami.com/bitnami
10
11---
12# helmrelease.yaml
13apiVersion: helm.toolkit.fluxcd.io/v2beta1
14kind: HelmRelease
15metadata:
16  name: postgresql
17  namespace: default
18spec:
19  interval: 5m
20  chart:
21    spec:
22      chart: postgresql
23      version: "12.x.x"
24      sourceRef:
25        kind: HelmRepository
26        name: bitnami
27        namespace: flux-system
28  values:
29    auth:
30      postgresPassword: "supersecret"
31    primary:
32      persistence:
33        enabled: true
34        size: 8Gi

Автоматическое обновление образов

 1# imagerepository.yaml
 2apiVersion: image.toolkit.fluxcd.io/v1beta2
 3kind: ImageRepository
 4metadata:
 5  name: myapp
 6  namespace: flux-system
 7spec:
 8  image: myregistry/myapp
 9  interval: 1m
10
11---
12# imagepolicy.yaml
13apiVersion: image.toolkit.fluxcd.io/v1beta2
14kind: ImagePolicy
15metadata:
16  name: myapp
17  namespace: flux-system
18spec:
19  imageRepositoryRef:
20    name: myapp
21  policy:
22    semver:
23      range: ">=1.0.0"
24
25---
26# imageupdateautomation.yaml
27apiVersion: image.toolkit.fluxcd.io/v1beta1
28kind: ImageUpdateAutomation
29metadata:
30  name: myapp
31  namespace: flux-system
32spec:
33  interval: 30m
34  sourceRef:
35    kind: GitRepository
36    name: myapp-source
37  git:
38    checkout:
39      ref:
40        branch: main
41    commit:
42      author:
43        email: fluxcdbot@users.noreply.github.com
44        name: fluxcdbot
45      messageTemplate: |
46        Automated image update
47        
48        Automation name: {{ .AutomationObject }}
49        
50        Files:
51        {{ range $filename, $_ := .Updated.Files -}}
52        - {{ $filename }}
53        {{ end -}}
54        
55        Objects:
56        {{ range $resource, $_ := .Updated.Objects -}}
57        - {{ $resource.Kind }} {{ $resource.Name }}
58        {{ end -}}
59    push:
60      branch: main
61  update:
62    path: "./deploy"
63    strategy: Setters

Мониторинг и уведомления

 1# provider.yaml
 2apiVersion: notification.toolkit.fluxcd.io/v1beta2
 3kind: Provider
 4metadata:
 5  name: slack
 6  namespace: flux-system
 7spec:
 8  type: slack
 9  channel: general
10  secretRef:
11    name: slack-webhook
12
13---
14# alert.yaml
15apiVersion: notification.toolkit.fluxcd.io/v1beta2
16kind: Alert
17metadata:
18  name: myapp
19  namespace: flux-system
20spec:
21  providerRef:
22    name: slack
23  eventSeverity: info
24  eventSources:
25    - kind: GitRepository
26      name: '*'
27    - kind: Kustomization
28      name: '*'
29  summary: "Cluster {{.InvolvedObject.name}} sync status"

Multi-tenancy с Flux

1# Создание tenant namespace
2flux create tenant dev-team \
3  --with-namespace=dev-team \
4  --export > dev-team-tenant.yaml
5
6# Применение tenant конфигурации
7kubectl apply -f dev-team-tenant.yaml

Когда использовать Flux

  • Нужен GitOps подход к развертыванию
  • Работаешь с Kubernetes и Helm
  • Важна автоматизация обновлений образов
  • Требуется multi-tenancy поддержка
  • Команда предпочитает декларативный подход
  • Нужна интеграция с мониторингом и алертами

Преимущества Flux

  • GitOps native — изначально разработан для GitOps
  • Kubernetes native — полная интеграция с K8s
  • Modular architecture — модульная архитектура
  • Multi-tenancy — поддержка множественных команд
  • Progressive delivery — поддержка canary deployments
  • CNCF project — проект Cloud Native Computing Foundation

Альтернативы Flux

  • ArgoCD — другой популярный GitOps инструмент
  • Jenkins X — GitOps для Jenkins
  • Rancher Fleet — GitOps от Rancher
  • Weaveworks Weave GitOps — коммерческая версия

Best Practices

  • Разделяй application code и deployment configurations
  • Используй отдельные репозитории для разных окружений
  • Настрой proper RBAC для multi-tenancy
  • Мониторь состояние синхронизации
  • Используй health checks для критичных ресурсов
  • Настрой уведомления для команды

FAQ

Подходит ли Flux для продакшена?

Да, Flux v2 широко используется в production средах и является зрелым проектом CNCF с активной поддержкой сообщества.

Какие требования к инфраструктуре?

Flux требует Kubernetes кластер версии 1.20+. Минимальные ресурсы: ~100MB RAM для всех контроллеров.

В чем разница между Flux и ArgoCD?

Flux более модульный и CLI-ориентированный, ArgoCD имеет богатый веб-интерфейс. Оба отлично подходят для GitOps, выбор зависит от предпочтений команды.