Trois pods, trois pannes
Un pod en panne est un pod dont le statut n’est pas Running. Les trois statuts les plus courants sont ImagePullBackOff, Pending et CrashLoopBackOff, et deux commandes, kubectl describe et kubectl logs, suffisent à nommer la panne.
Vous êtes de garde à l’atelier d’impression d’un lycée. Trois services ne démarrent pas, et personne ne sait pourquoi. Vous avez dix minutes.
À la fin de cette leçon
Remarque
Je peux lire describe et logs et nommer la panne d’un pod qui ne démarre pas.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| ImagePullBackOff | Kubernetes ne trouve pas l’image du conteneur | ErrImagePull |
| Pending | le pod attend encore une place sur un nœud | |
| CrashLoopBackOff | le programme s’arrête, et Kubernetes le relance sans fin | |
| Événement | une phrase que Kubernetes écrit sur ce qu’il tente | |
| Journal | ce que le programme du pod a écrit | |
| Code de sortie | le nombre rendu quand un programme s’arrête | 3 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Fabriquer trois pannes pour les lire
Les six Runs suivants créent un espace atelier et trois Deployments, chacun cassé à sa façon. imprimante nomme une image qui n’existe pas : busyboxx, avec deux x. gros-calcul demande 64 Gi de mémoire, bien plus que la machine. connexion écrit un message d’erreur puis s’arrête avec le code 3.
Chacun affiche deployment.apps/… created, resource requirements updated ou scaled.
Créer l’espace atelier
kubectl create namespace atelierAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lancer un Deployment à l’image fausse
kubectl create deployment imprimante --image=busyboxx:1.37.0 -n atelier -- sleep 3600Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Créer un Deployment sans pod
kubectl create deployment gros-calcul --image=busybox:1.37.0 --replicas=0 -n atelier -- sleep 3600Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lui demander 64 Gi de mémoire
kubectl set resources deployment/gros-calcul -n atelier --requests=memory=64GiAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lui demander un pod
kubectl scale deployment gros-calcul --replicas=1 -n atelierAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lancer un programme qui plante
kubectl create deployment connexion --image=busybox:1.37.0 -n atelier -- sh -c 'echo "base de donnees introuvable"; exit 3'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
La colonne STATUS donne le premier indice
Attendez une vingtaine de secondes, puis lisez le tableau. Il montre trois pods, chacun avec 0/1 dans READY. imprimante est en ImagePullBackOff, ou en ErrImagePull un instant avant. gros-calcul est en Pending. connexion est en Error ou en CrashLoopBackOff, selon l’instant.
Le statut dit quoi. Pour savoir pourquoi, il faut lire les événements, ou le journal.
Lire le tableau des pods
kubectl get pods -n atelierAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple travaillé : du statut à la commande
| Statut | Ce que cela veut dire | Où chercher |
|---|---|---|
| ErrImagePull, ImagePullBackOff | L’image est introuvable | describe : la phrase Failed to pull image |
| Pending | Aucun nœud ne peut accueillir le pod | describe : la phrase Insufficient |
| Error, CrashLoopBackOff | Le programme s’arrête | logs, puis le code de sortie |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une image introuvable se lit dans describe
kubectl describe pod écrit tout ce que Kubernetes sait d’un pod, et finit par ses événements. Cette liste est trop longue pour un Run : le filtre grep -o garde la seule phrase utile.
Le Run affiche Failed to pull image "busyboxx:1.37.0" : Kubernetes a cherché cette image et ne l’a pas trouvée. Le nom est faux d’une lettre.
Lire pourquoi l’image échoue
kubectl describe pod -n atelier -l app=imprimante | grep -o 'Failed to pull image "[^"]*"' | head -n 1Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un pod Pending attend une place
Pour gros-calcul, les événements disent que le nœud n’a pas la mémoire demandée. Le Run suivant affiche Insufficient memory.
Aucune image n’est en cause et le programme n’a pas démarré. Il faut demander moins de mémoire, ou ajouter une machine.
Lire pourquoi le pod attend
kubectl describe pod -n atelier -l app=gros-calcul | grep -o "Insufficient memory" | head -n 1Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Un programme qui plante se lit dans logs
Pour connexion, le conteneur a bien démarré, puis il s’est arrêté. Ce qu’il a écrit avant de s’arrêter se lit avec kubectl logs : le Run affiche base de donnees introuvable.
Le second Run extrait le code de sortie : 3. Zéro veut dire « tout va bien ». Tout autre nombre est un échec.
Lire le journal du programme
kubectl logs deployment/connexion -n atelierAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lire le code de sortie
kubectl describe pod -n atelier -l app=connexion | grep -m 1 "Exit Code" | awk '{print $3}'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Erreur fréquente
Attention
Beaucoup pensent qu’un pod qui ne démarre pas est une panne du cluster. Le plus souvent, la faute est dans ce que vous avez écrit : image, ressources ou programme. Lisez STATUS, puis describe pour une image ou une place, puis logs pour un programme.
Supprimer l’espace atelier
kubectl delete namespace atelierAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.