Un des atouts différentiants de Flux CD par rapport à ArgoCD est son système
d’automatisation d’images natif. Flux peut surveiller un registre de
conteneurs, détecter une nouvelle version d’image conforme à votre politique
SemVer, et pousser automatiquement la mise à jour dans votre dépôt Git —
sans pipeline CI supplémentaire. Ce guide explique comment configurer les
trois objets : ImageRepository, ImagePolicy et ImageUpdateAutomation.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Comprendre le flux complet : registre → ImagePolicy → Git → cluster
- Déclarer un
ImageRepositorypour surveiller un registre - Créer une
ImagePolicyavec une règle SemVer ou de filtrage - Configurer
ImageUpdateAutomationpour que Flux pousse dans Git - Annoter vos manifestes avec le marqueur de mise à jour Flux
- Limiter l’automatisation à une branche de staging (bonne pratique)
Prérequis
Section intitulée « Prérequis »- Flux bootstrappé avec les composants image-reflector et image-automation
- Un registre de conteneurs (GitHub Container Registry, Docker Hub, Harbor…)
- Un dépôt Git où Flux a accès en écriture (deploy key avec droits d’écriture)
Vérifier les composants :
flux get all# Vous devriez voir image-reflector-controller et image-automation-controllerkubectl get pods -n flux-system# NAME READY# image-automation-controller-xxx 1/1# image-reflector-controller-xxx 1/1Le flux de données
Section intitulée « Le flux de données »L’automatisation d’images fonctionne en trois étapes :
1. ImageRepository → surveille le registre, stocke les tags dans le cluster2. ImagePolicy → filtre les tags selon une règle (semver, alphabétique, date)3. ImageUpdateAutomation → lit les politiques, met à jour les manifestes GitC’est le seul flux dans Flux CD où Flux pousse vers une source externe (Git). Tout le reste est en mode pull.
Installer les composants image automation
Section intitulée « Installer les composants image automation »Si vous utilisez le bootstrap minimal (sans --components-extra), relancez-le :
flux bootstrap github \ --owner=${GITHUB_USER} \ --repository=fleet-infra \ --branch=main \ --path=clusters/my-cluster \ --components-extra=image-reflector-controller,image-automation-controller \ --personalDéclarer un ImageRepository
Section intitulée « Déclarer un ImageRepository »Un ImageRepository déclare un dépôt d’images à surveiller (une image Docker,
pas un tag particulier) :
apiVersion: image.toolkit.fluxcd.io/v1beta2kind: ImageRepositorymetadata: name: podinfo namespace: flux-systemspec: image: ghcr.io/stefanprodan/podinfo interval: 1mPour un registre privé, référencez un Secret Kubernetes contenant les credentials :
spec: image: registry.example.com/my-org/my-app interval: 5m secretRef: name: registry-credentialsCréez le Secret :
kubectl create secret docker-registry registry-credentials \ --docker-server=registry.example.com \ --docker-username=<user> \ --docker-password=<token> \ --namespace=flux-systemCréer une ImagePolicy
Section intitulée « Créer une ImagePolicy »Une ImagePolicy filtre les tags d’image pour sélectionner celui à déployer.
Politique SemVer (recommandée)
Section intitulée « Politique SemVer (recommandée) »apiVersion: image.toolkit.fluxcd.io/v1beta2kind: ImagePolicymetadata: name: podinfo namespace: flux-systemspec: imageRepositoryRef: name: podinfo policy: semver: range: ">=6.0.0 <7.0.0"Cette politique sélectionne le tag le plus élevé dans la range >=6.0.0 <7.0.0.
Si 6.2.0 est la version la plus récente, ImagePolicy sélectionne 6.2.0.
Quand 6.3.0 sort, Flux la sélectionne automatiquement.
Autres types de politiques
Section intitulée « Autres types de politiques »Alphabétique — utile pour les tags non-SemVer comme des timestamps :
spec: policy: alphabetical: order: asc # ou "desc" pour le dernier tag alphabétiquementNumérique — pour les builds numérotés (build-42, build-43…) :
spec: filterTags: pattern: "^build-(?P<build>[0-9]+)$" extract: "$build" policy: numerical: order: ascFiltre de tags — pour exclure des tags de pre-release ou de test :
spec: filterTags: pattern: "^v[0-9]+\\.[0-9]+\\.[0-9]+$" # Exclut v1.0.0-rc1, latest, dev... policy: semver: range: ">=1.0.0"Vérifiez la politique sélectionnée :
flux get image policy podinfo# NAME LATEST IMAGE READY MESSAGE# podinfo ghcr.io/stefanprodan/podinfo:6.2.0 True Latest image tag for 'ghcr.io/stefanprodan/podinfo' resolved to: 6.2.0Annoter les manifestes avec le marqueur de mise à jour
Section intitulée « Annoter les manifestes avec le marqueur de mise à jour »Pour que ImageUpdateAutomation sache quel champ mettre à jour dans vos
manifestes, vous devez ajouter un marqueur de commentaire dans le fichier YAML.
Dans votre Deployment, annotez la ligne image: :
apiVersion: apps/v1kind: Deploymentmetadata: name: podinfospec: template: spec: containers: - name: podinfod image: ghcr.io/stefanprodan/podinfo:6.0.0 # {"$imagepolicy": "flux-system:podinfo"}Le commentaire # {"$imagepolicy": "flux-system:podinfo"} indique à Flux :
flux-system— namespace de l’objetImagePolicypodinfo— nom de l’objetImagePolicy
Quand Flux détecte une mise à jour, il remplace uniquement le tag dans cette ligne précise.
Configurer ImageUpdateAutomation
Section intitulée « Configurer ImageUpdateAutomation »ImageUpdateAutomation est l’objet qui fait le lien entre les politiques
d’image et le dépôt Git. Il fait une chose simple : scanner les fichiers du
dépôt pour les marqueurs $imagepolicy, remplacer les tags obsolètes, et
pousser un commit dans Git.
apiVersion: image.toolkit.fluxcd.io/v1beta2kind: ImageUpdateAutomationmetadata: name: flux-system namespace: flux-systemspec: 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(image): update {{range .Updated.Images}}{{.}}{{end}} to latest push: branch: main update: path: ./apps strategy: SettersParamètres clés :
| Paramètre | Description |
|---|---|
git.checkout.ref.branch | Branche à lire |
git.push.branch | Branche où pousser les commits |
git.commit.author | Identité du commit automatique |
update.path | Répertoire à scanner pour les marqueurs |
update.strategy | Setters : utilise les commentaires $imagepolicy |
Configuration production : branche dédiée
Section intitulée « Configuration production : branche dédiée »spec: git: checkout: ref: branch: main push: branch: staging # Pousse les mises à jour dans stagingAvec cette configuration :
- Flux détecte une nouvelle image sur la politique.
- Flux crée ou met à jour la branche
stagingavec le nouveau tag. - Vous (ou un bot) créez une PR de
stagingversmain. - Après merge, Flux réconcilie et déploie.
Workflow complet — test end-to-end
Section intitulée « Workflow complet — test end-to-end »- Vérifier que tous les objets sont prêts
flux get image repository podinfoflux get image policy podinfoflux get image update flux-system- Simuler une nouvelle image (test)
Pousser une image avec un tag plus récent dans votre registre, ou modifier temporairement la contrainte SemVer de l’ImagePolicy pour sélectionner un tag différent.
- Observer le commit automatique
# Surveiller les logs de image-automation-controllerkubectl logs -n flux-system deploy/image-automation-controller -f
# Vérifier dans votre dépôt Gitgit log --oneline -5# chore(image): update ghcr.io/stefanprodan/podinfo:6.3.0 to latest# ...- Vérifier le déploiement
flux get kustomizationskubectl get pods -n podinfokubectl describe pod -n podinfo | grep Image:Pièges courants
Section intitulée « Pièges courants »La politique sélectionne toujours l’ancien tag
Vérifiez que le tag le plus récent est présent dans les tags scannés :
kubectl get imagerepository podinfo -n flux-system -o jsonpath='{.status.lastScanResult}'ImageUpdateAutomation ne pousse pas de commit
Vérifiez que la deploy key Flux a des droits en écriture sur le dépôt. Sur GitHub, une deploy key en lecture seule ne peut pas pousser.
Les marqueurs ne sont pas reconnus
Le format exact du commentaire doit être respecté :
# {"$imagepolicy": "namespace:name"} — sans espace à l’intérieur des
accolades, et avec les guillemets doubles.
À retenir
Section intitulée « À retenir »- Les contrôleurs
image-reflector-controlleretimage-automation-controllersont nécessaires et ne sont pas installés par défaut. ImageRepositorysurveille le registre,ImagePolicyfiltre les tags,ImageUpdateAutomationpousse dans Git.- Le marqueur de commentaire
# {"$imagepolicy": "ns:name"}dans les manifestes est obligatoire pour que Flux sache quoi mettre à jour. - Ne jamais pousser directement sur
mainen production — utiliser une branche intermédiaire et une PR. - La policy SemVer est la plus courante et la plus sûre : elle évite les pre-releases et garantit une progression stable.