Image Automation
Table des matières
- Concept
- Image Reflector Controller
- Image Automation Controller
- Configuration complète
- Bonnes pratiques
- Exercices pratiques
1 - Concept
Qu'est-ce que l'Image Automation ?
L'Image Automation permet à Flux de :
- Scanner les registries pour de nouvelles images
- Mettre à jour automatiquement les références dans Git
- Déclencher un déploiement GitOps
Avantages
| Avantage | Description |
|---|---|
| True GitOps | Même les images sont dans Git |
| Auditabilité | Chaque changement est un commit |
| Rollback facile | git revert |
| Pas de credentials CI | CI 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