Aller au contenu
CI/CD & Automatisation medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Flux CD — Déploiements Helm avec HelmRelease

9 min de lecture

Flux CD gère les releases Helm de façon déclarative via le HelmRelease CRD. Plutôt que d’exécuter helm upgrade --install dans un pipeline CI, vous déclarez l’état voulu dans Git et le helm-controller de Flux s’occupe des installs, upgrades et rollbacks. Ce guide explique comment configurer un HelmRepository, un HelmRelease et définir une stratégie de remediation robuste.

  • Déclarer un HelmRepository pour référencer un dépôt de charts Helm
  • Créer un HelmRelease avec les values de votre choix
  • Surcharger les values par environnement sans dupliquer les fichiers
  • Configurer une stratégie de remediation (retry, rollback, uninstall)
  • Pointer vers un chart stocké dans votre Git ou dans un registre OCI
  • Diagnostiquer une release Helm en échec
  • Flux bootstrappé et fonctionnel (flux check tout en vert)
  • Connaissance des concepts de base Helm (chart, values, release)

Flux utilise deux objets pour gérer les charts Helm :

HelmRepository → HelmChart → HelmRelease
  1. HelmRepository : déclare un dépôt de charts (un index.yaml). Le source-controller le télécharge périodiquement.
  2. HelmChart : résout un chart spécifique depuis un HelmRepository. Il est souvent créé automatiquement par le helm-controller à partir d’un HelmRelease — vous n’avez généralement pas besoin de le créer manuellement.
  3. HelmRelease : déclare l’état voulu d’une release Helm (chart + version + values). C’est l’objet que vous créez et gérez.

Voici comment déclarer le dépôt de charts Bitnami :

infrastructure/sources/bitnami.yaml
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: bitnami
namespace: flux-system
spec:
interval: 1h
url: https://charts.bitnami.com/bitnami

Bonnes pratiques :

  • Placez les HelmRepository dans infrastructure/sources/ pour les partager entre toutes les applications.
  • Utilisez un intervalle long (1h) car les index Helm ne changent pas fréquemment.

Vérifiez que le dépôt est accessible :

Fenêtre de terminal
flux get source helm
# NAME REVISION SUSPENDED READY MESSAGE
# bitnami sha256:a1b2c3... False True stored artifact: revision 'sha256:a1b2c3'
apps/base/nginx/helmrelease.yaml
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: nginx
namespace: web
spec:
interval: 5m
chart:
spec:
chart: nginx
version: ">=18.0.0 <19.0.0"
sourceRef:
kind: HelmRepository
name: bitnami
namespace: flux-system
values:
replicaCount: 2
service:
type: ClusterIP

Points clés :

  • chart.spec.version accepte des contraintes SemVer : ">=18.0.0 <19.0.0", "18.x.x", "18.1.0" (version exacte recommandée en production).
  • chart.spec.sourceRef pointe vers le HelmRepository déclaré plus tôt.
  • values surcharge directement les valeurs du chart.

Pour gérer des values différentes par environnement sans dupliquer le fichier, utilisez valuesFrom avec des ConfigMap ou des Secret :

apps/production/nginx/helmrelease.yaml
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: nginx
namespace: web
spec:
interval: 5m
chart:
spec:
chart: nginx
version: "18.2.4"
sourceRef:
kind: HelmRepository
name: bitnami
namespace: flux-system
values:
replicaCount: 3
valuesFrom:
- kind: ConfigMap
name: nginx-prod-values
valuesKey: values.yaml
- kind: Secret
name: nginx-prod-secrets
valuesKey: secrets.yaml
optional: true

Le champ valuesFrom permet de séparer les values publiques (ConfigMap) des values sensibles (Secret), et de les versionner séparément.

Par défaut, si une release Helm échoue, Flux ne fait rien. C’est un comportement correct pour éviter des boucles d’upgrades, mais en production vous voulez définir une stratégie explicite.

spec:
install:
remediation:
retries: 3

Si l’installation échoue, Flux réessaie 3 fois avant de s’arrêter avec READY: False.

spec:
upgrade:
remediation:
retries: 3
strategy: rollback # ou "uninstall"
remediateLastFailure: true
  • strategy: rollback — revient à la version précédente si l’upgrade échoue.
  • strategy: uninstall — désinstalle la release en cas d’échec.
  • remediateLastFailure: true — applique la stratégie même si c’est le dernier retry qui a échoué (sans cette option, le dernier échec reste dans l’état failed).
spec:
interval: 5m
install:
remediation:
retries: 3
upgrade:
remediation:
retries: 3
strategy: rollback
remediateLastFailure: true
rollback:
timeout: 5m
cleanupOnFail: false

Flux peut aussi déployer un chart Helm stocké directement dans votre dépôt Git (utile pour les charts maison) :

apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: my-chart
namespace: my-app
spec:
interval: 5m
chart:
spec:
chart: ./charts/my-chart # Chemin relatif dans la source Git
sourceRef:
kind: GitRepository
name: fleet-infra
namespace: flux-system
values:
replicaCount: 1

Les charts Helm peuvent aussi être stockés dans un registre OCI (GitHub Container Registry, Docker Hub, Harbor…) :

infrastructure/sources/my-registry.yaml
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: OCIRepository
metadata:
name: my-charts
namespace: flux-system
spec:
interval: 5m
url: oci://ghcr.io/my-org/charts
ref:
tag: latest
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: my-app
namespace: my-app
spec:
interval: 5m
chartRef:
kind: OCIRepository
name: my-charts
namespace: flux-system
values:
replicaCount: 2
  1. Inspecter l’état de la HelmRelease
Fenêtre de terminal
flux get helmreleases -A
# NAMESPACE NAME REVISION SUSPENDED READY MESSAGE
# web nginx 18.2.4 False False Helm upgrade failed: ...
  1. Voir le détail de l’erreur
Fenêtre de terminal
kubectl describe helmrelease nginx -n web
# Cherchez la section "Events:" en bas de la sortie
  1. Inspecter les logs du helm-controller
Fenêtre de terminal
kubectl logs -n flux-system deploy/helm-controller | grep "nginx" | tail -20
  1. Vérifier que la Source est prête
Fenêtre de terminal
flux get source helm
# Si READY: False, le dépôt Helm est inaccessible
  1. Forcer une nouvelle tentative
Fenêtre de terminal
# Annuler l'état d'échec et relancer
flux reconcile helmrelease nginx -n web --reset
CommandeDescription
flux get helmreleases -ALister toutes les releases Helm
flux reconcile helmrelease <nom> -n <ns>Forcer une réconciliation
flux reconcile helmrelease <nom> -n <ns> --resetRéinitialiser l’état d’échec et relancer
flux suspend helmrelease <nom> -n <ns>Suspendre une release
flux resume helmrelease <nom> -n <ns>Reprendre une release suspendue
helm history <nom> -n <ns>Voir l’historique des upgrades Helm
helm rollback <nom> -n <ns>Rollback manuel (contourne Flux)
  • HelmRepository déclare un dépôt de charts — à placer dans infrastructure/sources/.
  • HelmRelease déclare l’état voulu d’une release Helm (chart + version + values).
  • valuesFrom permet de séparer les values sensibles (Secret) des publiques (ConfigMap).
  • Toujours définir une upgrade.remediation avec strategy: rollback en production.
  • flux reconcile helmrelease --reset relance une release bloquée en état d’échec.
  • Ne pas faire de helm rollback manuel — laissez Flux gérer la remediation.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn