Kubernetes draining
| Fiche express | |
|---|---|
| Type | Procédure de retrait propre d'un nœud (maintenance, mise à jour) |
| Commandes clés | kubectl cordon · kubectl drain · kubectl uncordon
|
| Voir aussi | Kubernetes HA · Kubernetes rancher · Kubernetes troubleshooting |
Le drain (vidage) d'un nœud est la procédure standard pour retirer proprement un worker du service — avant une maintenance, une mise à jour du système ou du kubelet, ou une sortie définitive du cluster — sans provoquer de coupure brutale des applications qui y tournent. Il se déroule en deux temps : marquer le nœud comme non planifiable, puis en évacuer les pods existants vers les autres nœuds.
Cordon : interdire toute nouvelle planification
kubectl cordon <nom-du-nœud>
Le cordon place le nœud en état SchedulingDisabled : le scheduler ne lui affectera plus aucun nouveau pod, mais les pods déjà présents continuent de tourner normalement. C'est une étape à part entière, utile isolément pour retirer temporairement un nœud instable des candidats de planification sans encore rien déplacer.
Drain : évacuer les pods existants
kubectl drain <nom-du-nœud> --ignore-daemonsets
drain effectue implicitement un cordon, puis expulse (evict) chaque pod du nœud en respectant, quand elle existe, la PodDisruptionBudget (PDB) de son contrôleur — c'est-à-dire le nombre minimal de réplicas que l'application exige de garder disponibles pendant l'opération. Le scheduler recrée ailleurs les pods gérés par un contrôleur (Deployment, StatefulSet, ReplicaSet...) ; un pod nu, sans contrôleur, n'est lui simplement pas recréé.
Options fréquemment nécessaires :
| Option | Rôle |
|---|---|
--ignore-daemonsets |
Les pods de DaemonSet ne sont pas expulsables (ils sont liés au nœud par nature) ; sans cette option, drain échoue en présence du moindre DaemonSet.
|
--delete-emptydir-data (anciennement --delete-local-data, à vérifier selon version) |
Autorise l'expulsion de pods utilisant un volume emptyDir, dont les données sont perdues (elles sont locales au nœud, non répliquées).
|
--force |
Autorise la suppression de pods non gérés par un contrôleur (donc non recréés ailleurs). |
--timeout |
Délai maximal accordé à l'expulsion avant abandon. |
# Cas courant : vidage complet avant maintenance
kubectl drain <nom-du-nœud> --ignore-daemonsets --delete-emptydir-data --force
Si une PodDisruptionBudget empêche l'expulsion d'un pod (le budget minimal de disponibilité serait franchi), drain patiente et retente plutôt que de forcer le départ — un comportement volontairement plus prudent qu'une suppression brute, qui laisse le temps à d'autres réplicas de redevenir disponibles ailleurs.
Uncordon : réintégrer le nœud
kubectl uncordon <nom-du-nœud>
Une fois la maintenance terminée, uncordon lève l'interdiction de planification : le nœud redevient un candidat normal pour le scheduler. Il ne récupère pas automatiquement les pods qui en avaient été évacués — c'est attendu, puisqu'ils tournent déjà ailleurs.
Vérifications utiles
# Voir où sont replanifiés les pods, et l'état des nœuds
kubectl get pods -o wide
kubectl get nodes
Voir aussi
- Kubernetes HA — pourquoi ne jamais vider plusieurs nœuds control plane à la fois
- Kubernetes rancher — cas pratique de maintenance planifiée sur un cluster RKE2
- Kubernetes troubleshooting — diagnostiquer un pod qui reste bloqué en attente de replanification