Un Pod est bloqué à l'état `Pending` et n'est pas ordonnancé.
→Exécuter `kubectl describe pod <nom-du-pod>`. Vérifier la section `Events` pour les messages de l'ordonnanceur.
Pourquoi: La commande `describe` est l'outil principal pour cela. Elle affichera des raisons comme "CPU/mémoire insuffisants", "le(s) nœud(s) avait(aient) des taints que le Pod n'a pas tolérés", ou "ne correspondait pas au sélecteur de nœud".
Un Pod démarre et échoue de manière répétée, avec un statut `CrashLoopBackOff`.
→1. `kubectl logs <nom-du-pod> --previous` pour voir les journaux du conteneur en panne. 2. `kubectl describe pod <nom-du-pod>` pour vérifier le code de sortie et la raison.
Pourquoi: `CrashLoopBackOff` signifie que l'application à l'intérieur du conteneur s'arrête. Les journaux de l'instance précédente (`--previous`) sont cruciaux, car le conteneur actuel n'a peut-être encore rien enregistré d'utile. Le code de sortie peut également indiquer le type d'erreur.
Un Pod ne parvient pas à démarrer avec le statut `ImagePullBackOff` ou `ErrImagePull`.
→`kubectl describe pod <nom-du-pod>` pour voir le message de l'événement. Vérifier que le nom et le tag de l'image sont corrects. Pour les registres privés, s'assurer qu'un `imagePullSecrets` est configuré et que le secret est valide.
Pourquoi: Il s'agit d'un problème de registre ou de nom d'image, et non d'un problème d'application. Les causes courantes sont les fautes de frappe, les tags incorrects ou l'échec d'authentification avec un registre privé.
Un nœud a un statut `NotReady`.
→Se connecter en SSH au nœud affecté. Vérifier le statut du service kubelet avec `systemctl status kubelet`. Consulter ses journaux avec `journalctl -u kubelet`.
Pourquoi: Le `kubelet` est l'agent responsable du rapport de santé du nœud. S'il est en panne ou ne peut pas communiquer avec le serveur API, le nœud sera marqué NotReady. Ses journaux sont le premier endroit où chercher.
Un service existe, mais le trafic n'atteint pas les Pods backend.
→1. `kubectl describe svc <nom-du-service>` et vérifier que le `Selector` correspond aux labels des Pods. 2. `kubectl get endpoints <nom-du-service>` et s'assurer qu'il liste les bonnes IP des Pods. Si ce n'est pas le cas, les labels ne correspondent pas.
Pourquoi: Le lien entre un Service et ses Pods est le sélecteur de labels. Si le sélecteur est incorrect ou si les Pods n'ont pas les bons labels, l'objet Endpoints sera vide et le service n'aura aucun endroit où acheminer le trafic.
Les Pods sont incapables de résoudre les noms de service ou les noms d'hôtes externes.
→1. Vérifier si les Pods CoreDNS sont en cours d'exécution dans `kube-system`. 2. Vérifier les journaux de CoreDNS. 3. Exécuter un Pod de débogage (par exemple, `busybox`) et utiliser `nslookup` pour tester la résolution depuis l'intérieur du cluster.
Pourquoi: Le DNS est une dépendance critique du cluster. Les échecs remontent généralement au déploiement de CoreDNS lui-même, à sa configuration (dans un ConfigMap), ou aux NetworkPolicies bloquant le trafic DNS sur le port UDP/TCP 53.
Un nœud doit être mis hors ligne pour maintenance.
→D'abord, `kubectl cordon <nom-du-nœud>` pour le marquer comme non-ordonnançable. Ensuite, `kubectl drain <nom-du-nœud> --ignore-daemonsets` pour évacuer en toute sécurité tous les Pods utilisateur.
Pourquoi: `cordon` empêche l'ordonnancement de nouveaux Pods. `drain` respecte les PodDisruptionBudgets et évacue les Pods en douceur. `--ignore-daemonsets` est nécessaire car les Pods DaemonSet ne peuvent pas être évacués.
Identifier quels Pods ou nœuds consomment le plus de CPU ou de mémoire.
→Utiliser `kubectl top pods` et `kubectl top nodes`. Cela nécessite que le `metrics-server` soit déployé dans le cluster.
Pourquoi: `kubectl top` fournit une vue rapide et en temps réel de la consommation des ressources, essentielle pour identifier les applications gourmandes en ressources ou la pression sur les ressources des nœuds.
Un Pod est resté à l'état `Terminating` pendant une longue période et n'est pas supprimé.
→Forcer la suppression du Pod avec `kubectl delete pod <nom-du-pod> --grace-period=0 --force`.
Pourquoi: Cela peut se produire si un finalizer est bloqué ou si le kubelet ne peut pas nettoyer les ressources. La suppression forcée retire immédiatement le Pod du serveur API, mais doit être utilisée en dernier recours car elle peut laisser des ressources orphelines sur le nœud.