Aller au contenu
Conteneurs & Orchestration medium

kubectl scale, autoscale, rollout et set : mise à l'échelle et mises à jour

18 min de lecture

logo kubernetes

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.

  • 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
BesoinCommandeCe qu’elle fait
Ajouter/retirer des réplicas immédiatementkubectl scaleChange le nombre de pods manuellement
Adapter les réplicas automatiquement à la chargekubectl autoscaleCrée un HPA qui scale selon CPU/mémoire
Suivre/annuler une mise à jourkubectl rolloutContrôle le cycle de vie des rolling updates
Changer l’image, les env ou les ressourceskubectl setModifie 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.

Fenêtre de terminal
kubectl scale <type>/<nom> --replicas=<nombre> [-n namespace]
Fenêtre de terminal
kubectl scale deploy/api-gateway --replicas=5 -n prod
deployment.apps/api-gateway scaled

Vérification :

Fenêtre de terminal
kubectl get deploy api-gateway -n prod
NAME READY UP-TO-DATE AVAILABLE AGE
api-gateway 5/5 5 5 30d
Fenêtre de terminal
kubectl scale statefulset/postgres --replicas=3 -n prod
Fenêtre de terminal
kubectl scale deploy/batch-processor --replicas=0 -n dev

Tous 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) »
Fenêtre de terminal
kubectl scale deploy/api-gateway --replicas=5 --current-replicas=3 -n prod

Le scale ne s’applique que si le Deployment a actuellement 3 réplicas. Utile dans les scripts pour éviter les races.

Fenêtre de terminal
kubectl scale deploy/api-gateway deploy/worker deploy/scheduler --replicas=3 -n prod

kubectl autoscale crée un Horizontal Pod Autoscaler (HPA) qui ajuste le nombre de réplicas automatiquement selon l’utilisation CPU ou mémoire.

Le Metrics Server doit être installé dans le cluster pour que le HPA puisse lire les métriques :

Fenêtre de terminal
# Vérifier que le Metrics Server est en place
kubectl top nodes

Si kubectl top retourne une erreur Metrics API not available, installez le Metrics Server :

Fenêtre de terminal
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
Fenêtre de terminal
kubectl autoscale <type>/<nom> --min=<min> --max=<max> --cpu-percent=<seuil>
Fenêtre de terminal
kubectl autoscale deploy/api-gateway --min=2 --max=10 --cpu-percent=70 -n prod

Le 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 autoscaled
Fenêtre de terminal
kubectl get hpa -n prod
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
api-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 :

Fenêtre de terminal
kubectl describe hpa api-gateway -n prod

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/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-gateway
namespace: prod
spec:
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: 80
Fenêtre de terminal
kubectl apply -f hpa-api-gateway.yaml
Fenêtre de terminal
kubectl delete hpa api-gateway -n prod

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.

Sous-commandeCe qu’elle fait
rollout statusAffiche la progression en temps réel
rollout historyListe les révisions précédentes
rollout undoRevient à la révision précédente (ou une révision spécifique)
rollout pauseMet en pause un rollout en cours
rollout resumeReprend un rollout en pause
rollout restartRelance tous les pods (même sans changement de spec)
Fenêtre de terminal
kubectl rollout status deploy/api-gateway -n prod
Waiting 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 out

Le code retour est 0 si le rollout réussit, 1 sinon — exploitable dans les scripts.

Fenêtre de terminal
kubectl rollout history deploy/api-gateway -n prod
REVISION CHANGE-CAUSE
1 <none>
2 Mise à jour nginx 1.25 → 1.27
3 Ajout variable LOG_LEVEL=debug

Pour voir le détail d’une révision spécifique :

Fenêtre de terminal
kubectl rollout history deploy/api-gateway -n prod --revision=2

Si la nouvelle version pose problème :

Fenêtre de terminal
# Revenir à la révision précédente
kubectl rollout undo deploy/api-gateway -n prod
# Revenir à une révision spécifique
kubectl rollout undo deploy/api-gateway -n prod --to-revision=2
deployment.apps/api-gateway rolled back

Vérifiez ensuite que le rollback est terminé :

Fenêtre de terminal
kubectl rollout status deploy/api-gateway -n prod
  1. Prévisualisez les changements

    Fenêtre de terminal
    kubectl diff -f api-gateway.yaml
  2. Appliquez la mise à jour

    Fenêtre de terminal
    kubectl apply -f api-gateway.yaml
  3. Suivez le rollout en temps réel

    Fenêtre de terminal
    kubectl rollout status deploy/api-gateway -n prod --timeout=300s
  4. Vérifiez que les pods sont sains

    Fenêtre de terminal
    kubectl get pods -l app=api-gateway -n prod
    kubectl logs -l app=api-gateway -n prod --tail=20
  5. Si problème, rollback immédiat

    Fenêtre de terminal
    kubectl rollout undo deploy/api-gateway -n prod
  6. 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"

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.

Fenêtre de terminal
# Mettre en pause avant que tous les pods soient remplacés
kubectl 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, reprendre
kubectl rollout resume deploy/api-gateway -n prod
# Si ça ne va pas, annuler
kubectl rollout undo deploy/api-gateway -n prod

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
Fenêtre de terminal
kubectl rollout restart deploy/api-gateway -n prod

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ètreValeurEffet
maxSurge: 1, maxUnavailable: 0Zéro downtimeUn pod de plus est créé, l’ancien n’est supprimé que quand le nouveau est Ready
maxSurge: 0, maxUnavailable: 1Ressources minimalesUn pod est supprimé, puis un nouveau est créé (léger downtime possible)
maxSurge: 25%, maxUnavailable: 25%Défaut KubernetesCompromis vitesse/stabilité

kubectl set permet de modifier un Deployment en une seule commande, sans ouvrir de fichier. Chaque modification déclenche automatiquement un rolling update.

La commande la plus utilisée :

Fenêtre de terminal
kubectl set image deploy/api-gateway api-gateway=nginx:1.27 -n prod
deployment.apps/api-gateway image updated

Vérification :

Fenêtre de terminal
kubectl get deploy api-gateway -n prod -o jsonpath='{.spec.template.spec.containers[0].image}'
# nginx:1.27

Mettre à jour tous les conteneurs d’un Deployment :

Fenêtre de terminal
kubectl set image deploy/api-gateway *=nginx:1.27 -n prod

set env : ajouter ou modifier des variables d’environnement

Section intitulée « set env : ajouter ou modifier des variables d’environnement »
Fenêtre de terminal
# Ajouter ou modifier une variable
kubectl set env deploy/api-gateway LOG_LEVEL=debug -n prod
# Supprimer une variable
kubectl set env deploy/api-gateway LOG_LEVEL- -n prod
# Ajouter depuis un ConfigMap
kubectl set env deploy/api-gateway --from=configmap/app-config -n prod
# Ajouter depuis un Secret
kubectl set env deploy/api-gateway --from=secret/db-credentials -n prod

Voir les variables actuelles :

Fenêtre de terminal
kubectl set env deploy/api-gateway --list -n prod
Fenêtre de terminal
kubectl set resources deploy/api-gateway -n prod \
--requests=cpu=200m,memory=256Mi \
--limits=cpu=500m,memory=512Mi
Fenêtre de terminal
kubectl set serviceaccount deploy/api-gateway api-sa -n prod
  • Utilisez kubectl scale pour 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.requests sur vos pods — sans eux, le HPA ne fonctionne pas et le scheduler planifie les pods à l’aveugle
  • Ne faites pas de kubectl scale sur un Deployment géré par un HPA — le HPA écrasera votre changement
  • 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: 0 en production pour du zero-downtime
  • Testez vos rollbacks avant d’en avoir besoin — faites un undo en dev pour vérifier que la procédure fonctionne
  • Préférez kubectl set image à kubectl edit pour les changements d’image — c’est plus lisible, scriptable et tracé
  • Combinez diffapplyrollout statuswait pour 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é
SymptômeCause probableSolution
scale ne change rienUn HPA est actif et écrase la valeurSupprimez le HPA avec kubectl delete hpa NOM -n NS avant de scaler manuellement
Pods restent Pending après scalePas assez de ressources dans le clusterVérifiez avec kubectl describe pod POD -n NS les events. Ajoutez des nœuds ou réduisez les requests
HPA affiche unknown dans TARGETSMetrics Server absent ou requests non définisInstallez le Metrics Server et définissez resources.requests sur vos pods
HPA ne scale pas vers le basPé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 CrashLoopBackOffLa nouvelle version crasheFaites kubectl rollout undo deploy/NOM -n NS pour revenir à la version précédente
rollout undo ne fait rienVous êtes déjà à la première révisionVérifiez avec kubectl rollout history. Il n’y a pas de révision antérieure
rollout status timeoutLe 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 rolloutL’image est identique à la valeur actuelleKubernetes ne rollout que si la spec change. Vérifiez l’image actuelle avec kubectl get deploy -o jsonpath
Rollout trop lentmaxSurge: 1 + beaucoup de réplicasAugmentez maxSurge (ex: 25% ou 3) pour accélérer la mise à jour
no rollout history foundAucune modification n’a été faite depuis la créationC’est normal pour un Deployment fraîchement créé
  • kubectl scale ajuste les réplicas immédiatement — utilisez-le pour les urgences, un HPA pour le quotidien.
  • kubectl autoscale cré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.requests sur les pods — sans eux, il affiche unknown et ne scale pas.
  • kubectl rollout status suit un déploiement en temps réel. rollout undo revient à la révision précédente en une commande.
  • rollout pause/resume permet des canary partiels : mettez à jour une partie des pods, vérifiez, puis continuez ou annulez.
  • kubectl set modifie 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: 0 en production pour garantir le zero-downtime.

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