Aller au contenu principal

Image Automation


Table des matières

  1. Concept
  2. Image Reflector Controller
  3. Image Automation Controller
  4. Configuration complète
  5. Bonnes pratiques
  6. Exercices pratiques

1 - Concept

Qu'est-ce que l'Image Automation ?

L'Image Automation permet à Flux de :

  1. Scanner les registries pour de nouvelles images
  2. Mettre à jour automatiquement les références dans Git
  3. Déclencher un déploiement GitOps

Avantages

AvantageDescription
True GitOpsMême les images sont dans Git
AuditabilitéChaque changement est un commit
Rollback facilegit revert
Pas de credentials CICI n'a pas accès au cluster

Composants requis

# Installer les controllers d'image
flux install --components-extra=image-reflector-controller,image-automation-controller

🔝 Retour à la table des matières


2 - Image Reflector Controller

ImageRepository

Scanne un registry pour les tags disponibles.

apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageRepository
metadata:
name: my-app
namespace: flux-system
spec:
image: ghcr.io/my-org/my-app
interval: 1m

Avec authentification

apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageRepository
metadata:
name: my-app
namespace: flux-system
spec:
image: registry.example.com/my-app
interval: 1m
secretRef:
name: registry-credentials
---
apiVersion: v1
kind: Secret
metadata:
name: registry-credentials
namespace: flux-system
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: <base64-encoded>

ImagePolicy

Définit les critères de sélection des tags.

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 <2.0.0"

Politiques de sélection

# Semver - choisir le plus récent dans la range
policy:
semver:
range: ">=1.0.0"

# Alphabétique - dernier par ordre alpha
policy:
alphabetical:
order: asc

# Numérique - pour les build numbers
policy:
numerical:
order: asc

# Filtrage par regex
filterTags:
pattern: '^main-[a-f0-9]+-(?P<ts>.*)'
extract: '$ts'
policy:
numerical:
order: asc

🔝 Retour à la table des matières


3 - Image Automation Controller

ImageUpdateAutomation

Configure la mise à jour automatique dans Git.

apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImageUpdateAutomation
metadata:
name: my-app
namespace: flux-system
spec:
interval: 1m
sourceRef:
kind: GitRepository
name: my-repo
git:
checkout:
ref:
branch: main
commit:
author:
email: [email protected]
name: Flux
messageTemplate: |
Auto-update images

{{range .Updated.Images}}
- {{.}}
{{end}}
push:
branch: main
update:
path: ./apps
strategy: Setters

Marqueurs dans les manifests

# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
spec:
containers:
- name: app
image: ghcr.io/my-org/my-app:1.0.0 # {"$imagepolicy": "flux-system:my-app"}

Le commentaire {"$imagepolicy": "flux-system:my-app"} indique à Flux où mettre à jour l'image.

🔝 Retour à la table des matières


4 - Configuration complète

Exemple complet

# 1. GitRepository pour l'application
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: my-app-config
namespace: flux-system
spec:
interval: 1m
url: ssh://[email protected]/my-org/my-app-config.git
ref:
branch: main
secretRef:
name: git-ssh
---
# 2. ImageRepository - scanner le registry
apiVersion: image.toolkit.fluxcd.io/v1beta2
kind: ImageRepository
metadata:
name: my-app
namespace: flux-system
spec:
image: ghcr.io/my-org/my-app
interval: 1m
---
# 3. ImagePolicy - critères de sélection
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"
---
# 4. ImageUpdateAutomation - commit vers Git
apiVersion: image.toolkit.fluxcd.io/v1beta1
kind: ImageUpdateAutomation
metadata:
name: my-app
namespace: flux-system
spec:
interval: 1m
sourceRef:
kind: GitRepository
name: my-app-config
git:
checkout:
ref:
branch: main
commit:
author:
email: flux@my-org.com
name: Flux Bot
messageTemplate: |
chore: update images

{{range .Updated.Images}}
- {{.}}
{{end}}
push:
branch: main
update:
path: ./apps/my-app
strategy: Setters
---
# 5. Kustomization - déployer
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: my-app
namespace: flux-system
spec:
interval: 5m
path: ./apps/my-app
prune: true
sourceRef:
kind: GitRepository
name: my-app-config

Workflow complet

🔝 Retour à la table des matières


5 - Bonnes pratiques

Séparer les repos

# Repo de code source (CI)
my-app/
├── src/
├── Dockerfile
└── .github/workflows/build.yaml

# Repo GitOps (Flux)
my-app-config/
├── apps/my-app/
│ ├── deployment.yaml
│ └── service.yaml
└── clusters/...

Convention de tagging

# Tags semver pour production
v1.0.0, v1.1.0, v2.0.0

# Tags avec SHA pour staging
main-abc1234-1699999999

Limiter les mises à jour

# Ne mettre à jour que les tags stables
spec:
filterTags:
pattern: '^v[0-9]+\.[0-9]+\.[0-9]+$'
policy:
semver:
range: ">=1.0.0"

🔝 Retour à la table des matières


6 - Exercices pratiques

Exercice 1 : Scanner un registry

# Créer l'ImageRepository
flux create image repository podinfo \
--image=ghcr.io/stefanprodan/podinfo \
--interval=1m

# Créer l'ImagePolicy
flux create image policy podinfo \
--image-ref=podinfo \
--select-semver=">=6.0.0"

# Vérifier
flux get image repository
flux get image policy

Quiz

Q1. Quelle est la différence entre ImageRepository et ImagePolicy ?

Réponse
  • ImageRepository : Scanne un registry et liste tous les tags disponibles
  • ImagePolicy : Définit les critères pour sélectionner le "bon" tag parmi ceux trouvés

ImageRepository collecte, ImagePolicy sélectionne.

Q2. Comment indiquer à Flux où mettre à jour l'image dans un manifest ?

Réponse

Avec un commentaire marqueur :

image: my-image:1.0.0 # {"$imagepolicy": "flux-system:my-policy"}

Le format est {"$imagepolicy": "<namespace>:<policy-name>"}.

🔝 Retour à la table des matières


Points clés à retenir

  • Image Automation = vrai GitOps (images dans Git)
  • ImageRepository : scanne les registries
  • ImagePolicy : sélectionne les versions
  • ImageUpdateAutomation : commit dans Git
  • Marqueurs pour indiquer où mettre à jour

← Chapitre précédent | Chapitre suivant : Notifications →