Quand un déploiement Helm échoue, le message d’erreur ne dit pas toujours clairement ce qui s’est passé. Ce guide vous donne une méthode systématique de diagnostic : d’abord valider le chart lui-même, puis inspecter ce qu’il génère, et enfin analyser l’état de la release. En 20 minutes, vous saurez identifier rapidement si le problème vient du chart, des values, ou du cluster.
Ce que vous allez apprendre :
- Détecter les erreurs de syntaxe avant de déployer avec
helm lint - Comprendre exactement ce que Helm va envoyer au cluster avec
helm template - Investiguer une release en échec avec
helm status,helm get - Prévisualiser les changements avec
helm diffavant un upgrade - Résoudre les erreurs les plus courantes
Pré-requis
Section intitulée « Pré-requis »- Helm v3.8+ installé
- Un chart à déboguer (ou créez-en un avec
helm create mon-chart) - Un cluster Kubernetes (optionnel pour les premières étapes)
La méthode de triage en 4 étapes
Section intitulée « La méthode de triage en 4 étapes »Quand quelque chose ne fonctionne pas, suivez cet ordre :
| Étape | Commande | Ce qu’on vérifie | Sans cluster ? |
|---|---|---|---|
| 1 | helm lint | Syntaxe du chart | ✅ Oui |
| 2 | helm template | Manifests générés | ✅ Oui |
| 3 | helm install --dry-run | Validation côté serveur | ❌ Non |
| 4 | helm status / helm get | État de la release | ❌ Non |
Pourquoi cet ordre ? Chaque étape filtre une catégorie de problèmes. Si helm lint échoue, inutile de tester le reste — le chart est syntaxiquement incorrect. Si helm template échoue, le problème vient des values ou des templates. Si --dry-run échoue, c’est un problème de validation Kubernetes.
Étape 1 — Valider la syntaxe avec helm lint
Section intitulée « Étape 1 — Valider la syntaxe avec helm lint »Pourquoi lint ?
Section intitulée « Pourquoi lint ? »helm lint analyse un chart sans le déployer et détecte :
- Les erreurs de syntaxe YAML
- Les templates Go malformés (accolades manquantes, fonctions inconnues)
- Les valeurs manquantes référencées dans les templates
- Les bonnes pratiques non respectées (icon recommandé, etc.)
Utilisation basique
Section intitulée « Utilisation basique »helm lint ./mon-chart==> Linting ./mon-chart[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, 0 chart(s) failedDécryptage du résultat :
| Niveau | Signification | Action |
|---|---|---|
[INFO] | Recommandation (non bloquant) | Optionnel à corriger |
[WARNING] | Problème potentiel | À investiguer |
[ERROR] | Erreur bloquante | Doit être corrigée |
Exemple avec erreur de template
Section intitulée « Exemple avec erreur de template »Imaginons un template qui référence une valeur inexistante :
apiVersion: v1kind: ConfigMapmetadata: name: {{ .Values.config.name }} # config n'existe pas dans values.yamlhelm lint ./mon-chart==> Linting ./mon-chart[INFO] Chart.yaml: icon is recommended[ERROR] templates/: template: mon-chart/templates/configmap.yaml:4:18: executing "mon-chart/templates/configmap.yaml" at <.Values.config.name>: nil pointer evaluating interface {}.name
Error: 1 chart(s) linted, 1 chart(s) failedCe que l’erreur vous dit :
- Fichier :
templates/configmap.yaml - Ligne : 4, colonne 18
- Problème :
.Values.config.name→configestnil(n’existe pas) - Solution : Soit ajouter
config.namedansvalues.yaml, soit utiliser{{ .Values.config.name | default "fallback" }}
Mode strict
Section intitulée « Mode strict »Le flag --strict transforme les [INFO] et [WARNING] en erreurs bloquantes :
helm lint ./mon-chart --strictQuand utiliser --strict ? En CI/CD, pour imposer le respect des bonnes pratiques. En développement local, le mode normal suffit.
Étape 2 — Voir le rendu avec helm template
Section intitulée « Étape 2 — Voir le rendu avec helm template »Pourquoi template ?
Section intitulée « Pourquoi template ? »helm template génère les manifests Kubernetes exactement comme ils seront envoyés au cluster, mais sans les déployer. C’est votre outil principal pour comprendre ce que Helm fait réellement.
Utilisation basique
Section intitulée « Utilisation basique »helm template my-release ./mon-chart---apiVersion: v1kind: ServiceAccountmetadata: name: my-release-mon-chart labels: helm.sh/chart: mon-chart-0.1.0 app.kubernetes.io/name: mon-chart app.kubernetes.io/instance: my-release app.kubernetes.io/version: "1.16.0" app.kubernetes.io/managed-by: Helm---# Source: mon-chart/templates/service.yamlapiVersion: v1kind: Service...Ce que vous devez vérifier :
| Élément | Question à se poser |
|---|---|
| Noms des ressources | Est-ce que my-release-mon-chart est cohérent ? |
| Labels | Les labels app.kubernetes.io/* sont-ils présents ? |
| Values injectées | Est-ce que replicas: 1 correspond à ce que je voulais ? |
| Ressources générées | Est-ce qu’il manque un Service ? Un ConfigMap ? |
Tester avec des values spécifiques
Section intitulée « Tester avec des values spécifiques »# Avec un fichier de valueshelm template my-release ./mon-chart -f values-prod.yaml
# Avec une surcharge inlinehelm template my-release ./mon-chart --set replicaCount=5
# Combiner les deuxhelm template my-release ./mon-chart -f values-prod.yaml --set image.tag=v2.0.0Pourquoi c’est important ? Un chart peut fonctionner avec les values par défaut mais échouer avec vos values de production. Testez toujours avec les values réelles.
Filtrer la sortie
Section intitulée « Filtrer la sortie »La sortie de helm template peut être volumineuse. Utilisez grep ou yq pour filtrer :
# Voir uniquement les Deploymentshelm template my-release ./mon-chart | grep -A 50 "kind: Deployment"
# Voir uniquement le nombre de replicashelm template my-release ./mon-chart | grep "replicas:"
# Avec yq (si installé)helm template my-release ./mon-chart | yq 'select(.kind == "Deployment")'Mode debug
Section intitulée « Mode debug »Le flag --debug ajoute des informations sur le chemin du chart et la version :
helm template my-release ./mon-chart --debuginstall.go:225: 2026-02-01 19:39:36 [debug] Original chart version: ""install.go:242: 2026-02-01 19:39:36 [debug] CHART PATH: /path/to/mon-chart
---# Source: mon-chart/templates/serviceaccount.yaml...Quand utiliser --debug ? Quand vous n’êtes pas sûr que Helm charge le bon chart (problème de chemin, de dépendances).
Étape 3 — Validation serveur avec —dry-run
Section intitulée « Étape 3 — Validation serveur avec —dry-run »Pourquoi dry-run ?
Section intitulée « Pourquoi dry-run ? »helm template génère les manifests localement, sans contacter le cluster. Certaines erreurs ne sont détectées que par l’API Kubernetes :
- CRDs manquantes
- Quotas dépassés
- Noms de ressources invalides (trop longs, caractères interdits)
- Versions d’API obsolètes
--dry-run envoie les manifests au serveur Kubernetes pour validation sans créer les ressources.
Utilisation
Section intitulée « Utilisation »helm install my-release ./mon-chart --dry-run -n mon-namespaceNAME: my-releaseLAST DEPLOYED: Sun Feb 1 19:41:13 2026NAMESPACE: mon-namespaceSTATUS: pending-installREVISION: 1HOOKS:---# Source: mon-chart/templates/tests/test-connection.yaml...MANIFEST:---# Source: mon-chart/templates/serviceaccount.yaml...Différence avec helm template :
| Aspect | helm template | helm install --dry-run |
|---|---|---|
| Nécessite un cluster | ❌ Non | ✅ Oui |
| Valide le schema K8s | ❌ Non | ✅ Oui |
| Vérifie les CRDs | ❌ Non | ✅ Oui |
| Vérifie les quotas | ❌ Non | ✅ Oui |
| Vitesse | ⚡ Instantané | 🐢 Quelques secondes |
Dry-run côté serveur vs client
Section intitulée « Dry-run côté serveur vs client »Helm propose deux modes de dry-run :
# Dry-run côté serveur (défaut depuis Helm 3.13+)helm install my-release ./mon-chart --dry-run
# Dry-run côté client (comme helm template)helm install my-release ./mon-chart --dry-run=clientUtilisez --dry-run (serveur) pour la validation complète, --dry-run=client si vous n’avez pas de cluster disponible.
Étape 4 — Diagnostiquer une release existante
Section intitulée « Étape 4 — Diagnostiquer une release existante »helm status : état général
Section intitulée « helm status : état général »Quand une release est déployée mais semble ne pas fonctionner, commencez par helm status :
helm status demo -n helm-debugNAME: demoLAST DEPLOYED: Sun Feb 1 19:40:13 2026NAMESPACE: helm-debugSTATUS: deployedREVISION: 1NOTES:1. Get the application URL by running these commands: export POD_NAME=$(kubectl get pods --namespace helm-debug ...)Ce que STATUS vous dit :
| Status | Signification | Action |
|---|---|---|
deployed | Installation/upgrade réussi | Le problème est côté K8s, pas Helm |
failed | Helm a échoué | Voir les hooks, les erreurs de validation |
pending-install | Installation en cours | Attendre ou vérifier les timeouts |
pending-upgrade | Upgrade en cours | Idem |
superseded | Ancienne révision | Normal après un upgrade |
helm get : investigation détaillée
Section intitulée « helm get : investigation détaillée »helm get récupère les informations stockées par Helm pour une release :
helm get manifest demo -n helm-debugAffiche les manifests tels qu’ils ont été envoyés à Kubernetes. Comparez avec helm template pour voir si le déploiement correspond à ce que vous attendiez.
# Uniquement les surchargeshelm get values demo -n helm-debugUSER-SUPPLIED VALUES:null# Toutes les values (défauts + surcharges)helm get values demo -n helm-debug --allCOMPUTED VALUES:affinity: {}autoscaling: enabled: false maxReplicas: 100image: pullPolicy: IfNotPresent repository: nginx...Pourquoi deux commandes ? Pour distinguer ce que vous avez fourni de ce que le chart utilise par défaut. Si vous avez un doute sur une valeur, --all vous montre la valeur finale.
helm get notes demo -n helm-debugRé-affiche les instructions post-installation (commandes port-forward, URL, etc.).
helm get all demo -n helm-debugCombine status + values + manifest + notes. Utile pour un diagnostic complet.
Bonus — Prévisualiser les changements avec helm diff
Section intitulée « Bonus — Prévisualiser les changements avec helm diff »Pourquoi diff ?
Section intitulée « Pourquoi diff ? »Avant un helm upgrade, vous voulez savoir exactement ce qui va changer. Le plugin helm-diff compare l’état actuel avec le nouvel état :
Installation
Section intitulée « Installation »helm plugin install https://github.com/databus23/helm-diffUtilisation
Section intitulée « Utilisation »helm diff upgrade demo ./mon-chart -n helm-debug --set replicaCount=3helm-debug, demo-mon-chart, Deployment (apps) has changed: spec: replicas: 1 replicas: 3Ce que diff vous montre :
- Les lignes supprimées (préfixe
-) - Les lignes ajoutées (préfixe
+) - Les ressources qui vont être créées/supprimées
Top 5 des erreurs et solutions
Section intitulée « Top 5 des erreurs et solutions »1. “cannot re-use a name that is still in use”
Section intitulée « 1. “cannot re-use a name that is still in use” »Error: INSTALLATION FAILED: cannot re-use a name that is still in useCause : Vous faites helm install sur une release qui existe déjà.
Solution : Utilisez helm upgrade --install (idempotent) ou un autre nom de release.
helm upgrade --install demo ./mon-chart -n helm-debug2. “release: not found”
Section intitulée « 2. “release: not found” »Error: release: not foundCause : La release n’existe pas dans ce namespace.
Solution : Vérifiez le namespace et le nom de la release.
helm list -A # Liste toutes les releases dans tous les namespaces3. “nil pointer evaluating interface .xxx”
Section intitulée « 3. “nil pointer evaluating interface .xxx” »Error: template: mon-chart/templates/configmap.yaml:4:18: nil pointer evaluating interface {}.nameCause : Un template référence .Values.something.nested mais something n’existe pas.
Solution : Ajouter la valeur dans values.yaml ou utiliser une valeur par défaut :
# Option 1 : Ajouter dans values.yamlsomething: nested: "valeur"
# Option 2 : Valeur par défaut dans le template{{ .Values.something.nested | default "fallback" }}
# Option 3 : Condition dans le template{{- if .Values.something }}{{ .Values.something.nested }}{{- end }}4. “UPGRADE FAILED: another operation in progress”
Section intitulée « 4. “UPGRADE FAILED: another operation in progress” »Error: UPGRADE FAILED: another operation (install/upgrade/rollback) is in progressCause : Une opération précédente a été interrompue (Ctrl+C, timeout, crash).
Solution : Attendez quelques minutes ou forcez le rollback :
# Voir l'historiquehelm history demo -n helm-debug
# Rollback à la dernière version stablehelm rollback demo 1 -n helm-debug5. “YAML parse error”
Section intitulée « 5. “YAML parse error” »Error: YAML parse error on mon-chart/templates/deployment.yaml: error converting YAML to JSON: yaml: line 12: found character that cannot start any tokenCause : Erreur de syntaxe YAML (indentation, caractères spéciaux).
Solution : Vérifiez l’indentation et utilisez des quotes pour les valeurs spéciales :
# ❌ Mauvaisenv: - name: PASSWORD value: mon:motdepasse # : pose problème
# ✅ Bonenv: - name: PASSWORD value: "mon:motdepasse" # Quotes = okRésumé de la méthode de debug
Section intitulée « Résumé de la méthode de debug »-
helm lint— Syntaxe du chart OK ? -
helm template— Manifests générés corrects ? -
helm diff— Changements attendus ? -
helm install --dry-run— Validation serveur OK ? -
helm status/helm get— État de la release ?
À retenir
Section intitulée « À retenir »| Commande | Usage | Sans cluster |
|---|---|---|
helm lint | Valider la syntaxe du chart | ✅ |
helm template | Voir les manifests générés | ✅ |
helm diff upgrade | Prévisualiser les changements | ❌ |
helm install --dry-run | Validation serveur | ❌ |
helm status | État d’une release | ❌ |
helm get manifest | Manifests déployés | ❌ |
helm get values | Values utilisées | ❌ |