FluxCD (Flux v2) est un toolkit GitOps modulaire pour Kubernetes, CNCF Graduated, développé initialement par Weaveworks (en liquidation depuis janvier 2024) et maintenant entièrement maintenu par la communauté sous la CNCF. Flux adopte une architecture de contrôleurs séparés : source-controller (Git, Helm, OCI), kustomize-controller, helm-controller, notification-controller, et les contrôleurs d'image automation. Chaque composant est indépendant et configurable via des CRDs déclaratives versionnées en Git.
Informations essentielles
Origine : Weaveworks → CNCF Graduated (communauté depuis jan. 2024) · Licence : Apache 2.0 · Architectures : x86_64, ARM64
Liens : Site officiel · Documentation · GitHub · Releases
Support : CNCF Graduated. Projet 100% communautaire depuis la fermeture de Weaveworks.
Stack par défaut
| Composant | Valeur |
|---|---|
| source-controller | Synchronise Git, Helm repos, OCI registries, buckets S3 |
| kustomize-controller | Applique les manifests Kustomize ou bruts |
| helm-controller | Gère les HelmRelease (déploiements Helm déclaratifs) |
| notification-controller | Alertes et webhooks entrants/sortants |
| image-reflector-controller | Scanne les registries pour nouvelles images |
| image-automation-controller | Commit automatiquement les nouvelles versions dans Git |
Prérequis
| Ressource | Valeur |
|---|---|
| Kubernetes | 1.26+ |
| kubectl | Configuré avec accès cluster |
| Git | Token d'accès au dépôt (GitHub, GitLab, Gitea, etc.) |
Installation
Installer la CLI flux
# Script officiel
curl -s https://fluxcd.io/install.sh | sudo bash
# Vérification
flux version
Bootstrap sur GitHub
export GITHUB_TOKEN=ghp_xxxxxxxxxxxx
export GITHUB_USER=mon-user
flux bootstrap github \
--owner=${GITHUB_USER} \
--repository=fleet-infra \
--branch=main \
--path=clusters/production \
--personal
Le bootstrap crée le dépôt s'il n'existe pas, installe Flux dans le cluster, et ajoute une deploy key pour la synchronisation pull-based.
Bootstrap sur GitLab
export GITLAB_TOKEN=glpat-xxxxxxxxxxxx
flux bootstrap gitlab \
--owner=mon-groupe \
--repository=fleet-infra \
--branch=main \
--path=clusters/production \
--token-auth
Vérification
flux check
kubectl get pods -n flux-system
# source-controller, kustomize-controller, helm-controller, notification-controller
Synchroniser depuis Git
Flux crée automatiquement une GitRepository et une Kustomization lors du bootstrap. Pour ajouter d'autres sources :
# gitrepository.yaml
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: my-app
namespace: flux-system
spec:
interval: 1m
url: https://github.com/org/my-app
ref:
branch: main
# kustomization.yaml
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: my-app
namespace: flux-system
spec:
interval: 10m
path: ./manifests/production
prune: true
sourceRef:
kind: GitRepository
name: my-app
targetNamespace: production
kubectl apply -f gitrepository.yaml
kubectl apply -f kustomization.yaml
Déployer via Helm
# helmrelease.yaml
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: podinfo
namespace: flux-system
spec:
interval: 10m
url: https://stefanprodan.github.io/podinfo
---
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: podinfo
namespace: default
spec:
interval: 5m
chart:
spec:
chart: podinfo
version: ">=6.0.0"
sourceRef:
kind: HelmRepository
name: podinfo
namespace: flux-system
values:
replicaCount: 2
Automatisation des images
# Scan des nouvelles versions dans le registry
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageRepository
metadata:
name: my-app
namespace: flux-system
spec:
image: ghcr.io/org/my-app
interval: 1m
---
# Politique de sélection de version
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"
---
# Commit automatique dans Git quand une nouvelle image est détectée
apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImageUpdateAutomation
metadata:
name: flux-system
namespace: flux-system
spec:
interval: 1m
sourceRef:
kind: GitRepository
name: flux-system
git:
checkout:
ref:
branch: main
commit:
author:
email: fluxcdbot@users.noreply.github.com
name: fluxcdbot
messageTemplate: "chore(images): update {{range .Updated.Images}}{{println .}}{{end}}"
push:
branch: main
update:
path: ./clusters/production
strategy: Setters
Dans les manifests, marquer la valeur à mettre à jour :
image: ghcr.io/org/my-app:1.2.3 # {"$imagepolicy": "flux-system:my-app"}
Mise à jour
flux version
flux check --pre
# Mise à jour de Flux dans le cluster
flux bootstrap github --owner=... --repository=... --path=... --personal
# ou via le dépôt Git (flux-system/gotk-components.yaml est versionné)
Troubleshooting
# Vérifier l'état de toutes les ressources Flux
flux get all
# État des sources
flux get sources git
flux get sources helm
# État des déploiements
flux get kustomizations
flux get helmreleases
# Forcer une réconciliation
flux reconcile source git flux-system
flux reconcile kustomization flux-system
# Logs d'un contrôleur
kubectl logs -n flux-system -l app=source-controller --tail=50
kubectl logs -n flux-system -l app=kustomize-controller --tail=50
# Suspendre/reprendre une source
flux suspend kustomization my-app
flux resume kustomization my-app
Commandes utiles
flux get all # État de toutes les ressources Flux
flux reconcile kustomization <nom> # Forcer la réconciliation
flux suspend helmrelease <nom> # Suspendre une HelmRelease
flux resume helmrelease <nom> # Reprendre
flux logs --follow # Logs de tous les contrôleurs en temps réel
flux diff kustomization <nom> # Prévisualiser les changements avant apply
flux export kustomization <nom> # Exporter la config d'une Kustomization
Ressources
- Site officiel : https://fluxcd.io
- Documentation : https://fluxcd.io/flux/
- GitHub : https://github.com/fluxcd/flux2
- Image automation guide : https://fluxcd.io/flux/guides/image-update/
- Releases : https://github.com/fluxcd/flux2/releases