Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Pod Kubernetes : créer, observer et comprendre son cycle de vie

16 min de lecture

logo kubernetes

Un Pod est l’objet de base utilisé par Kubernetes pour exécuter un ou plusieurs conteneurs. Dans la majorité des cas, un Pod contient un seul conteneur. Ce guide vous montre comment créer un Pod, l’observer, comprendre son cycle de vie et diagnostiquer les problèmes les plus fréquents.

Prérequis : un cluster Kubernetes fonctionnel (K3d, minikube ou autre) et kubectl configuré.

  • Créer un Pod avec kubectl run et avec un fichier YAML
  • Observer un Pod : voir son état, lire ses logs, entrer dedans
  • Comprendre le cycle de vie : phases, restartPolicy, CrashLoopBackOff
  • Utiliser les init containers pour préparer l’environnement
  • Diagnostiquer les problèmes : ImagePullBackOff, Pending, crash

Un Pod est la plus petite unité déployable dans Kubernetes. C’est l’objet que Kubernetes crée, planifie sur un nœud et surveille.

Pour un débutant, retenez simplement :

  • Un Pod exécute vos conteneurs
  • Kubernetes gère le Pod (démarrage, surveillance, redémarrage)
  • Dans 80% des cas, un Pod = un conteneur

Pourquoi ne pas gérer directement les conteneurs ? Parce que certaines applications nécessitent plusieurs processus qui doivent :

  • Partager la même adresse IP (ils communiquent via localhost)
  • Partager les mêmes volumes (fichiers communs)
  • Être co-localisés sur le même nœud
  • Être démarrés et arrêtés ensemble

Le Pod est l’unité de scheduling : c’est lui que Kubernetes place sur un nœud, pas le conteneur individuel.

La façon la plus rapide de créer un Pod :

Fenêtre de terminal
kubectl run mon-nginx --image=nginx:1.27-alpine

Résultat : un Pod nommé mon-nginx exécutant Nginx.

Vérifiez sa création :

Fenêtre de terminal
kubectl get pods
Sortie
NAME READY STATUS RESTARTS AGE
mon-nginx 1/1 Running 0 10s

Pour un contrôle total, créez un fichier manifest :

mon-nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: mon-nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.27-alpine
ports:
- containerPort: 80
restartPolicy: Always

Appliquez-le :

Fenêtre de terminal
kubectl apply -f mon-nginx.yaml

Une fois votre Pod créé, vous voulez immédiatement savoir : est-ce qu’il tourne ? Où regarder ?

Fenêtre de terminal
kubectl get pods -o wide
Sortie
NAME READY STATUS RESTARTS AGE IP NODE
mon-nginx 1/1 Running 0 2m 10.42.0.8 k3d-doc-k8s-server-0

Les colonnes importantes :

ColonneSignification
READY1/1 = 1 conteneur prêt sur 1 total
STATUSPhase actuelle du Pod (Running, Pending…)
RESTARTSNombre de redémarrages du conteneur
IPAdresse IP interne du Pod
Fenêtre de terminal
kubectl describe pod mon-nginx

Cette commande affiche :

  • Conditions : états du Pod (PodScheduled, Initialized, Ready…)
  • Containers : état de chaque conteneur
  • Events : historique des actions (scheduling, pull d’image, démarrage…)
Fenêtre de terminal
kubectl logs mon-nginx

Options utiles :

Fenêtre de terminal
kubectl logs mon-nginx --tail=20 # Les 20 dernières lignes
kubectl logs mon-nginx --follow # Flux en temps réel
kubectl logs mon-nginx --previous # Logs du conteneur précédent (après crash)
Fenêtre de terminal
kubectl exec mon-nginx -- hostname
kubectl exec -it mon-nginx -- sh # Shell interactif

Maintenant que vous avez vu un Pod vivre, regardons sa structure YAML :

ChampDescription
metadata.nameNom unique du Pod dans le namespace
metadata.labelsÉtiquettes pour organiser et sélectionner
spec.containers[]Liste des conteneurs (au moins un)
spec.containers[].imageImage à utiliser
spec.containers[].ports[]Ports exposés (informatif)
spec.restartPolicyComportement au redémarrage

Un Pod passe par plusieurs phases :

Cycle de vie d'un Pod Kubernetes : Pending, Running, Succeeded ou Failed

PhaseSignification
PendingPod accepté mais pas encore sur un nœud. En attente de scheduling ou de téléchargement d’image.
RunningPod assigné à un nœud, au moins un conteneur tourne.
SucceededTous les conteneurs ont terminé avec succès (exit code 0).
FailedAu moins un conteneur a terminé en échec (exit code non-zéro).
UnknownÉtat indéterminé, souvent problème de communication avec le nœud.

Pour voir la phase :

Fenêtre de terminal
kubectl get pod mon-nginx -o jsonpath='{.status.phase}'

Chaque conteneur dans un Pod a son propre état :

ÉtatDescription
WaitingEn attente (pull d’image, init container en cours…)
RunningLe conteneur s’exécute
TerminatedLe conteneur s’est arrêté (succès ou échec)

Attention : CrashLoopBackOff n’est pas une phase du Pod. C’est un état d’attente du conteneur visible dans la sortie de kubectl get pods. Il signifie que le conteneur a crashé plusieurs fois et que Kubernetes attend avant de le redémarrer.

restartPolicy : que fait Kubernetes quand un conteneur s’arrête

Section intitulée « restartPolicy : que fait Kubernetes quand un conteneur s’arrête »

Le champ restartPolicy définit ce que Kubernetes fait quand un conteneur s’arrête :

ValeurComportementCas d’usage
Always (défaut)Redémarre le conteneur quoi qu’il arriveServices web, API
OnFailureRedémarre seulement si exit code ≠ 0Jobs de traitement batch
NeverNe redémarre jamaisTâches ponctuelles, debug
job-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: job-pod
spec:
containers:
- name: worker
image: busybox:1.36
command: ['sh', '-c', 'echo "Traitement..." && exit 0']
restartPolicy: OnFailure

Si le conteneur échoue (exit 1), Kubernetes le redémarre. S’il réussit (exit 0), le Pod passe en Succeeded.

Quand un conteneur échoue plusieurs fois, Kubernetes attend de plus en plus longtemps avant de le redémarrer :

  • 1ère tentative : 10s
  • 2ème : 20s
  • 3ème : 40s
  • Maximum : 5 minutes

C’est ce qui produit l’état CrashLoopBackOff.

Les init containers s’exécutent avant les conteneurs principaux. Ils sont plus simples à comprendre que les multi-conteneurs classiques car leur rôle est clair : préparer le terrain.

  • Attendre qu’un service soit prêt (base de données, API)
  • Télécharger des fichiers de configuration
  • Initialiser une base de données
  • Vérifier des prérequis
  • S’exécutent séquentiellement (un après l’autre)
  • Doivent tous réussir avant le démarrage des conteneurs principaux
  • Peuvent utiliser des images différentes (avec des outils spécifiques)
init-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: init-demo
spec:
initContainers:
- name: wait-for-db
image: busybox:1.36
command: ['sh', '-c', 'until nc -z db-service 5432; do sleep 2; done']
containers:
- name: app
image: nginx:1.27-alpine

Le Pod restera en Init:0/1 jusqu’à ce que db-service:5432 réponde :

Fenêtre de terminal
kubectl get pod init-demo
Sortie pendant l'init
NAME READY STATUS RESTARTS AGE
init-demo 0/1 Init:0/1 0 5s

Dans 80% des cas, un Pod contient un seul conteneur. C’est le pattern recommandé car :

  • Plus simple à gérer
  • Scaling indépendant
  • Isolation des pannes

Les Pods multi-conteneurs servent à des cas spécifiques où les conteneurs doivent absolument partager réseau et volumes :

PatternDescriptionExemple
SidecarConteneur auxiliaire qui enrichit l’app principaleAgent de logs, proxy Envoy
Init containerPrépare l’environnement avant l’appAttente d’une dépendance
app-avec-sidecar.yaml
apiVersion: v1
kind: Pod
metadata:
name: app-avec-sidecar
spec:
containers:
- name: app
image: nginx:1.27-alpine
volumeMounts:
- name: logs
mountPath: /var/log/nginx
- name: log-collector
image: busybox:1.36
command: ['sh', '-c', 'tail -f /var/log/nginx/access.log']
volumeMounts:
- name: logs
mountPath: /var/log/nginx
volumes:
- name: logs
emptyDir: {}

Les deux conteneurs partagent le volume logs.

Un Pod “nu” (créé directement avec kubectl run ou un YAML Pod) a plusieurs problèmes :

ProblèmeConséquence
Pas de reschedulingSi le nœud tombe, le Pod disparaît définitivement
Pas de réplicasUn seul Pod = pas de haute disponibilité
Pas de rolling updateImpossible de mettre à jour sans interruption
Pas d’auto-scalingLe nombre de Pods est fixe
ContrôleurCas d’usage
DeploymentApplications stateless (API, web)
StatefulSetApplications stateful (bases de données)
DaemonSetUn Pod par nœud (agents de monitoring)
JobTâches batch ponctuelles
CronJobTâches planifiées

Ces contrôleurs créent et gèrent les Pods pour vous, avec la résilience nécessaire.

  1. Voir l’état :

    Fenêtre de terminal
    kubectl get pod mon-pod -o wide
  2. Lire les événements :

    Fenêtre de terminal
    kubectl describe pod mon-pod | tail -20
  3. Consulter les logs :

    Fenêtre de terminal
    kubectl logs mon-pod --tail=50
  4. Entrer dans le conteneur (si possible) :

    Fenêtre de terminal
    kubectl exec -it mon-pod -- sh

Ces quatre commandes résolvent 90% des problèmes.

Fenêtre de terminal
kubectl top pod mon-pod
Sortie
NAME CPU(cores) MEMORY(bytes)
mon-pod 3m 45Mi

Si le conteneur n’a pas de shell (image distroless, scratch), utilisez un conteneur éphémère :

Fenêtre de terminal
kubectl debug -it mon-pod --image=busybox:1.36 --target=mon-conteneur

Le conteneur éphémère partage le namespace réseau et process du Pod ciblé.

Symptôme : Le Pod redémarre en boucle.

NAME READY STATUS RESTARTS AGE
mon-pod 0/1 CrashLoopBackOff 5 3m

Rappel : ce n’est pas une phase du Pod, mais un état d’attente visible dans STATUS.

Causes possibles :

  1. L’application plante au démarrage (erreur de code)
  2. Configuration manquante (variables d’environnement, secrets)
  3. Dépendance non disponible (base de données, API)

Diagnostic :

Fenêtre de terminal
kubectl logs mon-pod --previous # Logs du crash précédent
kubectl describe pod mon-pod # Voir le exit code

Symptôme : Kubernetes ne peut pas télécharger l’image.

Causes possibles :

  1. Image inexistante ou mal orthographiée
  2. Registry privée sans credentials
  3. Problème réseau

Diagnostic :

Fenêtre de terminal
kubectl describe pod mon-pod | grep -A 5 "Events"

Symptôme : Le Pod reste en Pending.

Causes possibles :

  1. Ressources insuffisantes sur les nœuds
  2. Pas de nœud avec les bons labels/taints
  3. Volume PVC en attente

Diagnostic :

Fenêtre de terminal
kubectl describe pod mon-pod | grep -A 10 "Events"
kubectl get nodes -o wide
kubectl describe node <nom-du-noeud>

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

7 questions
5 min.
80% requis

Informations

  • Le chronomètre démarre au clic sur Démarrer
  • Questions à choix multiples, vrai/faux et réponses courtes
  • Vous pouvez naviguer entre les questions
  • Les résultats détaillés sont affichés à la fin

Lance le quiz et démarre le chronomètre

  1. Un Pod est l’unité minimale de Kubernetes : dans 80% des cas, 1 Pod = 1 conteneur
  2. Les conteneurs d’un Pod partagent réseau (localhost) et volumes
  3. Cycle de vie : Pending → Running → Succeeded/Failed
  4. CrashLoopBackOff n’est pas une phase du Pod, mais un état d’attente du conteneur
  5. restartPolicy : Always (défaut et le plus courant), OnFailure, Never
  6. Les init containers s’exécutent avant les conteneurs principaux pour préparer l’environnement
  7. Ne créez jamais de Pods nus en production : utilisez Deployments, StatefulSets ou Jobs
  8. Debug : commencez par get, describe, logs, exec avant kubectl debug

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn