troubleshooting6 min de lecture

Debugger un pod en CrashLoopBackOff : causes, diagnostic et solutions

SFEIR Institute

Points clés

  • CrashLoopBackOff applique un backoff exponentiel de 10s à 5 minutes entre redémarrages
  • kubectl logs et kubectl describe sont les commandes essentielles de diagnostic
  • Causes principales : erreur applicative, configuration manquante, ou OOMKilled

Le statut CrashLoopBackOff Kubernetes diagnostic solutions représente l'un des problèmes les plus fréquents en production. Ce message indique qu'un conteneur redémarre en boucle après des échecs successifs.

Chaque tentative de redémarrage est espacée exponentiellement (10s, 20s, 40s, jusqu'à 5 minutes), paralysant votre application. Ce guide détaille les causes racines, les commandes de diagnostic et les solutions pour les ingénieurs opérations Cloud Kubernetes, administrateurs système et développeurs Backend.

TL;DR : CrashLoopBackOff signifie que le conteneur crash et redémarre en boucle. Vérifiez les logs (kubectl logs), les événements (kubectl describe), et les ressources (mémoire, CPU). Les causes les plus fréquentes : erreur applicative, configuration manquante, ou OOMKilled.

Cette compétence est au cœur de la formation LFS458 Administration Kubernetes.

Qu'est-ce que CrashLoopBackOff et pourquoi il se produit ?

CrashLoopBackOff est un état de pod Kubernetes indiquant un cycle de crashes répétés. Le kubelet applique un backoff exponentiel entre chaque redémarrage pour éviter de surcharger le système.

Selon le Spectro Cloud State of Kubernetes 2025, les équipes IT passent 34 jours ouvrés par an à résoudre des problèmes Kubernetes. Le CrashLoopBackOff représente une part significative de ces incidents.

Cycle de vie d'un pod en CrashLoopBackOff

Running → Error/Completed → CrashLoopBackOff
    ↑___________________________|
        (redémarrage avec backoff)
ÉtatSignification
PendingPod en attente de scheduling
RunningConteneur en cours d'exécution
ErrorConteneur terminé avec code erreur
CompletedConteneur terminé avec succès
CrashLoopBackOffCrashes répétés, backoff en cours
À retenir : CrashLoopBackOff n'est pas une erreur en soi, c'est la conséquence d'échecs répétés du conteneur.

Quelles commandes pour diagnostiquer CrashLoopBackOff Kubernetes ?

Étape 1 : identifier le pod problématique

# Lister les pods avec leur statut
kubectl get pods -A | grep CrashLoopBackOff

# Détail sur un pod spécifique
kubectl get pod my-app -o wide

Étape 2 : consulter les événements

# Événements du pod
kubectl describe pod my-app

# Rechercher les événements pertinents
kubectl get events --field-selector involvedObject.name=my-app

Exemple de sortie :

Events:
  Type     Reason     Age   Message
  ----     ------     ----  -------
  Normal   Scheduled  10m   Successfully assigned default/my-app to node-1
  Normal   Pulled     9m    Container image pulled successfully
  Warning  BackOff    8m    Back-off restarting failed container

Étape 3 : analyser les logs

# Logs du conteneur actuel
kubectl logs my-app

# Logs du conteneur précédent (après crash)
kubectl logs my-app --previous

# Logs en temps réel
kubectl logs my-app -f

# Logs d'un conteneur spécifique (multi-container)
kubectl logs my-app -c sidecar
À retenir : --previous est crucial car il affiche les logs du conteneur crashé, pas du conteneur en cours de redémarrage.

Quelles sont les causes principales de CrashLoopBackOff ?

Cause 1 : erreur applicative

L'application elle-même crash au démarrage. Vérifiez le code de sortie :

kubectl describe pod my-app | grep "Exit Code"
Exit CodeSignification
0Succès (mais si le conteneur doit tourner, problème)
1Erreur générale de l'application
137SIGKILL (OOMKilled probable)
139SIGSEGV (segmentation fault)
143SIGTERM (arrêt demandé)

Solution : corriger le code applicatif ou la configuration de démarrage.

Cause 2 : configuration manquante

ConfigMaps ou Secrets non montés correctement :

# Vérifier les montages
kubectl describe pod my-app | grep -A 10 "Mounts"

# Vérifier l'existence des ConfigMaps
kubectl get configmap my-config
# ❌ Référence à un ConfigMap inexistant
envFrom:
  - configMapRef:
      name: missing-config

# ✅ Vérifier que le ConfigMap existe
kubectl create configmap my-config --from-literal=KEY=value

Cause 3 : OOMKilled (mémoire insuffisante)

# Vérifier le motif du dernier arrêt
kubectl describe pod my-app | grep -A 5 "Last State"
Last State:     Terminated
  Reason:       OOMKilled
  Exit Code:    137

Solution : augmenter les limites mémoire ou optimiser l'application.

resources:
  requests:
    memory: "256Mi"
  limits:
    memory: "512Mi"  # Augmenter si nécessaire

Cause 4 : commande de démarrage incorrecte

# ❌ Commande invalide
command: ["./start.sh"]  # Fichier non exécutable ou absent

# ✅ Vérifier l'existence et les permissions
command: ["/bin/sh", "-c", "chmod +x /app/start.sh && /app/start.sh"]

Pour les erreurs de configuration YAML, consultez Résoudre les 10 erreurs de déploiement Kubernetes les plus fréquentes.

Comment debugger avec CrashLoopBackOff Kubernetes diagnostic solutions avancées ?

Méthode 1 : exécuter un shell dans le conteneur

Si le conteneur crash immédiatement, modifiez temporairement la commande :

# Remplacer la commande pour garder le conteneur actif
spec:
  containers:
    - name: my-app
      command: ["/bin/sh", "-c", "sleep infinity"]
# Puis se connecter
kubectl exec -it my-app -- /bin/sh

# Tester manuellement le démarrage
./start.sh

Méthode 2 : conteneur ephemeral (debug)

Kubernetes 1.25+ supporte les conteneurs ephemeral :

kubectl debug my-app -it --image=busybox --target=my-app

Méthode 3 : copier les fichiers du conteneur

# Copier les logs internes
kubectl cp my-app:/var/log/app.log ./app.log

# Copier la configuration
kubectl cp my-app:/app/config.yaml ./config.yaml

Checklist de diagnostic CrashLoopBackOff

VérificationCommandeAction si problème
Logs conteneurkubectl logs --previousCorriger l'erreur applicative
Événements podkubectl describe podIdentifier la cause
Code de sortiegrep "Exit Code"Voir tableau des codes
Mémoiregrep "OOMKilled"Augmenter limits.memory
ConfigMapskubectl get cmCréer les ConfigMaps manquants
Secretskubectl get secretCréer les Secrets manquants
Imagekubectl get pod -o yamlVérifier le tag d'image
PermissionssecurityContextAjuster runAsUser
À retenir : Commencez toujours par les logs (--previous), puis les événements, puis l'inspection du manifeste YAML.

Solutions par type de problème

Problème de dépendances

L'application dépend d'un service non disponible :

# ✅ Ajouter un initContainer pour attendre les dépendances
initContainers:
  - name: wait-for-db
    image: busybox:1.36
    command: ['sh', '-c', 'until nc -z db-service 5432; do sleep 2; done']

Problème de liveness/readiness probes

Des probes trop agressives peuvent causer des redémarrages :

# ❌ Probe trop agressive
livenessProbe:
  initialDelaySeconds: 5
  periodSeconds: 5
  failureThreshold: 1

# ✅ Probe tolérante au démarrage lent
livenessProbe:
  initialDelaySeconds: 30
  periodSeconds: 10
  failureThreshold: 3

Problème de filesystem read-only

# Erreur : l'application écrit dans un filesystem read-only
securityContext:
  readOnlyRootFilesystem: true

# ✅ Solution : monter un volume pour les écritures
volumes:
  - name: tmp
    emptyDir: {}
volumeMounts:
  - name: tmp
    mountPath: /tmp

Pour approfondir la sécurité, consultez Sécuriser vos workloads Kubernetes : guide des bonnes pratiques.

Automatiser la détection de CrashLoopBackOff

Alerting avec Prometheus

# Règle d'alerte Prometheus
groups:
  - name: kubernetes-pods
    rules:
      - alert: PodCrashLoopBackOff
        expr: |
          increase(kube_pod_container_status_restarts_total[1h]) > 3
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Pod {{ $labels.pod }} en CrashLoopBackOff"

Selon Grafana Labs, Prometheus et Grafana sont utilisés par 75% des organisations pour le monitoring Kubernetes.

Migration et environnements de test

Avant de déployer en production, testez localement avec les outils décrits dans Installer Kubernetes en local : guide complet avec Minikube, Kind et K3d.

Pour les migrations depuis Docker Compose, consultez Migrer de Docker Compose à Kubernetes : guide de transition.

Ressources pour approfondir le diagnostic

Le CNCF Annual Survey 2025 montre que 82% des utilisateurs de conteneurs exécutent Kubernetes en production. Maîtriser le debugging est essentiel à cette échelle.

Pour une formation structurée sur l'administration de clusters, consultez la page formation Kubernetes administrateur système.

Passez à l'action : créez votre checklist de debugging

Le CrashLoopBackOff Kubernetes diagnostic solutions présenté dans ce guide couvre 90% des cas rencontrés en production. Bookmarkez cette page, créez un alias pour kubectl logs --previous, et intégrez les alertes Prometheus dans votre monitoring.

À retenir : Le debugging Kubernetes est une compétence qui se développe avec la pratique. Chaque incident résolu enrichit votre expertise.

Pour structurer votre montée en compétences :

Explorez les Tutoriels et guides pratiques Kubernetes et le guide complet Déploiement et mise en production Kubernetes pour continuer votre apprentissage.