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

ReplicaSet Kubernetes : comprendre ce que crée un Deployment

10 min de lecture

logo kubernetes

Un ReplicaSet garantit qu’un nombre défini de Pods reste toujours actif. Si un Pod disparaît, le ReplicaSet le recrée automatiquement. En pratique, vous ne créez jamais de ReplicaSet directement — c’est le Deployment qui s’en charge.

Ce guide vous aide à comprendre ce qui se passe sous le capot quand vous créez un Deployment.

Conseil : lisez d’abord le guide Deployments pour comprendre le contexte d’usage le plus courant des ReplicaSets.

Un ReplicaSet maintient un nombre donné de Pods en fonctionnement. Un Deployment ajoute par-dessus la gestion des versions, des rolling updates et des rollbacks. En pratique, on manipule surtout des Deployments, qui créent et pilotent les ReplicaSets automatiquement.

RessourceRôle principal
ReplicaSetMaintenir un nombre donné de Pods
DeploymentGérer les versions, mises à jour et rollbacks via des ReplicaSets
  • Comprendre le rôle du ReplicaSet dans l’architecture Kubernetes
  • Observer les ReplicaSets créés automatiquement par vos Deployments
  • Distinguer ce que fait le ReplicaSet de ce que fait le Deployment
  • Diagnostiquer un problème au niveau du ReplicaSet

Un ReplicaSet est un contrôleur Kubernetes avec une mission simple : maintenir N Pods identiques en fonctionnement.

Son rôle :

  1. Surveiller les Pods correspondant à son selector
  2. Compter combien tournent actuellement
  3. Créer ou supprimer des Pods pour atteindre le nombre demandé (replicas)

Quand vous créez un Deployment, Kubernetes crée automatiquement un ReplicaSet. Vérifiez-le :

Fenêtre de terminal
kubectl get deployments
kubectl get rs

Exemple de sortie :

NAME READY UP-TO-DATE AVAILABLE
nginx-deploy 3/3 3 3
NAME DESIRED CURRENT READY AGE
nginx-deploy-7d545bdd84 3 3 3 5m

Le nom nginx-deploy-7d545bdd84 combine le nom du Deployment + un hash du template Pod.

Chaîne de propriété Kubernetes : Deployment crée ReplicaSet qui maintient les Pods

Vérifiez le propriétaire d’un ReplicaSet :

Fenêtre de terminal
kubectl get rs nginx-deploy-7d545bdd84 -o jsonpath='{.metadata.ownerReferences[0].kind}'
# Résultat : Deployment

Et le propriétaire d’un Pod :

Fenêtre de terminal
kubectl get pods -l app=nginx -o jsonpath='{.items[0].metadata.ownerReferences[0].kind}'
# Résultat : ReplicaSet

Pourquoi un Deployment crée un nouveau ReplicaSet à chaque mise à jour

Section intitulée « Pourquoi un Deployment crée un nouveau ReplicaSet à chaque mise à jour »

Quand vous changez l’image d’un Deployment, Kubernetes crée un nouveau ReplicaSet au lieu de modifier l’existant :

Fenêtre de terminal
kubectl set image deployment/nginx-deploy nginx=nginx:1.25
kubectl get rs -l app=nginx

Résultat :

NAME DESIRED CURRENT READY
nginx-deploy-795dcb6589 3 3 3 # nouveau
nginx-deploy-7d545bdd84 0 0 0 # ancien, scale à 0

Pourquoi ? Le Deployment garde l’ancien ReplicaSet (avec 0 replicas) pour permettre un rollback instantané. C’est lui qui stocke l’historique des révisions.

Un ReplicaSet contient 3 éléments essentiels :

ChampDescriptionExemple
replicasNombre de Pods à maintenir3
selectorLabels pour identifier les Pods gérésapp: nginx
templateModèle de Pod à créerImage, ports, etc.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-rs
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx # DOIT correspondre au selector
spec:
containers:
- name: nginx
image: nginx:1.24

Le selector : comment le ReplicaSet trouve ses Pods

Section intitulée « Le selector : comment le ReplicaSet trouve ses Pods »

Le selector est la règle qui définit quels Pods appartiennent au ReplicaSet. Le ReplicaSet surveille uniquement les Pods qui ont les labels correspondants.

selector:
matchLabels:
app: nginx
environment: production

Équivalent à : “sélectionne les Pods où app=nginx ET environment=production”.

Kubernetes prend aussi en charge des sélecteurs plus complexes (In, NotIn, Exists, DoesNotExist). Pour les détails, consultez le guide Labels et Selectors.

ActionComportement
Pod supprimé ou absentCrée un nouveau Pod pour revenir à l’état souhaité
Scale up demandéCrée les Pods manquants
Scale down demandéSupprime les Pods excédentaires
LimitationConséquence
Mise à jour des PodsModifier le template n’affecte pas les Pods existants
Rolling updatePas de mise à jour progressive
RollbackPas d’historique des versions

Démonstration : si vous modifiez l’image dans un ReplicaSet existant :

Fenêtre de terminal
kubectl set image rs/nginx-rs nginx=nginx:1.25
kubectl get pods -o jsonpath='{.items[*].spec.containers[0].image}'
# Résultat : nginx:1.24 nginx:1.24 nginx:1.24

Les Pods existants gardent l’ancienne image. Seuls les nouveaux Pods (si un Pod est supprimé et recréé) utiliseront la nouvelle image.

Cas particulier : créer un ReplicaSet manuellement

Section intitulée « Cas particulier : créer un ReplicaSet manuellement »

Dans la pratique, ce cas est rare. Il peut servir à des démonstrations, à des tests ou à la compréhension du fonctionnement interne des Deployments.

replicaset-demo.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: echo-rs
spec:
replicas: 3
selector:
matchLabels:
app: echo
template:
metadata:
labels:
app: echo
spec:
containers:
- name: echo
image: hashicorp/http-echo:1.0.0
Fenêtre de terminal
kubectl apply -f replicaset-demo.yaml
kubectl get rs echo-rs
Fenêtre de terminal
kubectl get rs
NAME DESIRED CURRENT READY AGE
echo-rs 3 3 3 2m
ColonneSignification
DESIREDNombre de Pods demandé (replicas)
CURRENTNombre de Pods créés
READYNombre de Pods prêts (passant les probes)
Fenêtre de terminal
kubectl describe rs echo-rs

Informations clés à regarder :

  • Selector : labels utilisés pour identifier les Pods
  • Replicas : X current / Y desired
  • Events : historique des actions (SuccessfulCreate, SuccessfulDelete)
Fenêtre de terminal
kubectl scale rs echo-rs --replicas=5
  1. Vérifier l’état du ReplicaSet

    Fenêtre de terminal
    kubectl get rs

    Si READY < DESIRED, des Pods ne démarrent pas.

  2. Lister les Pods associés

    Fenêtre de terminal
    kubectl get pods -l app=echo

    Identifiez les Pods en Pending, CrashLoopBackOff ou Error.

  3. Inspecter les événements du ReplicaSet

    Fenêtre de terminal
    kubectl describe rs echo-rs | grep -A 20 Events
  4. Diagnostiquer un Pod spécifique

    Fenêtre de terminal
    kubectl describe pod <nom-du-pod>
    kubectl logs <nom-du-pod>
SymptômeCause probableSolution
CURRENT < DESIREDQuota de ressources atteintVérifier kubectl describe ns <namespace>
Pods en PendingPas de node disponiblekubectl get nodes, libérer des ressources
Pods en CrashLoopBackOffErreur applicativeVérifier les logs du Pod
selector ne match pasLabels incohérentsComparer selector et template.labels
  1. Un ReplicaSet maintient N Pods identiques, mais ne gère pas les mises à jour
  2. Un Deployment crée et gère les ReplicaSets automatiquement
  3. À chaque mise à jour, le Deployment crée un nouveau ReplicaSet (rollback possible)
  4. Le selector lie le ReplicaSet à ses Pods via les labels
  5. En pratique, vous n’interagissez pas directement avec les ReplicaSets

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