Contrôle de maintenance sécurisé dans Kubernetes : Cordon, uncordon et Drain

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 kubelet sur 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 kubelet ou supprimer manuellement les pods en Terminating est nécessaire.

Ces outils assurent une maintenance sans interruption de service, en maintenant la cohérence et la disponibilité des applications.

Étiquettes: kubernetes kubectl node-drain cordon uncordon

Publié le 6 septembre à 21h52