
Comment mettre à jour une application en production avec un risque d’interruption minimal ? Kubernetes propose les rolling updates : vos nouveaux Pods démarrent progressivement pendant que les anciens sont supprimés. Si quelque chose se passe mal, un rollback déclenche un nouveau déploiement vers une révision précédente.
Ce guide vous montre comment configurer des mises à jour progressives fiables et revenir en arrière si nécessaire.
Prérequis : Deployments Kubernetes et kubectl configuré.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Déclencher une rolling update avec
kubectl set imageou en modifiant le manifeste - Suivre la progression avec
kubectl rollout status - Configurer la stratégie de déploiement (maxSurge, maxUnavailable)
- Détecter un rollout bloqué avec progressDeadlineSeconds
- Effectuer un rollback vers une version précédente
- Consulter et annoter l’historique des révisions
Comment fonctionne une rolling update
Section intitulée « Comment fonctionne une rolling update »Quand vous modifiez le Pod template (.spec.template) d’un Deployment, Kubernetes :
- Crée un nouveau ReplicaSet pour la nouvelle version
- Augmente progressivement le nouveau ReplicaSet
- Attend que les nouveaux Pods deviennent Ready, puis Available (si
minReadySecondsest défini) - Réduit l’ancien ReplicaSet au fur et à mesure
- Considère le rollout complet quand toutes les nouvelles réplicas sont disponibles et qu’aucune ancienne ne tourne
Déclencher une rolling update
Section intitulée « Déclencher une rolling update »Méthode 1 : kubectl set image
Section intitulée « Méthode 1 : kubectl set image »La façon la plus rapide de mettre à jour l’image :
kubectl set image deployment/mon-app conteneur=image:nouvelle-versionExemple :
kubectl set image deployment/nginx-rolling nginx=nginx:1.25Méthode 2 : modifier le manifeste
Section intitulée « Méthode 2 : modifier le manifeste »Changez l’image dans votre fichier YAML :
spec: template: spec: containers: - name: nginx image: nginx:1.25 # Anciennement 1.24Puis appliquez :
kubectl apply -f deployment.yamlMéthode 3 : kubectl edit
Section intitulée « Méthode 3 : kubectl edit »kubectl edit deployment/mon-appModifiez l’image dans l’éditeur qui s’ouvre, puis sauvegardez.
Suivre la progression
Section intitulée « Suivre la progression »Statut en temps réel
Section intitulée « Statut en temps réel »kubectl rollout status deployment/nginx-rollingSortie :
Waiting for deployment "nginx-rolling" rollout to finish: 1 out of 3 new replicas have been updated...Waiting for deployment "nginx-rolling" rollout to finish: 2 out of 3 new replicas have been updated...deployment "nginx-rolling" successfully rolled outObserver les Pods
Section intitulée « Observer les Pods »kubectl get pods -l app=nginx-rolling -wVous verrez les nouveaux Pods apparaître (ContainerCreating → Running) et les anciens disparaître (Terminating).
Voir les ReplicaSets
Section intitulée « Voir les ReplicaSets »kubectl get rs -l app=nginx-rollingSortie :
NAME DESIRED CURRENT READY AGEnginx-rolling-64757d479 0 0 0 5m # Anciennginx-rolling-7bf8c77b47 3 3 3 30s # NouveauL’ancien ReplicaSet reste (DESIRED=0) pour permettre un rollback.
Configurer la stratégie de déploiement
Section intitulée « Configurer la stratégie de déploiement »Les paramètres clés
Section intitulée « Les paramètres clés »apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-rollingspec: replicas: 4 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 # Combien de Pods en plus pendant l'update maxUnavailable: 1 # Combien de Pods peuvent être indisponibles progressDeadlineSeconds: 600 # Timeout pour détecter un rollout bloqué minReadySeconds: 10 # Attendre 10s après Ready avant de continuer selector: matchLabels: app: nginx-rolling template: metadata: labels: app: nginx-rolling spec: containers: - name: nginx image: nginx:1.25 readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 3maxSurge et maxUnavailable
Section intitulée « maxSurge et maxUnavailable »| Paramètre | Valeur par défaut | Description |
|---|---|---|
maxSurge | 25% | Nombre de Pods supplémentaires créés pendant l’update (au-delà de replicas) |
maxUnavailable | 25% | Nombre maximal de Pods pouvant être indisponibles pendant l’update |
Comprendre maxUnavailable
Section intitulée « Comprendre maxUnavailable »maxUnavailable contrôle combien de Pods peuvent être indisponibles (pas juste “non-Running”). Un Pod peut être Running sans être Ready ni Available — c’est la disponibilité qui compte, pas l’état Running.
| Valeur | Effet |
|---|---|
maxUnavailable: 1 | 1 Pod peut être indisponible pendant l’update |
maxUnavailable: 25% | 25% des Pods peuvent être indisponibles (arrondi à l’inférieur) |
maxUnavailable: 0 | Aucun Pod ne doit devenir indisponible — rollout plus prudent mais plus lent |
Exemples de stratégies
Section intitulée « Exemples de stratégies »Mise à jour rapide (priorité à la vitesse) :
strategy: rollingUpdate: maxSurge: 50% maxUnavailable: 50%Mise à jour prudente (priorité à la disponibilité) :
strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0Détecter un rollout bloqué
Section intitulée « Détecter un rollout bloqué »progressDeadlineSeconds
Section intitulée « progressDeadlineSeconds »Ce paramètre définit le délai après lequel Kubernetes considère que le rollout n’avance plus :
spec: progressDeadlineSeconds: 600 # 10 minutesSi le rollout n’a pas progressé pendant cette durée (pas de nouveau Pod Ready/Available), le contrôleur marque le Deployment comme failed dans son statut.
Vérifier le statut :
kubectl describe deployment/nginx-rolling | grep -A 5 "Conditions"Sortie si bloqué :
Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing False ProgressDeadlineExceededRevérifier avec kubectl rollout status
Section intitulée « Revérifier avec kubectl rollout status »kubectl rollout status deployment/nginx-rolling --timeout=5mLa commande retourne un code d’erreur si le rollout échoue ou dépasse le timeout.
Stratégie Recreate (arrêt complet)
Section intitulée « Stratégie Recreate (arrêt complet) »Pour certains cas très spécifiques, vous pouvez forcer un arrêt complet avant de recréer :
spec: strategy: type: RecreateRollback : revenir en arrière
Section intitulée « Rollback : revenir en arrière »Un rollback déclenche un nouveau rollout vers une révision précédente. Ce n’est pas un basculement instantané — Kubernetes applique la même stratégie de rolling update pour revenir en arrière.
Rollback vers la révision précédente
Section intitulée « Rollback vers la révision précédente »kubectl rollout undo deployment/nginx-rollingSortie :
deployment.apps/nginx-rolling rolled backVérifier la version restaurée
Section intitulée « Vérifier la version restaurée »kubectl get deployment nginx-rolling -o jsonpath='{.spec.template.spec.containers[0].image}'Consulter l’historique des révisions
Section intitulée « Consulter l’historique des révisions »kubectl rollout history deployment/nginx-rollingSortie :
REVISION CHANGE-CAUSE1 Initial deployment2 Upgrade vers nginx 1.25 pour CVE-2024-xxxx3 <none>Rollback vers une révision spécifique
Section intitulée « Rollback vers une révision spécifique »kubectl rollout undo deployment/nginx-rolling --to-revision=1Voir les détails d’une révision
Section intitulée « Voir les détails d’une révision »kubectl rollout history deployment/nginx-rolling --revision=2Annoter les changements
Section intitulée « Annoter les changements »Pour garder une trace des raisons de chaque déploiement, annotez avec kubernetes.io/change-cause :
kubectl annotate deployment/nginx-rolling \ kubernetes.io/change-cause="Upgrade vers nginx 1.25 pour CVE-2024-xxxx"Ou définissez l’annotation dans le manifeste :
metadata: annotations: kubernetes.io/change-cause: "Upgrade vers nginx 1.25 pour CVE-2024-xxxx"Limiter l’historique des révisions
Section intitulée « Limiter l’historique des révisions »Par défaut, Kubernetes conserve 10 révisions (anciens ReplicaSets). Pour économiser de l’espace :
spec: revisionHistoryLimit: 5Pause et reprise d’un rollout
Section intitulée « Pause et reprise d’un rollout »Mettre en pause
Section intitulée « Mettre en pause »kubectl rollout pause deployment/nginx-rollingUtile pour :
- Faire plusieurs modifications avant de reprendre (évite des rollouts intermédiaires)
- Investiguer un problème sans que le rollout continue
Reprendre
Section intitulée « Reprendre »kubectl rollout resume deployment/nginx-rollingRollouts multiples en cours (rollover)
Section intitulée « Rollouts multiples en cours (rollover) »Si vous modifiez à nouveau le Deployment pendant qu’un rollout est en cours, Kubernetes :
- Crée un nouveau ReplicaSet pour la dernière version
- Commence à abandonner le rollout précédent
- Scale down le ReplicaSet de la version intermédiaire
Exemple :
# Rollout en cours vers v2kubectl set image deployment/app app=image:v2
# Avant que v2 soit complètement déployé, vous changez pour v3kubectl set image deployment/app app=image:v3Kubernetes va progressivement abandonner v2 et passer directement à v3.
Tableau de décision
Section intitulée « Tableau de décision »| Situation | Réglage conseillé |
|---|---|
| Priorité à la disponibilité | maxUnavailable: 0, maxSurge faible, readinessProbe, minReadySeconds |
| Priorité à la rapidité | maxSurge élevé (50%+), maxUnavailable non nul |
| Cluster contraint en ressources | Rolling update conservateur, maxSurge faible, éviter le surge |
| Application fragile au démarrage | readinessProbe stricte, minReadySeconds élevé, progressDeadlineSeconds adapté |
| Déploiement bleu-vert | maxSurge: 100%, maxUnavailable: 0 (double temporaire des ressources) |
| Migration incompatible | Stratégie Recreate ou StatefulSet |
Bonnes pratiques
Section intitulée « Bonnes pratiques »1. Toujours configurer une readinessProbe
Section intitulée « 1. Toujours configurer une readinessProbe »Sans readinessProbe, Kubernetes risque de considérer un Pod disponible trop tôt, ce qui peut dégrader le rollout et exposer des Pods non réellement prêts au trafic.
spec: containers: - name: app readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 3 failureThreshold: 32. Définir minReadySeconds
Section intitulée « 2. Définir minReadySeconds »Attendez quelques secondes après le Ready avant de continuer le rollout :
spec: minReadySeconds: 10 # Le Pod doit être Ready pendant 10s avant d'être considéré Available3. Définir progressDeadlineSeconds
Section intitulée « 3. Définir progressDeadlineSeconds »Détectez automatiquement les rollouts bloqués :
spec: progressDeadlineSeconds: 600 # 10 minutes4. Annoter les déploiements
Section intitulée « 4. Annoter les déploiements »kubectl annotate deployment/app \ kubernetes.io/change-cause="Upgrade vers v2.1 - fix bug #1234"5. Conserver un historique raisonnable
Section intitulée « 5. Conserver un historique raisonnable »spec: revisionHistoryLimit: 5 # Pas 0, sinon pas de rollback possibleAnti-patterns à éviter
Section intitulée « Anti-patterns à éviter »| Anti-pattern | Problème | Solution |
|---|---|---|
Pas de readinessProbe | Pods exposés avant d’être prêts | Configurer une probe réaliste |
revisionHistoryLimit: 0 | Impossible de faire un rollback | Garder au moins 3-5 révisions |
| Rollback sur Deployment pausé | Échoue | Reprendre d’abord avec resume |
| Supposer “zéro downtime” garanti | Le rollout dépend de la config et des ressources | Configurer stratégie + probes + tests |
Utiliser Recreate pour la persistance | Interruption de service, pas de garantie d’ordre | Utiliser un StatefulSet |
| Modifier le selector après création | Immutable en apps/v1 | Recréer le Deployment si nécessaire |
Enchaîner les apply sans vérifier | Rollover peut créer de la confusion | Attendre rollout status entre les déploiements |
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
| Rollout bloqué à “Waiting” | Nouveaux Pods pas Ready | Vérifier les logs et les probes |
ProgressDeadlineExceeded | Rollout n’avance plus depuis X secondes | Investiguer les Pods, éventuellement rollback |
| Pods en CrashLoopBackOff | Erreur dans la nouvelle image | Rollback immédiat |
| Rollout très lent | maxUnavailable: 0 + ressources limitées | Augmenter maxSurge ou les ressources |
| Historique vide | revisionHistoryLimit: 0 | Augmenter la limite |
| Rollback échoue | Deployment pausé | kubectl rollout resume d’abord |
| Anciens Pods qui ne disparaissent pas | terminationGracePeriodSeconds trop long | Réduire ou vérifier que l’app gère SIGTERM |
Voir pourquoi un Pod n’est pas Ready
Section intitulée « Voir pourquoi un Pod n’est pas Ready »kubectl describe pod nom-du-pod | grep -A 10 "Conditions"kubectl logs nom-du-pod --previousVoir les événements du Deployment
Section intitulée « Voir les événements du Deployment »kubectl describe deployment/nginx-rolling | grep -A 20 "Events"Vérifier le statut du rollout
Section intitulée « Vérifier le statut du rollout »kubectl get deployment nginx-rolling -o jsonpath='{.status.conditions[*].type}'Réflexes CKAD
Section intitulée « Réflexes CKAD »-
Déclencher une rolling update
Fenêtre de terminal kubectl set image deployment/app app=image:v2 -
Suivre la progression
Fenêtre de terminal kubectl rollout status deployment/app -
Consulter l’historique
Fenêtre de terminal kubectl rollout history deployment/app -
Rollback
Fenêtre de terminal kubectl rollout undo deployment/app# Ou vers une révision spécifiquekubectl rollout undo deployment/app --to-revision=2 -
Vérifier les ReplicaSets
Fenêtre de terminal kubectl get rskubectl describe deployment/app -
Piège courant
kubectl scalene crée pas de nouvelle révision. Seules les modifications du Pod template déclenchent un rollout.
À retenir
Section intitulée « À retenir »- Rolling update = mise à jour progressive avec interruption minimale si bien configurée
- Seules les modifications du Pod template déclenchent une nouvelle révision
maxSurgeetmaxUnavailablevalent 25% par défautmaxUnavailable: 0= aucun Pod indisponible, mais nécessite plus de ressources- progressDeadlineSeconds détecte les rollouts bloqués
- Un rollback déclenche un nouveau rollout vers une ancienne révision — ce n’est pas instantané
- Impossible de rollback un Deployment pausé — reprendre d’abord
revisionHistoryLimit: 0= pas de rollback possible- Toujours configurer des readinessProbes et minReadySeconds
- Pour un vrai canary avec contrôle du trafic, utilisez Argo Rollouts ou un service mesh