
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é.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- 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
Ce qu’est un Pod Kubernetes
Section intitulée « Ce qu’est un Pod Kubernetes »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 Kubernetes utilise des Pods
Section intitulée « Pourquoi Kubernetes utilise des Pods »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.
Créer son premier Pod
Section intitulée « Créer son premier Pod »Méthode impérative : kubectl run
Section intitulée « Méthode impérative : kubectl run »La façon la plus rapide de créer un Pod :
kubectl run mon-nginx --image=nginx:1.27-alpineRésultat : un Pod nommé mon-nginx exécutant Nginx.
Vérifiez sa création :
kubectl get podsNAME READY STATUS RESTARTS AGEmon-nginx 1/1 Running 0 10sMéthode déclarative : fichier YAML
Section intitulée « Méthode déclarative : fichier YAML »Pour un contrôle total, créez un fichier manifest :
apiVersion: v1kind: Podmetadata: name: mon-nginx labels: app: nginxspec: containers: - name: nginx image: nginx:1.27-alpine ports: - containerPort: 80 restartPolicy: AlwaysAppliquez-le :
kubectl apply -f mon-nginx.yamlObserver et inspecter un Pod
Section intitulée « Observer et inspecter un Pod »Une fois votre Pod créé, vous voulez immédiatement savoir : est-ce qu’il tourne ? Où regarder ?
kubectl get : vue d’ensemble
Section intitulée « kubectl get : vue d’ensemble »kubectl get pods -o wideNAME READY STATUS RESTARTS AGE IP NODEmon-nginx 1/1 Running 0 2m 10.42.0.8 k3d-doc-k8s-server-0Les colonnes importantes :
| Colonne | Signification |
|---|---|
| READY | 1/1 = 1 conteneur prêt sur 1 total |
| STATUS | Phase actuelle du Pod (Running, Pending…) |
| RESTARTS | Nombre de redémarrages du conteneur |
| IP | Adresse IP interne du Pod |
kubectl describe : détails complets
Section intitulée « kubectl describe : détails complets »kubectl describe pod mon-nginxCette commande affiche :
- Conditions : états du Pod (PodScheduled, Initialized, Ready…)
- Containers : état de chaque conteneur
- Events : historique des actions (scheduling, pull d’image, démarrage…)
kubectl logs : voir les sorties
Section intitulée « kubectl logs : voir les sorties »kubectl logs mon-nginxOptions utiles :
kubectl logs mon-nginx --tail=20 # Les 20 dernières ligneskubectl logs mon-nginx --follow # Flux en temps réelkubectl logs mon-nginx --previous # Logs du conteneur précédent (après crash)kubectl exec : exécuter une commande
Section intitulée « kubectl exec : exécuter une commande »kubectl exec mon-nginx -- hostnamekubectl exec -it mon-nginx -- sh # Shell interactifAnatomie d’un Pod
Section intitulée « Anatomie d’un Pod »Maintenant que vous avez vu un Pod vivre, regardons sa structure YAML :
| Champ | Description |
|---|---|
metadata.name | Nom unique du Pod dans le namespace |
metadata.labels | Étiquettes pour organiser et sélectionner |
spec.containers[] | Liste des conteneurs (au moins un) |
spec.containers[].image | Image à utiliser |
spec.containers[].ports[] | Ports exposés (informatif) |
spec.restartPolicy | Comportement au redémarrage |
Cycle de vie d’un Pod
Section intitulée « Cycle de vie d’un Pod »Un Pod passe par plusieurs phases :
| Phase | Signification |
|---|---|
| Pending | Pod accepté mais pas encore sur un nœud. En attente de scheduling ou de téléchargement d’image. |
| Running | Pod assigné à un nœud, au moins un conteneur tourne. |
| Succeeded | Tous les conteneurs ont terminé avec succès (exit code 0). |
| Failed | Au 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 :
kubectl get pod mon-nginx -o jsonpath='{.status.phase}'Phase du Pod vs état des conteneurs
Section intitulée « Phase du Pod vs état des conteneurs »Chaque conteneur dans un Pod a son propre état :
| État | Description |
|---|---|
| Waiting | En attente (pull d’image, init container en cours…) |
| Running | Le conteneur s’exécute |
| Terminated | Le 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 :
| Valeur | Comportement | Cas d’usage |
|---|---|---|
Always (défaut) | Redémarre le conteneur quoi qu’il arrive | Services web, API |
OnFailure | Redémarre seulement si exit code ≠ 0 | Jobs de traitement batch |
Never | Ne redémarre jamais | Tâches ponctuelles, debug |
Exemple avec OnFailure
Section intitulée « Exemple avec OnFailure »apiVersion: v1kind: Podmetadata: name: job-podspec: containers: - name: worker image: busybox:1.36 command: ['sh', '-c', 'echo "Traitement..." && exit 0'] restartPolicy: OnFailureSi le conteneur échoue (exit 1), Kubernetes le redémarre. S’il réussit (exit 0), le Pod passe en Succeeded.
Backoff exponentiel
Section intitulée « Backoff exponentiel »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.
Init containers : préparer l’environnement
Section intitulée « Init containers : préparer l’environnement »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.
Cas d’usage
Section intitulée « Cas d’usage »- 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
Caractéristiques
Section intitulée « Caractéristiques »- 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)
Exemple : attendre un service
Section intitulée « Exemple : attendre un service »apiVersion: v1kind: Podmetadata: name: init-demospec: 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-alpineLe Pod restera en Init:0/1 jusqu’à ce que db-service:5432 réponde :
kubectl get pod init-demoNAME READY STATUS RESTARTS AGEinit-demo 0/1 Init:0/1 0 5sPod mono-conteneur vs Pod multi-conteneur
Section intitulée « Pod mono-conteneur vs Pod multi-conteneur »Cas majoritaire : 1 Pod = 1 conteneur
Section intitulée « Cas majoritaire : 1 Pod = 1 conteneur »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
Quand utiliser plusieurs conteneurs
Section intitulée « Quand utiliser plusieurs conteneurs »Les Pods multi-conteneurs servent à des cas spécifiques où les conteneurs doivent absolument partager réseau et volumes :
| Pattern | Description | Exemple |
|---|---|---|
| Sidecar | Conteneur auxiliaire qui enrichit l’app principale | Agent de logs, proxy Envoy |
| Init container | Prépare l’environnement avant l’app | Attente d’une dépendance |
Exemple : Pod avec sidecar
Section intitulée « Exemple : Pod avec sidecar »apiVersion: v1kind: Podmetadata: name: app-avec-sidecarspec: 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.
Pourquoi éviter les Pods nus en production
Section intitulée « Pourquoi éviter les Pods nus en production »Un Pod “nu” (créé directement avec kubectl run ou un YAML Pod) a plusieurs problèmes :
| Problème | Conséquence |
|---|---|
| Pas de rescheduling | Si le nœud tombe, le Pod disparaît définitivement |
| Pas de réplicas | Un seul Pod = pas de haute disponibilité |
| Pas de rolling update | Impossible de mettre à jour sans interruption |
| Pas d’auto-scaling | Le nombre de Pods est fixe |
Ce qu’il faut utiliser
Section intitulée « Ce qu’il faut utiliser »| Contrôleur | Cas d’usage |
|---|---|
| Deployment | Applications stateless (API, web) |
| StatefulSet | Applications stateful (bases de données) |
| DaemonSet | Un Pod par nœud (agents de monitoring) |
| Job | Tâches batch ponctuelles |
| CronJob | Tâches planifiées |
Ces contrôleurs créent et gèrent les Pods pour vous, avec la résilience nécessaire.
Debug : de basique à avancé
Section intitulée « Debug : de basique à avancé »Commencez toujours par le basique
Section intitulée « Commencez toujours par le basique »-
Voir l’état :
Fenêtre de terminal kubectl get pod mon-pod -o wide -
Lire les événements :
Fenêtre de terminal kubectl describe pod mon-pod | tail -20 -
Consulter les logs :
Fenêtre de terminal kubectl logs mon-pod --tail=50 -
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.
Surveiller les ressources
Section intitulée « Surveiller les ressources »kubectl top pod mon-podNAME CPU(cores) MEMORY(bytes)mon-pod 3m 45MiDebug avancé : ephemeral containers
Section intitulée « Debug avancé : ephemeral containers »Si le conteneur n’a pas de shell (image distroless, scratch), utilisez un conteneur éphémère :
kubectl debug -it mon-pod --image=busybox:1.36 --target=mon-conteneurLe conteneur éphémère partage le namespace réseau et process du Pod ciblé.
Dépannage : problèmes courants
Section intitulée « Dépannage : problèmes courants »CrashLoopBackOff
Section intitulée « CrashLoopBackOff »Symptôme : Le Pod redémarre en boucle.
NAME READY STATUS RESTARTS AGEmon-pod 0/1 CrashLoopBackOff 5 3mRappel : ce n’est pas une phase du Pod, mais un état d’attente visible dans STATUS.
Causes possibles :
- L’application plante au démarrage (erreur de code)
- Configuration manquante (variables d’environnement, secrets)
- Dépendance non disponible (base de données, API)
Diagnostic :
kubectl logs mon-pod --previous # Logs du crash précédentkubectl describe pod mon-pod # Voir le exit codeImagePullBackOff
Section intitulée « ImagePullBackOff »Symptôme : Kubernetes ne peut pas télécharger l’image.
Causes possibles :
- Image inexistante ou mal orthographiée
- Registry privée sans credentials
- Problème réseau
Diagnostic :
kubectl describe pod mon-pod | grep -A 5 "Events"Pending (bloqué)
Section intitulée « Pending (bloqué) »Symptôme : Le Pod reste en Pending.
Causes possibles :
- Ressources insuffisantes sur les nœuds
- Pas de nœud avec les bons labels/taints
- Volume PVC en attente
Diagnostic :
kubectl describe pod mon-pod | grep -A 10 "Events"kubectl get nodes -o widekubectl describe node <nom-du-noeud>Testez vos Connaissances
Section intitulée « Testez vos Connaissances »Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
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
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
À retenir
Section intitulée « À retenir »- Un Pod est l’unité minimale de Kubernetes : dans 80% des cas, 1 Pod = 1 conteneur
- Les conteneurs d’un Pod partagent réseau (localhost) et volumes
- Cycle de vie : Pending → Running → Succeeded/Failed
CrashLoopBackOffn’est pas une phase du Pod, mais un état d’attente du conteneurrestartPolicy: Always (défaut et le plus courant), OnFailure, Never- Les init containers s’exécutent avant les conteneurs principaux pour préparer l’environnement
- Ne créez jamais de Pods nus en production : utilisez Deployments, StatefulSets ou Jobs
- Debug : commencez par
get,describe,logs,execavantkubectl debug