ReplicaSets - ii02735/learn-k8 GitHub Wiki

Les ReplicaSets

Qu'est-ce qu'un ReplicaSet ?

Un ReplicaSet (littéralement « ensemble de réplicas ») est un contrôleur dont le rôle est de garantir qu'un nombre précis de Pods identiques tourne à tout moment dans le cluster.

On lui décrit :

  • le nombre de réplicas souhaité (spec.replicas)
  • un sélecteur (spec.selector) qui identifie les Pods qu'il gère, via leurs labels
  • un modèle de Pod (spec.template) servant à créer les Pods manquants

Un ReplicaSet qui maintient trois réplicas

Une boucle de contrôle

Le ReplicaSet fonctionne en boucle : il observe en permanence les Pods correspondant à son sélecteur, puis les compare au nombre désiré.

  • pas assez de Pods → il en crée de nouveaux à partir du template
  • trop de Pods → il en supprime pour revenir au nombre voulu

C'est ce mécanisme qui assure la haute disponibilité : si un Pod tombe, il est automatiquement remplacé.

:warning: Un ReplicaSet ne sait ni mettre à jour ni faire de rollback : modifier l'image dans son template ne met pas à jour les Pods existants. C'est le rôle du Deployment.

Sélecteur et modèle de Pod

  • Le sélecteur (spec.selector.matchLabels ou matchExpressions) doit correspondre aux labels du spec.template.
  • Le ReplicaSet adopte tout Pod existant dont les labels correspondent au sélecteur et qui n'a pas déjà de propriétaire. Il vaut donc mieux éviter de créer des Pods « orphelins » avec les mêmes labels.
  • Les Pods créés portent une ownerReference vers le ReplicaSet : supprimer le ReplicaSet supprime ses Pods (par défaut).

[!NOTE] spec.selector est immuable après la création : pour le modifier, il faut recréer le ReplicaSet.

Un manifeste ReplicaSet

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: web
  labels:
    app: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: app
          image: nginx:1.27
          ports:
            - containerPort: 80

ReplicaSet ou Deployment ?

En pratique, on ne crée presque jamais un ReplicaSet directement : on passe par un Deployment, qui se charge de créer et de gérer les ReplicaSets.

  • Deployment : gère les mises à jour (rolling update), les rollbacks et l'historique des versions ; chaque version correspond à un ReplicaSet.
  • ReplicaSet : garantit simplement le nombre de réplicas ; c'est lui qui crée réellement les Pods.

:warning: Utiliser un ReplicaSet nu pour une application qu'on devra un jour mettre à jour revient à gérer les remplacements à la main. Préférer un Deployment.

Mettre à l'échelle

Le nombre de réplicas peut être ajusté :

  • manuellement, en modifiant spec.replicas ou via kubectl scale
  • automatiquement, via un HorizontalPodAutoscaler (HPA) qui ajuste replicas selon la charge (CPU, mémoire, métriques personnalisées…)

→ Le détail (manuel vs HPA, fonctionnement, VPA, Cluster Autoscaler) est sur La mise à l'échelle.

Les commandes principales

  • Lister les ReplicaSets : kubectl get replicasets (ou kubectl get rs)
  • Obtenir les détails d'un ReplicaSet : kubectl describe rs web
  • Lister les Pods gérés : kubectl get pods -l app=web
  • Mettre à l'échelle : kubectl scale rs web --replicas=5
  • Supprimer un ReplicaSet et ses Pods : kubectl delete rs web