Kubernetes draining

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
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