Chapitre 06

Dépanner

Kubernetes dit presque toujours ce qui ne va pas. Il faut seulement savoir où il l'écrit : trois commandes couvrent l'immense majorité des pannes.

Niveau intermédiaire  ·  Lecture 9 min  ·  Pour les développeurs

01La méthode en trois commandes

Du général au particulier
kubectl get pods                       # 1. quel pod va mal, dans quel état ?
kubectl describe pod <pod>             # 2. pourquoi ? lire la section Events, en bas
kubectl logs <pod> --previous          # 3. qu'a dit l'application avant de tomber ?

Dans neuf cas sur dix, la réponse est dans les dernières lignes de describe. Prenez le temps de les lire en entier avant de chercher ailleurs : le message est souvent plus précis qu'on ne le croit.

02Pod en Pending

Le pod attend une place qu'il ne trouve pas. Les Events disent pourquoi :

  • exceeded quota : le quota du projet est atteint. Réduisez les requests, supprimez un ancien déploiement, ou demandez une extension.
  • Insufficient memory : aucun serveur n'a assez de mémoire libre pour la demande. Une demande de 8 Gi pour un site vitrine mérite d'être revue.
  • unbound PersistentVolumeClaim : le volume n'existe pas encore, ou son nom est mal écrit dans le Deployment.

03ImagePullBackOff

Le serveur n'arrive pas à télécharger l'image. Trois causes, dans l'ordre de probabilité : une faute de frappe dans le nom ou le tag, une image privée sans imagePullSecrets (chapitre 04), ou un tag qui n'a jamais été poussé. Le message des Events cite l'erreur exacte du registre : not found, unauthorized ou manifest unknown.

04CrashLoopBackOff

Le jour sans fin des pods : l'application démarre, plante, redémarre, plante, avec un délai qui s'allonge à chaque tour. Les journaux du conteneur précédent (--previous) donnent la raison. Les grands classiques sur notre plateforme :

  • Un port inférieur à 1024 avec un utilisateur non root : bind: permission denied. Faites écouter l'application sur 8080 et laissez le Service traduire vers 80. Le refus est poli, mais ferme.
  • Une écriture dans le système de fichiers de l'image refusée : read-only file system ou permission denied. Montez un volume emptyDir sur le dossier concerné (/tmp, cache).
  • Une variable manquante : l'application s'arrête faute de configuration. Vérifiez la ConfigMap et le Secret.
  • OOMKilled dans describe : la limite de mémoire est trop basse.

05404, 502, 503 et certificat

Remonter la chaîne
dig +short boutique-mon-equipe.demo.k8s.exemple.fr    # 203.0.113.47 attendu
kubectl get ingress                                   # le bon nom, la classe traefik ?
kubectl get endpoints boutique                        # des adresses de pods ?
kubectl get certificate                               # READY=True ?
SymptômeCause probable
Le nom ne répond pas du toutDNS pas encore créé : patientez deux minutes, ou nom déjà pris par une autre application
Erreur 404 de Traefikhost de l'Ingress différent du nom appelé, ou ingressClassName absent
Erreur 502Mauvais targetPort : le Service envoie vers un port où rien n'écoute
Erreur 503Aucun pod prêt : la readinessProbe échoue, ou le sélecteur du Service ne correspond à aucun pod
Certificat invalide ou autosignéCertificat en cours d'émission : kubectl describe certificate

06Refus de sécurité

Deux messages se ressemblent et n'ont pas la même gravité :

  • Warning: would violate PodSecurity "restricted" : un avertissement. Le pod est créé, mais il pourrait être mieux protégé. Le manifeste du chapitre 02 n'en produit aucun ; inspirez-vous de ses blocs securityContext.
  • Error from server (Forbidden) : un vrai refus. Soit le pod demande un privilège interdit (privileged, hostPath, hostNetwork), et le message nomme le champ en cause ; soit l'action sort de vos droits, par exemple dans le namespace d'un autre.

07Le tableau récapitulatif

État ou erreurPremière commandeCause la plus fréquente
Pendingkubectl describe podQuota atteint
ImagePullBackOffkubectl describe podNom d'image ou accès au registre
CrashLoopBackOffkubectl logs --previousPort privilégié ou variable manquante
OOMKilledkubectl describe podlimits.memory trop basse
Running mais 0/1 prêtkubectl describe podreadinessProbe sur le mauvais chemin ou port
404, 502, 503kubectl get ingress,endpointsNom, port ou sélecteur
ForbiddenLire le messagePrivilège interdit ou hors de vos droits

Toujours bloqué ? Envoyez à l'administrateur la sortie de kubectl describe et les journaux, plutôt qu'un « ça marche pas » : vous gagnerez tous les deux une demi-heure.

Vous codez, nous veillons sur le cluster

Cette plateforme existe pour que vos développeurs déploient sans attendre personne et sans ticket. Nous l'hébergeons et l'exploitons pour vous : réseau, certificats, sauvegardes, mises à jour et surveillance des attaques. Il vous reste le plus intéressant.