Introduction
Helm est le gestionnaire de paquets pour Kubernetes, mais au-delà des commandes de base helm install et helm upgrade, il existe un ensemble de concepts avancés qui rendent les charts prêts pour la production, réutilisables et résilients. Cet article explique ces concepts avec des exemples pratiques, en se concentrant sur leur fonctionnement, quand les utiliser et comment ils interagissent avec l'API Kubernetes et le cycle de vie des releases Helm.
Vous découvrirez les hooks Helm et leur rôle dans l'orchestration des phases de release, le cycle de vie Helm et sa gestion de l'ordre des ressources, les sous-charts et les valeurs globales, les tests de charts comme mécanisme de vérification, et les stratégies de mise à niveau avancées telles que les rollbacks et les mises à niveau atomiques. Pour chaque concept, nous fournissons une commande ou un extrait de configuration concret, expliquons la sortie attendue et détaillons les signaux d'échec et les étapes de récupération.
L'objectif est la sécurité opérationnelle : observer avant de modifier, limiter le rayon d'impact, utiliser des espaces réservés au lieu de secrets, vérifier le résultat et documenter comment récupérer si l'état attendu n'est pas atteint. Que vous soyez un développeur qui package une application ou un opérateur qui gère des releases, ces concepts vous aideront à éviter les pièges courants et à renforcer votre confiance dans vos workflows Helm.
Inventaire de version et d'environnement
Avant de plonger dans les concepts avancés, établissez une base de référence de votre environnement Helm. Cet inventaire garantit que les commandes et les exemples sont pertinents pour votre version et la configuration de votre cluster.
Identifiez la version installée et la topologie de déploiement.
Exécutez la commande en lecture seule suivante depuis votre poste de travail ou votre environnement CI :
helm version --short
Exemple de sortie attendue :
v3.12.2+g4ed1b23
Si la commande échoue avec helm: command not found, Helm n'est pas installé ou n'est pas dans votre PATH. Vérifiez l'installation en suivant le guide d'installation officiel de Helm pour votre système d'exploitation. Vérifiez également que kubectl est configuré et peut atteindre votre cluster :
kubectl cluster-info
Exemple de sortie :
Kubernetes control plane is running at https://192.168.1.100:6443
Si la connexion est refusée, assurez-vous que votre fichier kubeconfig est valide et que le cluster est accessible.
Capturez l'état observable actuel.
Listez toutes les releases Helm dans le namespace actuel avec leur statut et leur révision :
helm list --namespace <NAMESPACE>
Exemple de sortie :
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
my-release default 3 2023-09-15 10:20:30.123456 +0000 UTC deployed my-chart-0.1.0 1.16.0
Une release bloquée en pending-install ou failed indique un problème qui doit être résolu avant de continuer.
Prérequis et rayon d'impact.
- Version Helm 3.10 ou supérieure recommandée pour un support complet des hooks.
- Cluster Kubernetes 1.22+ pour des versions d'API stables.
- Permissions RBAC pour créer des ressources dans le namespace cible.
- Un propriétaire décisionnaire : pour cet article, supposons que le propriétaire responsable désigné est le Release Manager (par exemple, Priya Shah, responsable ingénierie). Ce propriétaire approuve tout changement qui affecte un cluster partagé.
Chemin de récupération.
Si les commandes d'environnement échouent, réinstallez Helm avec le gestionnaire de paquets officiel, vérifiez la connectivité kubectl et assurez-vous que le contexte du cluster est correct avant toute tentative d'installation.
Chemin de configuration sécurisé
Les charts Helm sont configurés via values.yaml. L'utilisation avancée implique la gestion de plusieurs sources de valeurs, éviter les fuites de secrets et valider les changements en toute sécurité.
Observation avant changement.
Récupérez les valeurs actuelles d'une release :
helm get values my-release --namespace <NAMESPACE>
Exemple de sortie :
replicaCount: 2
image:
repository: nginx
tag: "1.25"
service:
type: ClusterIP
Plus petit changement justifié.
Au lieu de modifier values.yaml directement, créez un fichier de surcharge ou utilisez --set pour un changement unique et limité. Par exemple, pour changer le nombre de réplicas de 2 à 3 :
helm upgrade my-release myrepo/my-chart --namespace <NAMESPACE> --set replicaCount=3 --dry-run
Le drapeau --dry-run simule la mise à niveau sans modifier le cluster. La sortie attendue inclut les manifestes Kubernetes générés avec replicas: 3. Examinez le diff avant la mise à niveau réelle :
helm diff upgrade my-release myrepo/my-chart --namespace <NAMESPACE> --set replicaCount=3
Si helm diff n'est pas disponible, installez le plugin helm-diff. Cette commande affiche un diff unifié des changements.
Rayon d'impact et vérification.
Une mise à niveau échouée peut laisser une release dans un état failed. Pour minimiser le risque, utilisez --atomic pour un rollback automatique en cas d'échec :
helm upgrade my-release myrepo/my-chart --namespace <NAMESPACE> --set replicaCount=3 --atomic
En cas de succès, sortie :
Release "my-release" has been upgraded. Happy Helming!
Vérifiez le statut du déploiement :
kubectl rollout status deployment/my-release-nginx --namespace <NAMESPACE>
Sortie attendue :
deployment "my-release-nginx" successfully rolled out
Ne placez jamais de véritables informations d'identification dans les valeurs. À la place, référencez des Secrets Kubernetes ou utilisez --set-file avec des fichiers temporaires. Exemple d'espace réservé pour une valeur secrète :
# values.secret.yaml pour le développement uniquement
apiKey: "REPLACE_WITH_REAL_KEY"
Vérification et diagnostic
La vérification dans Helm va au-delà de la vérification du statut des pods. Helm fournit des tests intégrés et des hooks pour la validation.
Tests Helm.
Définissez des tests dans votre chart sous templates/tests/. Exemple test-connection.yaml :
apiVersion: v1
kind: Pod
metadata:
name: {{ include "mychart.fullname" . }}-test-connection
labels:
{{- include "mychart.labels" . | nindent 4 }}
annotations:
"helm.sh/hook": test
spec:
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "mychart.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never
Exécutez les tests après une installation ou une mise à niveau :
helm test my-release --namespace <NAMESPACE>
Sortie attendue :
NAME: my-release
LAST DEPLOYED: ...
NAMESPACE: default
STATUS: deployed
REVISION: 4
TEST SUITE: my-release-test-connection
Last Started: ...
Last Completed: ...
Phase: Succeeded
Si le test échoue, la phase sera Failed. Inspectez les journaux :
kubectl logs my-release-test-connection --namespace <NAMESPACE>
Échec courant : nom de service ou port mal configuré. Ajustez les arguments du test en conséquence.
Diagnostic des échecs de release.
Lorsqu'une release est dans l'état failed, récupérez son statut et les événements récents :
helm status my-release --namespace <NAMESPACE>
kubectl get events --namespace <NAMESPACE> --sort-by=.metadata.creationTimestamp
Exemple d'événement indiquant un échec :
Warning FailedCreate replicaset/my-release-6f8c9d7b9 Error creating: pods "my-release-6f8c9d7b9-" is forbidden: unable to validate against any pod security policy
Cela indique des restrictions RBAC ou PodSecurityPolicy manquantes. Résolvez en ajustant les permissions ou le contexte de sécurité.
Modes d'échec et récupération
Les opérations Helm avancées peuvent échouer pour de nombreuses raisons : chart invalide, permissions insuffisantes, erreurs de l'API Kubernetes ou délais d'attente des hooks. Comprendre les modes d'échec courants et les stratégies de récupération est essentiel.
Délai d'attente du hook.
Les hooks ont un délai d'attente par défaut de 5 minutes. Si un hook de pré-mise à niveau prend plus de temps, la release échoue avec context deadline exceeded. Pour augmenter le délai par hook :
metadata:
annotations:
"helm.sh/hook": pre-upgrade
"helm.sh/hook-delete-policy": hook-succeeded
"helm.sh/hook-timeout": "10m"
Si un hook échoue et bloque la release, vous devrez peut-être supprimer manuellement les ressources du hook :
kubectl delete job my-release-hook --namespace <NAMESPACE>
Ensuite, réessayez la mise à niveau.
Procédure de rollback.
Pour revenir à une révision précédente :
helm rollback my-release 1 --namespace <NAMESPACE>
Sortie attendue :
Rollback was a success! Happy Helming!
Vérifiez la révision et le statut de la release :
helm list --namespace <NAMESPACE>
Le numéro de révision augmente après un rollback. Si le rollback échoue en raison d'un secret manquant, vérifiez helm history my-release --namespace <NAMESPACE> et assurez-vous que le secret de révision existe.
Rollback atomique.
L'utilisation de --atomic dans helm upgrade effectue automatiquement un rollback en cas d'échec. Cependant, si la mise à niveau réussit mais que l'application n'est pas saine, un rollback manuel peut être nécessaire. Testez toujours le rollback dans un environnement de staging.
Liste de contrôle des opérations
Cette liste de contrôle résume les étapes clés pour une utilisation sûre et réussie des concepts avancés de Helm. Chaque élément a un propriétaire et une fréquence de révision.
| Étape | Propriétaire | Fréquence | Commande de vérification |
|---|---|---|---|
| Confirmer la version de Helm et la connectivité du cluster | Release Manager (Priya Shah) | Avant chaque utilisation | helm version && kubectl cluster-info |
| Examiner les valeurs actuelles de la release | Release Manager | Avant chaque changement | helm get values <release> -n <ns> |
| Tester la mise à niveau en mode dry-run | Développeur (Alex Chen) | À chaque changement de chart | helm upgrade --dry-run --debug |
| Exécuter les tests du chart après installation/mise à niveau | Développeur (Alex Chen) | Après chaque installation/mise à niveau | helm test <release> -n <ns> |
| Valider la procédure de rollback | Ingénieur opérations (Sam Lee) | Mensuellement | helm rollback <release> 0 --dry-run (si pris en charge ; sinon tester en staging) |
| Sauvegarder les métadonnées de release (secrets) | Ingénieur opérations (Sam Lee) | Hebdomadairement | kubectl get secrets -l owner=helm -n <ns> -o yaml > backup.yaml |
| Examiner et mettre à jour les délais d'attente des hooks | Release Manager | Trimestriellement | Inspecter les annotations de hook dans les modèles de chart |
La fréquence de révision est un minimum ; ajustez en fonction du taux de changement.
Pièges courants et comment les éviter
- Ignorer les politiques de suppression des hooks. Les hooks qui ne sont pas nettoyés peuvent encombrer le namespace et causer des conflits. Définissez
helm.sh/hook-delete-policy: hook-succeededpour les ressources éphémères comme les pods de test.
- Utiliser le tag
latestdans les images. Cela rend les releases non reproductibles et casse la sémantique de rollback. Épinglez toujours les tags d'image à des versions spécifiques.
- Stocker des secrets dans des valeurs en clair. Même si les valeurs ne sont pas commitées dans git, elles peuvent être exposées dans
helm get values. Utilisez des Secrets Kubernetes ou des outils de gestion de secrets externes avec--setréférençant des noms de secrets.
- Oublier de mettre à jour les dépendances. Si vous utilisez des sous-charts, exécutez
helm dependency updateavant de packager pour vous assurer que le répertoirecharts/est à jour.
- Supposer que
--waitest suffisant.--waitattend que les ressources soient prêtes mais ne détecte pas les conditions de santé personnalisées. Utilisez les tests Helm pour une vérification au niveau de l'application.
La récupération de ces pièges implique généralement de corriger la configuration, de supprimer les ressources de hook obsolètes et de déployer progressivement les changements en utilisant les drapeaux --atomic et --timeout.
Conclusion
Les concepts avancés de Helm fournissent des mécanismes puissants pour gérer des déploiements Kubernetes complexes. En comprenant les hooks, la gestion du cycle de vie, la composition de sous-charts, les tests et les pratiques de mise à niveau sûres, vous pouvez automatiser les releases en toute confiance. Observez toujours avant de modifier, utilisez des dry-runs et des drapeaux atomiques, vérifiez avec des tests et ayez un plan de rollback prêt.
Comme prochaine étape, choisissez une vérification à faible risque dans cet article. Exécutez helm version et helm list pour observer votre état actuel, puis essayez une mise à niveau --dry-run sur une release non production. Examinez la sortie avec votre équipe, puis implémentez le changement avec --atomic. Enfin, exécutez helm test pour confirmer que l'application fonctionne comme prévu. Cette pratique construira une base solide pour une utilisation avancée de Helm.
Un workflow technique fiable rend les échecs visibles, protège les valeurs sensibles, limite les changements à la ressource prévue et définit la vérification de récupération avant qu'un incident ne force la décision. Avec Helm, cela signifie adopter le contrôle de version pour les charts, les tests automatisés dans CI/CD et des exercices réguliers de rollback.