Guide pratique pour diagnostiquer et résoudre les problèmes les plus courants dans Kubernetes.
# Vue d'ensemble rapide
kubectl get all
kubectl get events --sort-by=.metadata.creationTimestamp
# Statut du cluster
kubectl cluster-info
kubectl get nodes
kubectl get pods --all-namespaces
Symptômes :
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-pod 0/1 Pending 0 5m
Diagnostic :
kubectl describe pod my-pod
Causes courantes :
# Vérifier les ressources des nodes
kubectl top nodes
kubectl describe nodes
# Solution : Réduire les demandes de ressources
resources:
requests:
memory: "64Mi" # Réduire si nécessaire
cpu: "100m" # Réduire si nécessaire
# Vérifier les nodeSelector, affinity, taints
kubectl get nodes --show-labels
# Solution : Modifier ou supprimer les contraintes
spec:
# nodeSelector:
# disktype: ssd # Supprimer si aucun node ne correspond
# Vérifier les PersistentVolumes
kubectl get pv
kubectl get pvc
# Solution : Créer les volumes manquants ou corriger les claims
Symptômes :
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-pod 0/1 ImagePullBackOff 0 2m
Diagnostic :
kubectl describe pod my-pod
kubectl logs my-pod
Solutions :
# Vérifier le nom de l'image
containers:
- name: app
image: nginx:1.29.0 # Vérifier que cette version existe
# Créer un Secret pour l'authentification
kubectl create secret docker-registry regcred \
--docker-server=<registry-server> \
--docker-username=<username> \
--docker-password=<password>
# L'utiliser dans le Pod
spec:
imagePullSecrets:
- name: regcred
containers:
- name: app
image: nginx:1.29.0
imagePullPolicy: IfNotPresent # ou Always, Never
Symptômes :
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
my-pod 0/1 CrashLoopBackOff 3 5m
Diagnostic :
kubectl logs my-pod
kubectl logs my-pod --previous # Logs du conteneur précédent
kubectl describe pod my-pod
Causes et Solutions :
# Examiner les logs pour voir l'erreur
kubectl logs my-pod
# Solutions possibles :
# - Corriger la configuration de l'application
# - Vérifier les variables d'environnement
# - S'assurer que les dépendances sont disponibles
# Ajuster les probes
livenessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 60 # Augmenter le délai initial
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3 # Augmenter le nombre d'échecs tolérés
resources:
limits:
memory: "256Mi" # Augmenter si l'application est tuée par OOM
cpu: "500m"
Diagnostic :
kubectl describe pod my-pod
Solutions :
# Forcer la suppression (attention : peut causer des incohérences)
kubectl delete pod my-pod --force --grace-period=0
# Vérifier les finalizers
kubectl get pod my-pod -o yaml | grep finalizers
Diagnostic :
# Vérifier que le Service existe
kubectl get services
# Vérifier les endpoints
kubectl get endpoints my-service
# Tester la résolution DNS
kubectl run test --image=busybox:1.36 -it --rm -- nslookup my-service
Causes courantes :
# Le sélecteur du Service doit correspondre aux labels des Pods
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app # Doit correspondre aux labels des Pods
# Vérifier les labels des Pods
kubectl get pods --show-labels
spec:
ports:
- port: 80 # Port du Service
targetPort: 8080 # Port du conteneur (doit être correct)
# Vérifier que des Pods sont sélectionnés
kubectl describe service my-service
# Les endpoints doivent lister des IPs de Pods
kubectl get endpoints my-service
Diagnostic :
# Tester la résolution DNS
kubectl run debug --image=busybox:1.36 -it --rm -- sh
# Dans le Pod :
nslookup my-service
nslookup my-service.my-namespace.svc.cluster.local
Solutions :
# Vérifier CoreDNS
kubectl get pods -n kube-system | grep coredns
kubectl logs -n kube-system deployment/coredns
# Redémarrer CoreDNS si nécessaire
kubectl rollout restart -n kube-system deployment/coredns
Diagnostic :
# Créer un Pod de test
kubectl run test --image=busybox:1.36 -it --rm -- sh
# Dans le Pod, tester la connectivité
ping <ip-du-pod-cible>
wget -qO- http://<ip-du-pod-cible>:80
Solutions :
# Vérifier le plugin CNI
kubectl get pods -n kube-system | grep -E "(flannel|calico|weave)"
# Vérifier les NetworkPolicies
kubectl get networkpolicies --all-namespaces
Diagnostic :
# Vérifier l'Ingress Controller
kubectl get pods -n ingress-nginx
kubectl get ingress
# Vérifier la configuration
kubectl describe ingress my-ingress
Diagnostic :
kubectl get pvc
kubectl describe pvc my-pvc
kubectl get pv
Solutions :
# Vérifier qu'un PV correspondant existe
# - StorageClass compatible
# - Taille suffisante
# - AccessModes compatibles
# Créer un PV si nécessaire ou corriger le PVC
Diagnostic :
kubectl rollout status deployment/my-app
kubectl describe deployment my-app
Solutions :
# Vérifier les readiness probes
# Ajuster la stratégie de déploiement
spec:
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0 # Évite les interruptions
Diagnostic :
kubectl get deployment my-app
kubectl describe deployment my-app
kubectl get replicaset
Symptômes :
$ kubectl describe pod my-pod
# Dans la sortie :
# Last State: Terminated
# Reason: OOMKilled
Solutions :
resources:
requests:
memory: "256Mi" # Demande initiale
limits:
memory: "512Mi" # Limite maximum (augmenter)
Diagnostic :
kubectl top pods
kubectl describe node <node-name>
Solutions :
resources:
limits:
cpu: "1000m" # Augmenter la limite CPU
Diagnostic :
kubectl get configmap
kubectl get secret
kubectl describe pod my-pod
Solutions :
# Créer le ConfigMap manquant
kubectl create configmap my-config --from-file=config.properties
# Vérifier que le nom correspond dans le Pod
Diagnostic :
kubectl exec my-pod -- env
kubectl describe pod my-pod
Diagnostic :
kubectl auth can-i <verb> <resource> --as=<user>
kubectl get clusterroles
kubectl get rolebindings --all-namespaces
Solutions :
# Créer un RoleBinding approprié
kubectl create rolebinding <name> \
--clusterrole=<role> \
--user=<user> \
--namespace=<namespace>
# Événements triés par date
kubectl get events --sort-by='.lastTimestamp' --all-namespaces
# Logs de tous les conteneurs d'un Pod
kubectl logs my-pod --all-containers=true
# Logs avec timestamp
kubectl logs my-pod --timestamps=true
# Suivre les logs en temps réel
kubectl logs -f deployment/my-app
# Utilisation des ressources
kubectl top nodes
kubectl top pods --all-namespaces --sort-by=memory
kubectl top pods --all-namespaces --sort-by=cpu
# Informations détaillées des nodes
kubectl describe nodes
# Capacité et allocations
kubectl get nodes -o custom-columns=NAME:.metadata.name,CPU:.status.capacity.cpu,MEMORY:.status.capacity.memory
# Créer un Pod de debug
kubectl run debug --image=busybox:1.36 -it --rm -- sh
# Ou avec plus d'outils
kubectl run debug --image=nicolaka/netshoot -it --rm -- bash
# Copier depuis/vers un Pod
kubectl cp my-pod:/path/to/file ./local-file
kubectl cp ./local-file my-pod:/path/to/file
# Accéder directement à un Pod
kubectl port-forward pod/my-pod 8080:80
# Accéder à un Service
kubectl port-forward service/my-service 8080:80
Lors d'un problème, vérifiez systématiquement :
kubectl get pods)kubectl get events)kubectl logs)kubectl describe service)nslookup depuis un Pod)kubectl top)kubectl get nodes)kubectl get pv,pvc)# Vérifications régulières
kubectl get componentstatuses
kubectl top nodes
kubectl get events --since=1h
Ce guide couvre les problèmes les plus courants. Pour des problèmes spécifiques ou des configurations avancées, consultez la documentation officielle Kubernetes.