Lab 11.1 : Utiliser Helm¶
| Durée | 60 à 75 min |
| Niveau | Guidé |
| Prérequis | Lab 3.1 réalisé (Services NodePort), cours du chapitre 11 lu, cluster Ready, accès Internet depuis les VMs |
| Acquis visés | AA7 |
Objectifs
- Installer Helm et vérifier qu'il accède au cluster
- Ajouter un dépôt de charts, chercher un chart et lire ses values
- Installer une release avec une version de chart fixée
- Personnaliser une release avec un fichier de values
- Mettre à jour une release, lire son historique et revenir en arrière après un échec
- Désinstaller une release et constater ce qui est supprimé
Contexte et schéma¶
Vous installez une petite application web publique, podinfo, à partir de son chart Helm. Vous la configurez, la mettez à jour, provoquez une mise à jour ratée, puis revenez à la révision saine.
flowchart LR
R["Dépôt de charts<br/>(Internet)"] -- "helm install" --> H["Helm<br/>(sur le serveur)"]
V["values-demo.yaml"] --> H
H -- "objets rendus" --> C["Cluster k3s<br/>namespace tp-k8s"]
H -- "historique" --> S[("Secrets<br/>sh.helm.release.v1.*")]
C --- S
Application utilisée
Le chart podinfo est un exemple public très utilisé dans les démonstrations Kubernetes. L'application est légère (quelques Mo de mémoire par Pod) et renvoie un message JSON configurable, ce qui convient à des VMs de 2 Go.
Étapes¶
Étape 1 : Installer Helm¶
Sur le serveur où vous lancez kubectl :
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
helm version
Notez la version affichée. Vérifiez que Helm voit votre cluster :
La commande doit répondre sans erreur (la liste peut être vide, ou contenir les composants de k3s). Si elle signale Kubernetes cluster unreachable, consultez le tableau de dépannage.
-
helm versionaffiche une version -
helm list -Arépond sans erreur
Étape 2 : Préparer le namespace et le dépôt¶
k create namespace tp-k8s
k config set-context --current --namespace=tp-k8s
helm repo add podinfo https://stefanprodan.github.io/podinfo
helm repo update
helm search repo podinfo
Listez toutes les versions disponibles du chart :
La colonne CHART VERSION donne la version du chart ; APP VERSION celle de l'application. Choisissez la deuxième ligne de la liste (une version légèrement plus ancienne que la dernière) et gardez-la dans une variable :
Regardez les values configurables :
Repérez au moins replicaCount, image, ui.message, service et resources.
Pourquoi fixer la version du chart ?
Sans --version, Helm installe la dernière version publiée : deux installations à des dates différentes ne donneraient pas le même résultat.
- Le dépôt
podinfoest déclaré - La variable
CHARTVERcontient une version du chart
Étape 3 : Installer une release¶
La sortie résume la release (nom, namespace, STATUS: deployed, REVISION: 1) et affiche les notes du chart. Observez ensuite ce que Helm a créé :
Le Deployment et le Service portent le nom demo-podinfo : le nom de la release sert de préfixe, comme dans les templates du cours (.Release.Name).
- La release
demoest endeployed, révision 1 - Le Pod
demo-podinfo-...estRunning
Étape 4 : Inspecter la release¶
helm get values demo -n tp-k8s
helm get values demo -n tp-k8s --all | head -20
helm get manifest demo -n tp-k8s | head -40
k get secrets
helm get values: les valeurs que vous avez fournies (aucune pour l'instant).--all: toutes les valeurs, défauts compris.helm get manifest: les manifestes rendus et envoyés au cluster.- Le Secret
sh.helm.release.v1.demo.v1est l'enregistrement de la révision 1.
Testez l'application depuis le serveur :
Notez le champ message de la réponse. Il vient de la valeur ui.message du chart.
- Vous avez trouvé le Secret de la révision 1
- La réponse JSON de l'application est affichée
Étape 5 : Exposer en NodePort et personnaliser (révision 2)¶
Créez un fichier de values :
cat <<'EOF2' > values-demo.yaml
replicaCount: 2
ui:
message: "Bonjour depuis ma release Helm"
service:
type: NodePort
EOF2
Avant d'appliquer, affichez ce que Helm va rendre :
helm template demo podinfo/podinfo --version $CHARTVER -f values-demo.yaml | grep -E "replicas:|type:|PODINFO_UI_MESSAGE" -A1
Appliquez ensuite la mise à jour :
helm upgrade demo podinfo/podinfo --version $CHARTVER -f values-demo.yaml -n tp-k8s
helm history demo -n tp-k8s
k get pods
k get svc demo-podinfo
Testez le NodePort depuis le serveur :
NODEPORT=$(k get svc demo-podinfo -o jsonpath='{.spec.ports[0].nodePort}')
NODEIP=$(k get nodes -o jsonpath='{.items[0].status.addresses[0].value}')
curl -s http://$NODEIP:$NODEPORT | grep -i message
Le message doit être celui de votre fichier.
-
helm historymontre deux révisions (la première ensuperseded, la seconde endeployed) - Deux Pods tournent
- Le message personnalisé apparaît dans la réponse
Étape 6 : Mise à jour de la version du chart (révision 3)¶
Choisissez maintenant la dernière version du chart et mettez la release à jour en conservant vos values :
LATEST=<dernière-version-du-chart>
helm upgrade demo podinfo/podinfo --version $LATEST -f values-demo.yaml -n tp-k8s
helm history demo -n tp-k8s
k get pods
Notez : l'application a été mise à jour par un rolling update (chapitre 2), mais votre configuration est restée celle de values-demo.yaml.
- La révision 3 est
deployed - Le message personnalisé est toujours présent
Étape 7 : Provoquer un échec, puis revenir en arrière¶
Simulez une mise à jour avec une image qui n'existe pas :
helm upgrade demo podinfo/podinfo --version $LATEST -f values-demo.yaml \
--set image.tag=0.0.0-inexistant --wait --timeout 60s -n tp-k8s
Au bout de 60 secondes, Helm signale l'échec. Observez :
- La révision 4 est en
failed. - Un nouveau Pod est en
ImagePullBackOffouErrImagePull, mais les Pods de la révision 3 continuent de servir : le rolling update ne retire pas les anciens Pods tant que les nouveaux ne sont pas prêts.
Revenez à la dernière révision saine (la 3) :
helm rollback demo 3 -n tp-k8s
helm history demo -n tp-k8s
k get pods
curl -s http://$NODEIP:$NODEPORT | grep -i message
La révision 5 apparaît : c'est une nouvelle révision dont le contenu est celui de la révision 3.
- La révision 4 est
failed - Après le rollback, la révision 5 est
deployedet les Pods sontRunning - L'application répond avec votre message
Étape 8 : Désinstaller¶
La release, ses objets et ses Secrets d'historique disparaissent.
- Plus aucun objet
demo-podinfo - Plus de Secret
sh.helm.release.v1.demo.*
Questions de réflexion¶
Que contient helm get values demo juste après l'étape 3, et pourquoi ?
Rien (ou null) : cette commande affiche uniquement les valeurs fournies par l'utilisateur. Les valeurs par défaut du chart s'affichent avec --all.
Pourquoi les anciens Pods ont-ils continué à servir pendant l'échec de l'étape 6 ?
Le Deployment applique un rolling update : il ne supprime les anciens Pods que lorsque les nouveaux sont prêts. Le nouveau Pod n'a jamais démarré (image introuvable), donc les anciens ont été conservés.
Que se passe-t-il si vous lancez helm upgrade sans -f values-demo.yaml à l'étape 5 ?
Helm repart des valeurs par défaut du chart : replicaCount revient à sa valeur par défaut, le message et le type de Service aussi. Pour conserver les valeurs précédentes, il faut redonner le fichier -f (ou utiliser --reuse-values, à manier avec précaution). Un fichier de values versionné est la pratique recommandée.
Pourquoi le rollback crée-t-il la révision 5 plutôt que de revenir à la 3 ?
L'historique de Helm est en ajout seulement : chaque opération crée une révision. Le rollback copie le contenu de la révision demandée dans une nouvelle révision, ce qui conserve la trace complète de ce qui s'est passé.
Quel avantage a --wait --timeout pour un pipeline automatisé ?
Helm n'indique la réussite que lorsque les ressources sont prêtes. Sans --wait, la commande réussit dès que les objets sont créés, même si les Pods ne démarrent jamais, et le pipeline continuerait à tort.
Dépannage¶
| Symptôme | Pistes |
|---|---|
helm: command not found |
Le script n'a pas terminé ; relancer ./get_helm.sh ; vérifier /usr/local/bin/helm |
| Échec du téléchargement du script | Accès Internet des VMs ; essayer à nouveau, ou demander à l'enseignant le binaire |
Kubernetes cluster unreachable |
Variable KUBECONFIG absente : export KUBECONFIG=~/.kube/config, ou voir la copie de /etc/rancher/k3s/k3s.yaml du Lab 1.1 |
permission denied sur le fichier kubeconfig |
Fichier lisible seulement par root : le copier dans ~/.kube/config avec les bons droits |
helm repo add échoue |
Accès Internet, URL mal recopiée |
chart "podinfo" matching ... not found |
helm repo update non fait, ou version du chart inexistante : relire helm search repo --versions |
cannot re-use a name that is still in use |
La release demo existe déjà : helm list -n tp-k8s, puis helm uninstall ou helm upgrade |
Pod ImagePullBackOff en dehors de l'étape 6 |
Accès Internet ou limitation du registre ; k describe pod |
curl sur le NodePort sans réponse |
Mauvais NODEIP ou NODEPORT (echo), pare-feu ufw de la VM, Service encore en ClusterIP (upgrade non appliqué) |
helm upgrade refusé : another operation is in progress |
Une opération précédente interrompue : helm history, puis helm rollback vers une révision saine |
Nettoyage¶
helm uninstall demo -n tp-k8s 2>/dev/null
helm repo remove podinfo
k delete namespace tp-k8s
k config set-context --current --namespace=default
rm -f get_helm.sh values-demo.yaml
Gardez Helm installé : vous en aurez besoin au Lab 11.2.