kubernetes
Intermédiaire

Guide Troubleshooting Kubernetes : 50 Commandes Essentielles

Guide Troubleshooting Kubernetes : 50 Commandes Essentielles

Les commandes kubectl que j'utilise quotidiennement pour diagnostiquer et résoudre les problèmes K8s. Avec exemples concrets.

Florian Courouge
18 min de lecture
1,523 mots
0 vues
#Kubernetes
#Troubleshooting
#kubectl
#Debug
#DevOps

Guide Troubleshooting Kubernetes

Contenu Exclusif Membres

Ces commandes sont celles que j'utilise en production. Gardez cette page en favoris.


1. Diagnostic Rapide du Cluster

État global

# Vue d'ensemble du cluster
kubectl cluster-info

# État des nodes
kubectl get nodes -o wide

# Nodes avec problèmes
kubectl get nodes | grep -v " Ready"

# Détails d'un node problématique
kubectl describe node <node-name> | grep -A 20 "Conditions:"

# Ressources disponibles par node
kubectl top nodes

# Events récents du cluster
kubectl get events --all-namespaces --sort-by='.lastTimestamp' | tail -50

Composants système

# État des composants du control plane
kubectl get componentstatuses

# Pods système
kubectl get pods -n kube-system

# Pods en erreur dans kube-system
kubectl get pods -n kube-system | grep -v Running | grep -v Completed

2. Diagnostic des Pods

Trouver les pods problématiques

# Pods non Running dans tous les namespaces
kubectl get pods -A | grep -v Running | grep -v Completed

# Pods en CrashLoopBackOff
kubectl get pods -A | grep CrashLoopBackOff

# Pods en Pending
kubectl get pods -A | grep Pending

# Pods avec beaucoup de restarts
kubectl get pods -A -o wide | awk '$5 > 3 {print}'

# Pods par état
kubectl get pods -A -o jsonpath='{range .items[*]}{.status.phase}{"\n"}{end}' | sort | uniq -c

Analyser un pod spécifique

# Description complète
kubectl describe pod <pod-name> -n <namespace>

# Logs du container principal
kubectl logs <pod-name> -n <namespace>

# Logs du container précédent (après crash)
kubectl logs <pod-name> -n <namespace> --previous

# Logs d'un container spécifique (multi-container)
kubectl logs <pod-name> -n <namespace> -c <container-name>

# Suivre les logs en temps réel
kubectl logs -f <pod-name> -n <namespace>

# Logs des 100 dernières lignes
kubectl logs --tail=100 <pod-name> -n <namespace>

# Logs depuis les dernières 5 minutes
kubectl logs --since=5m <pod-name> -n <namespace>

Debug interactif

# Shell dans un pod
kubectl exec -it <pod-name> -n <namespace> -- /bin/sh

# Shell avec bash si disponible
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash

# Commande unique
kubectl exec <pod-name> -n <namespace> -- cat /app/config.yaml

# Container spécifique
kubectl exec -it <pod-name> -n <namespace> -c <container> -- /bin/sh

3. Diagnostic des Deployments

# État des deployments
kubectl get deployments -n <namespace>

# Historique des rollouts
kubectl rollout history deployment/<name> -n <namespace>

# État du rollout en cours
kubectl rollout status deployment/<name> -n <namespace>

# Détails des ReplicaSets
kubectl get rs -n <namespace>

# Raison d'un déploiement bloqué
kubectl describe deployment <name> -n <namespace> | grep -A 10 "Conditions:"

# Rollback au déploiement précédent
kubectl rollout undo deployment/<name> -n <namespace>

# Rollback à une révision spécifique
kubectl rollout undo deployment/<name> -n <namespace> --to-revision=2

4. Diagnostic Réseau

Services

# Liste des services
kubectl get svc -n <namespace>

# Endpoints d'un service (pods derrière)
kubectl get endpoints <service-name> -n <namespace>

# Service sans endpoints (problème!)
kubectl get endpoints -n <namespace> | awk '$2 == "<none>"'

# Test de résolution DNS interne
kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup <service-name>.<namespace>.svc.cluster.local

# Test de connectivité
kubectl run -it --rm debug --image=busybox --restart=Never -- wget -qO- http://<service-name>.<namespace>:80

Ingress

# Liste des ingress
kubectl get ingress -n <namespace>

# Détails d'un ingress
kubectl describe ingress <name> -n <namespace>

# Logs du controller ingress
kubectl logs -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --tail=100

Network Policies

# Lister les network policies
kubectl get networkpolicies -n <namespace>

# Détails (règles appliquées)
kubectl describe networkpolicy <name> -n <namespace>

5. Diagnostic Stockage

# PersistentVolumes
kubectl get pv

# PersistentVolumeClaims
kubectl get pvc -n <namespace>

# PVC en Pending (problème de binding)
kubectl get pvc -A | grep Pending

# Détails d'un PVC
kubectl describe pvc <name> -n <namespace>

# StorageClasses disponibles
kubectl get storageclass

# Utilisation disque des pods
kubectl exec <pod-name> -n <namespace> -- df -h

6. Diagnostic Ressources

CPU et Mémoire

# Utilisation par pod
kubectl top pods -n <namespace>

# Utilisation par node
kubectl top nodes

# Pods par consommation CPU (tri)
kubectl top pods -A --sort-by=cpu | head -20

# Pods par consommation mémoire
kubectl top pods -A --sort-by=memory | head -20

# Requests/Limits d'un pod
kubectl get pod <name> -n <namespace> -o jsonpath='{.spec.containers[*].resources}'

Quotas

# ResourceQuotas
kubectl get resourcequota -n <namespace>

# Utilisation du quota
kubectl describe resourcequota -n <namespace>

# LimitRanges
kubectl get limitrange -n <namespace>

7. Diagnostic RBAC

# Vérifier les permissions d'un user
kubectl auth can-i list pods --as=<user>

# Vérifier les permissions d'un ServiceAccount
kubectl auth can-i list secrets --as=system:serviceaccount:<namespace>:<sa-name>

# Lister toutes les permissions
kubectl auth can-i --list --as=system:serviceaccount:<namespace>:<sa-name>

# ClusterRoles
kubectl get clusterroles | grep -v system:

# RoleBindings d'un namespace
kubectl get rolebindings -n <namespace>

# Qui a accès à quoi
kubectl get clusterrolebindings -o wide | grep -E "(admin|edit|view)"

8. Diagnostic des Events

# Events d'un namespace (triés par date)
kubectl get events -n <namespace> --sort-by='.lastTimestamp'

# Events de type Warning uniquement
kubectl get events -n <namespace> --field-selector type=Warning

# Events d'un pod spécifique
kubectl get events -n <namespace> --field-selector involvedObject.name=<pod-name>

# Events récents (dernière heure)
kubectl get events -n <namespace> --sort-by='.lastTimestamp' | tail -50

# Watch des events en temps réel
kubectl get events -n <namespace> -w

9. Commandes de Debug Avancées

Debug avec un pod éphémère

# Attacher un container de debug à un pod
kubectl debug <pod-name> -it --image=busybox --target=<container-name> -n <namespace>

# Créer une copie du pod pour debug
kubectl debug <pod-name> -it --copy-to=debug-pod --image=ubuntu -n <namespace>

# Debug d'un node
kubectl debug node/<node-name> -it --image=ubuntu

Analyse JSON avancée

# Extraire les images de tous les pods
kubectl get pods -A -o jsonpath='{range .items[*]}{.spec.containers[*].image}{"\n"}{end}' | sort -u

# Pods sans limits définis
kubectl get pods -A -o json | jq '.items[] | select(.spec.containers[].resources.limits == null) | .metadata.name'

# Pods avec restart count > 0
kubectl get pods -A -o json | jq '.items[] | select(.status.containerStatuses[].restartCount > 0) | {name: .metadata.name, restarts: .status.containerStatuses[].restartCount}'

10. Scripts de Diagnostic

Script de santé cluster

#!/bin/bash
echo "=== CLUSTER HEALTH CHECK ==="
echo ""

echo "📊 Nodes Status:"
kubectl get nodes -o wide
echo ""

echo "⚠️ Problematic Pods:"
kubectl get pods -A | grep -v Running | grep -v Completed | head -20
echo ""

echo "🔥 High Restart Pods:"
kubectl get pods -A -o wide | awk '$5 > 3 {print}' | head -10
echo ""

echo "💾 PVC Issues:"
kubectl get pvc -A | grep -v Bound
echo ""

echo "📝 Recent Warnings:"
kubectl get events -A --field-selector type=Warning --sort-by='.lastTimestamp' | tail -10
echo ""

echo "💻 Resource Usage:"
kubectl top nodes 2>/dev/null || echo "Metrics server not available"

Script diagnostic pod

#!/bin/bash
POD=$1
NS=${2:-default}

if [ -z "$POD" ]; then
  echo "Usage: $0 <pod-name> [namespace]"
  exit 1
fi

echo "=== POD DIAGNOSTIC: $POD in $NS ==="
echo ""

echo "📋 Pod Status:"
kubectl get pod $POD -n $NS -o wide
echo ""

echo "📝 Pod Description:"
kubectl describe pod $POD -n $NS | grep -A 30 "Events:"
echo ""

echo "📊 Resource Usage:"
kubectl top pod $POD -n $NS 2>/dev/null || echo "Metrics not available"
echo ""

echo "📜 Recent Logs:"
kubectl logs $POD -n $NS --tail=50 2>/dev/null || echo "No logs available"

Aide-Mémoire des Codes d'Erreur

Code Signification Solution
CrashLoopBackOff Container crash en boucle Vérifier logs, config, resources
ImagePullBackOff Image non trouvée Vérifier nom image, secrets pull
Pending Pod non schedulé Vérifier resources, node selector, taints
OOMKilled Out of memory Augmenter limits memory
CreateContainerConfigError Config invalide Vérifier ConfigMaps, Secrets
ErrImagePull Erreur pull image Vérifier registry, credentials
ContainerCreating Création lente Vérifier volumes, network

Ces commandes fonctionnent avec kubectl 1.28+. Testées sur clusters EKS, GKE et on-premise.

F

Florian Courouge

Expert DevOps & Kafka | Consultant freelance specialise dans les architectures distribuees et le streaming de donnees.

Articles similaires