Passer au contenu principal

Fondamentaux (Kubernetes)

Deployments et ReplicaSets

Le Deployment est l'abstraction standard pour déployer des applications stateless. Il gère un ReplicaSet sous-jacent, qui lui-même maintient le nombre de pods demandé. La valeur ajoutée du Deployment sur le ReplicaSet brut : la gestion des mises à jour rolling et les rollbacks.

Deployment basique

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web          # Doit correspondre aux labels des pods
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.27-alpine
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "256Mi"
kubectl apply -f deployment.yaml
kubectl get deployment web
kubectl get replicaset          # Le RS créé par le Deployment
kubectl get pods -l app=web    # Les pods via leur label

Stratégie de mise à jour

Par défaut : RollingUpdate. Kubernetes remplace les pods progressivement, en maintenant la disponibilité.

spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1          # Pods supplémentaires autorisés pendant la MAJ
      maxUnavailable: 0    # Zéro pod indisponible à tout moment (déploiement safe)
# Mettre à jour l'image
kubectl set image deployment/web nginx=nginx:1.28-alpine

# Suivre le rollout
kubectl rollout status deployment/web

# Historique des révisions
kubectl rollout history deployment/web

# Rollback à la révision précédente
kubectl rollout undo deployment/web

# Rollback à une révision spécifique
kubectl rollout undo deployment/web --to-revision=2

Stratégie Recreate

Arrête tous les pods existants avant d'en démarrer de nouveaux. Provoque une coupure brève mais garantit qu'une seule version tourne à la fois. Utile pour les applications qui ne supportent pas plusieurs versions concurrentes (migrations de schéma incompatibles, etc.).

spec:
  strategy:
    type: Recreate

Scaling

# Scaling manuel
kubectl scale deployment web --replicas=5

# Scaling automatique (HPA — couvert dans Workloads)
kubectl autoscale deployment web --min=2 --max=10 --cpu-percent=70

Pause et reprise

On peut mettre un Deployment en pause pour appliquer plusieurs changements sans déclencher autant de rollouts :

kubectl rollout pause deployment/web
kubectl set image deployment/web nginx=nginx:1.28-alpine
kubectl set resources deployment/web -c nginx --limits=cpu=1,memory=512Mi
kubectl rollout resume deployment/web   # Un seul rollout pour les deux changements

ReplicaSet en direct

Le ReplicaSet est rarement manipulé directement — le Deployment le gère. Mais comprendre que chaque révision d'un Deployment crée un nouveau ReplicaSet (l'ancien est conservé avec 0 replicas pour permettre le rollback) aide à interpréter ce qu'on voit avec kubectl get rs.

Sources