13.1 Gestion des nœuds en maintenance : cordon, uncordon et drain
Les commandes kubectl cordon, kubectl uncordon et kubectl drain sont essentielles pour effectuer des mises à jour ou des opérations d'entretien sur les nœuds Kubernetes sans perturber le service.
13.1.1 Cordon et uncordon : désactivation temporaire du planificateur
cordon empêche le planifiacteur Kubernetes de déployer de nouveaux pods sur un nœud spécifique. Cette acsion ne déplace pas les pods existants, mais bloque toute nouvelle affectation.
Exemple
[root@k8s-master01 13.1]# kubectl cordon k8s-node01 node/k8s-node01 cordoned
Vérification
[root@k8s-master01 13.1]# kubectl get node k8s-node01 NAME STATUS ROLES AGE VERSION k8s-node01 Ready,SchedulingDisabled 91d v1.29.2
</div>Le nœud reçoit une taint implicite `node.kubernetes.io/unschedulable:NoSchedule`, ce qui empêche le planificateur d’assigner de nouveaux pods.
**`uncordon`** inverse l’effet de `cordon` en réactivant le nœud pour les nouvelles affectations.
<div class="code-block">```
# Réactiver un nœud
kubectl uncordon k8s-node01
# Vérification
[root@k8s-master01 13.1]# kubectl describe node k8s-node01 | grep Taints
Taints: <none>
drain va au-delà de cordon en non seulement bloquant les nouvelles affectations, mais aussi en évacuant tous les pods actifs du nœud, avec un délai contrôlé.
Options clés :
--ignore-daemonsets=true : ignore les pods gérés par DaemonSet (ex : calico, node-exporter) --grace-period=900 : temps d'attente avant suppression forcée (en secondes)
</div>Exemple pratique :
<div class="code-block">```
[root@k8s-master01 13.1]# kubectl drain k8s-node02 \
--ignore-daemonsets=true \
--grace-period=900 \
--pod-selector=app=myapp
node/k8s-node02 cordoned
evicting pod default/myapp-77d465c645-wxztr
evicting pod default/myapp-77d465c645-29vzj
...
pod/myapp-77d465c645-q9gqh evicted
node/k8s-node02 drained
13.1.3 Comprotement et cas particuliers
Lorsqu’un pod reste en état Terminating après un drain, la migration échoue. Deux solutions s’offrent alors :
- Redémarrer le service
kubeletsur le nœud concerné :
</div>- Ou forcer la suppression du pod via :
<div class="code-block">```
kubectl delete pod <pod-name> --namespace=default --force --grace-period=0
13.1.4 Synthèse
cordon/uncordon: contrôlent uniquement la planification, utiles pour préparer un nœud à l’entretien.drain: garantit l’évacuation complète des charges, idéal pour les mises à jour matérielles ou logicielles.- En cas de blocage, redémarrer
kubeletou supprimer manuellement les pods enTerminatingest nécessaire.
Ces outils assurent une maintenance sans interruption de service, en maintenant la cohérence et la disponibilité des applications.