GitOps & CI/CD

FluxCD

Toolkit GitOps Kubernetes CNCF Graduated - architecture modulaire, sources Git/Helm/OCI, automatisation des images, image-automation-controller. Apache 2.0.

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

ComposantValeur
source-controllerSynchronise Git, Helm repos, OCI registries, buckets S3
kustomize-controllerApplique les manifests Kustomize ou bruts
helm-controllerGère les HelmRelease (déploiements Helm déclaratifs)
notification-controllerAlertes et webhooks entrants/sortants
image-reflector-controllerScanne les registries pour nouvelles images
image-automation-controllerCommit automatiquement les nouvelles versions dans Git

Prérequis

RessourceValeur
Kubernetes1.26+
kubectlConfiguré avec accès cluster
GitToken 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

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic