Exécutez kubectl run nginx --image=nginx:1.27 et Kubernetes crée un seul Pod, nommé nginx. Supprimez-le avec kubectl delete pod nginx et il disparaît pour de bon — personne ne le remarque, personne ne le remplace. Un Pod est la plus petite unité déployable dans Kubernetes : un ou plusieurs conteneurs qui partagent un namespace réseau et un ensemble de volumes, planifiés ensemble sur un seul nœud.
Ce Pod isolé est une impasse en production. Si le conteneur qu’il contient plante, le kubelet le redémarre sur place. Si le nœud redémarre, ou si quelqu’un supprime le Pod, rien ne le recrée. Un Pod nu ne sait pas qu’il est censé continuer à exister.
Ce qu’un Deployment ajoute à un Pod
Un Deployment est un objet Kubernetes qui indique combien de copies d’un Pod doivent exister et comment déployer les changements sur elles. Vous arrêtez de gérer les Pods directement et vous décrivez l’état désiré ; une boucle de contrôle se charge de le rendre réel. C’est le même modèle de réconciliation qui est derrière tout le reste dans Kubernetes.
| |
| |
| |
Trois Pods, pas un seul, et aucun ne s’appelle web-app. Ce schéma de nommage (web-app-7d9f8c7b86-4kxqz) est le premier signe que quelque chose d’autre les gère.
replicas: 3 correspond à la même instruction que celle que vous donnez avec docker compose up --scale web=3 dans Docker Compose. La différence, c’est qu’ici un contrôleur continue à faire respecter ce nombre bien après la fin de l’exécution de la commande.
Comment un Deployment crée réellement les Pods : le ReplicaSet entre les deux
Un Deployment ne crée pas les Pods directement. Il crée un ReplicaSet, et c’est le ReplicaSet qui crée les Pods. Vous pouvez voir toute la chaîne :
| |
| |
Le nom du ReplicaSet est le nom du Deployment plus un hash du template de Pod (7d9f8c7b86) ; le nom de chaque Pod est le nom du ReplicaSet plus un suffixe aléatoire. kubectl describe pod web-app-7d9f8c7b86-4kxqz montre la relation directement, dans le champ Controlled By : ReplicaSet/web-app-7d9f8c7b86.
Supprimez l’un de ces Pods et le compteur descend à 2. En quelques secondes, un remplaçant apparaît. C’est le ReplicaSet qui remarque le manque et crée un nouveau Pod à partir du même template, pas le Deployment qui agit directement. Le ReplicaSet fait la surveillance. Le Deployment existe pour la seule chose qu’un ReplicaSet ne peut pas faire seul : remplacer un template de Pod progressivement plutôt que d’un coup.
Ce qu’un rollout fait aux ReplicaSets
Changez l’image et appliquez :
| |
| |
Derrière cette ligne de statut, le Deployment a créé un second ReplicaSet pour le nouveau template de Pod et l’a monté en charge tout en réduisant l’ancien. Avec la stratégie RollingUpdate par défaut sur 3 réplicas, cela revient à un Pod à la fois :
| |
| |
L’ancien ReplicaSet n’est pas supprimé. Il reste à zéro réplica, mais garde l’ancien template de Pod en mémoire. C’est ce qui rend le rollback rapide :
| |
Kubernetes remonte en charge l’ancien ReplicaSet et redescend le nouveau — sans reconstruction, sans nouveau pull d’une ancienne image si elle est encore en cache sur le nœud. kubectl rollout history deployment/web-app --revision=1 montre encore exactement quelle image exécutait cette révision.
Quand un Pod nu est le bon choix
Un Pod nu n’est pas une erreur dans tous les contextes, seulement dans la plupart :
- Un conteneur de diagnostic jetable que vous supprimerez dans cinq minutes :
kubectl run debug --image=busybox -it --rm -- sh. - Un Job ou un CronJob, qui crée des Pods via son propre contrôleur parce que le travail doit aller jusqu’à son terme plutôt que de rester actif.
- Inspecter ou étudier la spec du Pod elle-même, avant de l’envelopper dans quelque chose qui la gère.
Tout ce qui doit continuer à tourner après un plantage, une panne de nœud ou une mise à jour passe par un Deployment. Ou par un StatefulSet, pour les Pods qui ont besoin d’une identité stable et de leur propre stockage — un problème différent, et un objet différent. Écrivez le manifeste de Deployment par défaut et ne descendez à un Pod nu que dans les trois cas ci-dessus.
Pod, ReplicaSet et Deployment côte à côte
| Pod | ReplicaSet | Deployment | |
|---|---|---|---|
| Ce qu’il gère | Conteneurs | Pods | ReplicaSets |
| Remplace une instance supprimée | Non | Oui | Oui, via son ReplicaSet |
| Scale à N réplicas | Non | Oui | Oui |
| Rolling updates | Non | Non | Oui |
| Rollback vers une version antérieure | Non | Non | Oui |
| Vous le créez directement | Rarement | Presque jamais | Normalement |
Comment vérifier si vos Pods ont un Deployment derrière eux
Exécutez ceci sur ce qui existe déjà dans votre cluster :
| |
Si seules des lignes de Pod reviennent, ce sont des Pods nus. C’est le manque à combler avant que le prochain drain de nœud n’emporte l’app avec eux.