
Votre application reçoit 3 fois plus de trafic que prévu, ou vous venez de déployer une nouvelle version qui fait crasher les pods. Kubernetes gère ces deux situations avec 4 commandes complémentaires : kubectl scale ajuste le nombre de réplicas à la volée, kubectl autoscale le fait automatiquement selon la charge, kubectl rollout pilote les mises à jour et les rollbacks, et kubectl set modifie la config d’un Deployment sans toucher au YAML. Ce guide vous montre comment les utiliser en production.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Scaler manuellement un Deployment ou StatefulSet avec
kubectl scale - Configurer l’auto-scaling avec un HPA (Horizontal Pod Autoscaler)
- Déployer une mise à jour progressive (rolling update) et suivre sa progression
- Annuler un déploiement raté avec
kubectl rollout undo - Modifier l’image, les variables d’environnement ou les limites de ressources avec
kubectl set - Combiner ces commandes dans un workflow de déploiement complet
Quelle commande pour quel besoin ?
Section intitulée « Quelle commande pour quel besoin ? »| Besoin | Commande | Ce qu’elle fait |
|---|---|---|
| Ajouter/retirer des réplicas immédiatement | kubectl scale | Change le nombre de pods manuellement |
| Adapter les réplicas automatiquement à la charge | kubectl autoscale | Crée un HPA qui scale selon CPU/mémoire |
| Suivre/annuler une mise à jour | kubectl rollout | Contrôle le cycle de vie des rolling updates |
| Changer l’image, les env ou les ressources | kubectl set | Modifie un Deployment sans éditer le YAML |
kubectl scale : ajuster les réplicas manuellement
Section intitulée « kubectl scale : ajuster les réplicas manuellement »kubectl scale modifie le champ spec.replicas d’un Deployment, ReplicaSet ou StatefulSet. Le changement est immédiat : Kubernetes crée ou supprime les pods nécessaires.
kubectl scale <type>/<nom> --replicas=<nombre> [-n namespace]Recettes courantes
Section intitulée « Recettes courantes »Scaler un Deployment
Section intitulée « Scaler un Deployment »kubectl scale deploy/api-gateway --replicas=5 -n proddeployment.apps/api-gateway scaledVérification :
kubectl get deploy api-gateway -n prodNAME READY UP-TO-DATE AVAILABLE AGEapi-gateway 5/5 5 5 30dScaler un StatefulSet
Section intitulée « Scaler un StatefulSet »kubectl scale statefulset/postgres --replicas=3 -n prodScaler à zéro (suspendre une application)
Section intitulée « Scaler à zéro (suspendre une application) »kubectl scale deploy/batch-processor --replicas=0 -n devTous les pods sont supprimés. Le Deployment reste, prêt à être rescalé.
Scale conditionnel (seulement si le nombre actuel correspond)
Section intitulée « Scale conditionnel (seulement si le nombre actuel correspond) »kubectl scale deploy/api-gateway --replicas=5 --current-replicas=3 -n prodLe scale ne s’applique que si le Deployment a actuellement 3 réplicas. Utile dans les scripts pour éviter les races.
Scaler plusieurs Deployments d’un coup
Section intitulée « Scaler plusieurs Deployments d’un coup »kubectl scale deploy/api-gateway deploy/worker deploy/scheduler --replicas=3 -n prodScale et capacité du cluster
Section intitulée « Scale et capacité du cluster »kubectl autoscale : scaler automatiquement
Section intitulée « kubectl autoscale : scaler automatiquement »kubectl autoscale crée un Horizontal Pod Autoscaler (HPA) qui ajuste le nombre de réplicas automatiquement selon l’utilisation CPU ou mémoire.
Prérequis
Section intitulée « Prérequis »Le Metrics Server doit être installé dans le cluster pour que le HPA puisse lire les métriques :
# Vérifier que le Metrics Server est en placekubectl top nodesSi kubectl top retourne une erreur Metrics API not available, installez le Metrics Server :
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yamlkubectl autoscale <type>/<nom> --min=<min> --max=<max> --cpu-percent=<seuil>Créer un HPA basé sur le CPU
Section intitulée « Créer un HPA basé sur le CPU »kubectl autoscale deploy/api-gateway --min=2 --max=10 --cpu-percent=70 -n prodLe HPA maintient entre 2 et 10 réplicas. Si la charge CPU moyenne dépasse 70%, il ajoute des pods. Si elle descend, il en retire (jusqu’au minimum de 2).
horizontalpodautoscaler.autoscaling/api-gateway autoscaledVérifier l’état du HPA
Section intitulée « Vérifier l’état du HPA »kubectl get hpa -n prodNAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGEapi-gateway Deployment/api-gateway 45%/70% 2 10 3 5m- TARGETS :
45%/70%= utilisation actuelle / seuil cible - REPLICAS : nombre actuel de pods gérés par le HPA
Pour plus de détails :
kubectl describe hpa api-gateway -n prodHPA sur la mémoire ou des métriques custom
Section intitulée « HPA sur la mémoire ou des métriques custom »kubectl autoscale ne permet de cibler que le CPU. Pour scaler sur la mémoire ou des métriques personnalisées (requêtes/seconde, longueur de queue…), écrivez un manifest HPA v2 :
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: api-gateway namespace: prodspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: api-gateway minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80kubectl apply -f hpa-api-gateway.yamlSupprimer un HPA
Section intitulée « Supprimer un HPA »kubectl delete hpa api-gateway -n prodkubectl rollout : piloter les mises à jour
Section intitulée « kubectl rollout : piloter les mises à jour »Quand vous modifiez un Deployment (changement d’image, de variable d’env, de resources…), Kubernetes déclenche un rolling update : les anciens pods sont progressivement remplacés par les nouveaux. kubectl rollout vous permet de suivre, mettre en pause, reprendre et annuler ce processus.
Les sous-commandes de rollout
Section intitulée « Les sous-commandes de rollout »| Sous-commande | Ce qu’elle fait |
|---|---|
rollout status | Affiche la progression en temps réel |
rollout history | Liste les révisions précédentes |
rollout undo | Revient à la révision précédente (ou une révision spécifique) |
rollout pause | Met en pause un rollout en cours |
rollout resume | Reprend un rollout en pause |
rollout restart | Relance tous les pods (même sans changement de spec) |
Suivre un déploiement en cours
Section intitulée « Suivre un déploiement en cours »kubectl rollout status deploy/api-gateway -n prodWaiting for deployment "api-gateway" rollout to finish: 2 out of 5 new replicas have been updated...Waiting for deployment "api-gateway" rollout to finish: 3 out of 5 new replicas have been updated...deployment "api-gateway" successfully rolled outLe code retour est 0 si le rollout réussit, 1 sinon — exploitable dans les scripts.
Voir l’historique des révisions
Section intitulée « Voir l’historique des révisions »kubectl rollout history deploy/api-gateway -n prodREVISION CHANGE-CAUSE1 <none>2 Mise à jour nginx 1.25 → 1.273 Ajout variable LOG_LEVEL=debugPour voir le détail d’une révision spécifique :
kubectl rollout history deploy/api-gateway -n prod --revision=2Rollback : annuler un déploiement
Section intitulée « Rollback : annuler un déploiement »Si la nouvelle version pose problème :
# Revenir à la révision précédentekubectl rollout undo deploy/api-gateway -n prod
# Revenir à une révision spécifiquekubectl rollout undo deploy/api-gateway -n prod --to-revision=2deployment.apps/api-gateway rolled backVérifiez ensuite que le rollback est terminé :
kubectl rollout status deploy/api-gateway -n prodWorkflow de déploiement sécurisé
Section intitulée « Workflow de déploiement sécurisé »-
Prévisualisez les changements
Fenêtre de terminal kubectl diff -f api-gateway.yaml -
Appliquez la mise à jour
Fenêtre de terminal kubectl apply -f api-gateway.yaml -
Suivez le rollout en temps réel
Fenêtre de terminal kubectl rollout status deploy/api-gateway -n prod --timeout=300s -
Vérifiez que les pods sont sains
Fenêtre de terminal kubectl get pods -l app=api-gateway -n prodkubectl logs -l app=api-gateway -n prod --tail=20 -
Si problème, rollback immédiat
Fenêtre de terminal kubectl rollout undo deploy/api-gateway -n prod -
Annotez le changement pour l’historique
Fenêtre de terminal kubectl annotate deploy api-gateway -n prod \kubernetes.io/change-cause="v2.4.1 — correctif timeout connexion DB"
Mettre en pause et reprendre un rollout
Section intitulée « Mettre en pause et reprendre un rollout »Le rollout en pause permet de faire un canary partiel : une partie des pods est mise à jour, vous vérifiez, puis vous continuez ou annulez.
# Mettre en pause avant que tous les pods soient remplacéskubectl rollout pause deploy/api-gateway -n prod
# Vérifier l'état (ex: 2 pods sur 5 sont au nouveau code)kubectl get pods -l app=api-gateway -n prod -o wide
# Si tout va bien, reprendrekubectl rollout resume deploy/api-gateway -n prod
# Si ça ne va pas, annulerkubectl rollout undo deploy/api-gateway -n prodRedémarrer les pods (rollout restart)
Section intitulée « Redémarrer les pods (rollout restart) »rollout restart relance tous les pods un par un (rolling restart), même sans changement de spec. Utile pour :
- Prendre en compte un nouveau Secret ou ConfigMap monté en volume
- Forcer le pull d’une image avec tag
latest - Réinitialiser l’état applicatif
kubectl rollout restart deploy/api-gateway -n prodConfigurer la stratégie de rolling update
Section intitulée « Configurer la stratégie de rolling update »Le comportement du rolling update est contrôlé par spec.strategy dans le Deployment :
spec: strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 # Nombre de pods supplémentaires pendant la mise à jour maxUnavailable: 0 # Nombre de pods indisponibles pendant la mise à jour| Paramètre | Valeur | Effet |
|---|---|---|
maxSurge: 1, maxUnavailable: 0 | Zéro downtime | Un pod de plus est créé, l’ancien n’est supprimé que quand le nouveau est Ready |
maxSurge: 0, maxUnavailable: 1 | Ressources minimales | Un pod est supprimé, puis un nouveau est créé (léger downtime possible) |
maxSurge: 25%, maxUnavailable: 25% | Défaut Kubernetes | Compromis vitesse/stabilité |
kubectl set : modifier sans éditer le YAML
Section intitulée « kubectl set : modifier sans éditer le YAML »kubectl set permet de modifier un Deployment en une seule commande, sans ouvrir de fichier. Chaque modification déclenche automatiquement un rolling update.
set image : changer l’image d’un conteneur
Section intitulée « set image : changer l’image d’un conteneur »La commande la plus utilisée :
kubectl set image deploy/api-gateway api-gateway=nginx:1.27 -n proddeployment.apps/api-gateway image updatedVérification :
kubectl get deploy api-gateway -n prod -o jsonpath='{.spec.template.spec.containers[0].image}'# nginx:1.27Mettre à jour tous les conteneurs d’un Deployment :
kubectl set image deploy/api-gateway *=nginx:1.27 -n prodset env : ajouter ou modifier des variables d’environnement
Section intitulée « set env : ajouter ou modifier des variables d’environnement »# Ajouter ou modifier une variablekubectl set env deploy/api-gateway LOG_LEVEL=debug -n prod
# Supprimer une variablekubectl set env deploy/api-gateway LOG_LEVEL- -n prod
# Ajouter depuis un ConfigMapkubectl set env deploy/api-gateway --from=configmap/app-config -n prod
# Ajouter depuis un Secretkubectl set env deploy/api-gateway --from=secret/db-credentials -n prodVoir les variables actuelles :
kubectl set env deploy/api-gateway --list -n prodset resources : modifier les limites CPU/mémoire
Section intitulée « set resources : modifier les limites CPU/mémoire »kubectl set resources deploy/api-gateway -n prod \ --requests=cpu=200m,memory=256Mi \ --limits=cpu=500m,memory=512Miset serviceaccount : changer le compte de service
Section intitulée « set serviceaccount : changer le compte de service »kubectl set serviceaccount deploy/api-gateway api-sa -n prodBonnes pratiques
Section intitulée « Bonnes pratiques »- Utilisez
kubectl scalepour les réponses immédiates (pic de charge, incident) - Pour la gestion au quotidien, configurez un HPA — le scaling manuel ne tient pas sur la durée
- Définissez toujours des
resources.requestssur vos pods — sans eux, le HPA ne fonctionne pas et le scheduler planifie les pods à l’aveugle - Ne faites pas de
kubectl scalesur un Deployment géré par un HPA — le HPA écrasera votre changement
Déploiements
Section intitulée « Déploiements »- Suivez toujours un rollout avec
kubectl rollout status— ne partez pas en supposant que tout s’est bien passé - Annotez chaque déploiement avec
change-cause— votre futur vous remerciera quand il faudra comprendre quelle révision a cassé quelque chose - Utilisez
maxUnavailable: 0en production pour du zero-downtime - Testez vos rollbacks avant d’en avoir besoin — faites un
undoen dev pour vérifier que la procédure fonctionne - Préférez
kubectl set imageàkubectl editpour les changements d’image — c’est plus lisible, scriptable et tracé
- Combinez
diff→apply→rollout status→waitpour un workflow de déploiement complet et vérifiable - Documentez votre stratégie de rolling update dans le manifest du Deployment, pas dans un wiki séparé
Dépannage
Section intitulée « Dépannage »| Symptôme | Cause probable | Solution |
|---|---|---|
scale ne change rien | Un HPA est actif et écrase la valeur | Supprimez le HPA avec kubectl delete hpa NOM -n NS avant de scaler manuellement |
Pods restent Pending après scale | Pas assez de ressources dans le cluster | Vérifiez avec kubectl describe pod POD -n NS les events. Ajoutez des nœuds ou réduisez les requests |
HPA affiche unknown dans TARGETS | Metrics Server absent ou requests non définis | Installez le Metrics Server et définissez resources.requests sur vos pods |
| HPA ne scale pas vers le bas | Période de cooldown (5 min par défaut) | Attendez 5 minutes. Le HPA évite les oscillations en ajoutant un délai avant le scale-down |
Rollout bloqué : pods en CrashLoopBackOff | La nouvelle version crashe | Faites kubectl rollout undo deploy/NOM -n NS pour revenir à la version précédente |
rollout undo ne fait rien | Vous êtes déjà à la première révision | Vérifiez avec kubectl rollout history. Il n’y a pas de révision antérieure |
rollout status timeout | Le rolling update est trop lent ou bloqué | Vérifiez maxSurge/maxUnavailable, les PDB et l’état des pods avec kubectl get pods |
set image ne déclenche pas de rollout | L’image est identique à la valeur actuelle | Kubernetes ne rollout que si la spec change. Vérifiez l’image actuelle avec kubectl get deploy -o jsonpath |
| Rollout trop lent | maxSurge: 1 + beaucoup de réplicas | Augmentez maxSurge (ex: 25% ou 3) pour accélérer la mise à jour |
no rollout history found | Aucune modification n’a été faite depuis la création | C’est normal pour un Deployment fraîchement créé |
À retenir
Section intitulée « À retenir »kubectl scaleajuste les réplicas immédiatement — utilisez-le pour les urgences, un HPA pour le quotidien.kubectl autoscalecrée un HPA qui scale automatiquement sur le CPU. Pour la mémoire ou des métriques custom, écrivez un manifest HPA v2.- Le HPA exige des
resources.requestssur les pods — sans eux, il afficheunknownet ne scale pas. kubectl rollout statussuit un déploiement en temps réel.rollout undorevient à la révision précédente en une commande.rollout pause/resumepermet des canary partiels : mettez à jour une partie des pods, vérifiez, puis continuez ou annulez.kubectl setmodifie image, env ou resources sans éditer de YAML — chaque commande déclenche un rolling update.- Le workflow de deploy en prod : diff → apply → rollout status → vérification → annotation change-cause.
- Configurez
maxUnavailable: 0en production pour garantir le zero-downtime.