Dans ce didacticiel Kubernetes, vous apprendrez à drainer un nœud à l'aide de la commande kubectl drain pour préparer la maintenance.
C'est aussi simple que d'entrer cette commande :
kubectl drain node_name
Vous pouvez obtenir les détails des nœuds en utilisant kubectl get nodes
commande.
Mais il y a plus à drainer les nœuds dans Kubernetes, alors examinons-le en détail.
Pourquoi avez-vous besoin de drainer des nœuds ?
Kubernetes est conçu pour être tolérant aux pannes des nœuds de travail.
Il peut y avoir différentes raisons pour lesquelles un nœud de travail devient inutilisable, par exemple en raison d'un problème matériel, d'un problème de fournisseur de cloud ou s'il existe des problèmes de réseau entre le nœud de travail et le nœud maître, le maître Kubernetes le gère efficacement.
Mais cela ne signifie pas que ce sera toujours le cas. Et c'est à ce moment que vous devez vider les nœuds et supprimer tous les pods.
Le drainage est le processus permettant d'expulser en toute sécurité tous les pods d'un nœud. De cette façon, les conteneurs exécutés sur le pod se terminent correctement.
Comment drainer correctement les nœuds dans Kubernetes
Commençons par la démonstration pratique.
Étape 1 :Marquer le nœud comme non programmable (cordon)
Pour effectuer la maintenance d'un nœud, vous devez annuler la planification, puis vider un nœud.
Examinez d'abord les nœuds en cours d'exécution :
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready <none> 44d v1.18.8
[email protected]:~#
Regardez les pods s'exécutant sur différents nœuds :
[email protected]:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-557548758d-gprnr 1/1 Running 1 4d23h 172.16.213.48 kworker-rj1 <none> <none>
my-dep-557548758d-d2pmd 1/1 Running 1 4d15h 172.16.213.57 kworker-rj2 <none> <none>
pod-delete-demo 1/1 Running 1 2d 172.16.213.56 kworker-rj1 <none> <none>
[email protected]:~#
Marquez maintenant le nœud comme non planifiable en exécutant la commande suivante :
[email protected]:~# kubectl cordon kworker-rj2
node/kworker-rj2 cordoned
[email protected]:~#
Listez à nouveau les nœuds :
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready,SchedulingDisabled <none> 44d v1.18.8
[email protected]:~#
Vous pouvez remarquer que le nœud kworker-rj2 est maintenant étiqueté comme SchedulingDisabled.
Jusqu'à cette étape, il n'expulse pas les pods exécutés sur ce nœud. Vérifiez l'état du pod :
[email protected]:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-557548758d-gprnr 1/1 Running 1 4d23h 172.16.213.48 kworker-rj1 <none> <none>
my-dep-557548758d-d2pmd 1/1 Running 1 4d15h 172.16.213.57 kworker-rj2 <none> <none>
pod-delete-demo 1/1 Running 1 2d 172.16.213.56 kworker-rj1 <none> <none>
[email protected]:~#
Vous pouvez voir que le pod "my-dep-557548758d-d2pmd" est toujours en cours d'exécution sur le nœud kworker-rj2.
Étape 2 :vidangez le nœud pour préparer la maintenance
Videz maintenant le nœud en préparation de la maintenance pour supprimer les pods qui s'exécutent sur le nœud en exécutant la commande suivante :
[email protected]:~# kubectl drain kworker-rj2 --grace-period=300 --ignore-daemonsets=true
node/kworker-rj2 already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-fl8dl, kube-system/kube-proxy-95vdf
evicting pod default/my-dep-557548758d-d2pmd
pod/my-dep-557548758d-d2pmd evicted
node/kworker-rj2 evicted
[email protected]:~#
REMARQUE : kubectl drain ne peut pas supprimer les pods non gérés par ReplicationController, ReplicaSet, Job, DaemonSet ou StatefulSet. Vous devez utiliser --force pour remplacer cela et, ce faisant, les pods individuels seront définitivement supprimés.
Regardez maintenant les pods :
[email protected]:~# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-dep-557548758d-gprnr 1/1 Running 1 4d23h 172.16.213.48 kworker-rj1 <none> <none>
my-dep-557548758d-dsanh 1/1 Running 0 27s 172.16.213.38 kworker-rj1 <none> <none>
pod-delete-demo 1/1 Running 1 2d 172.16.213.56 kworker-rj1 <none> <none>
[email protected]:~#
Le pod qui s'exécutait sur le nœud kworker-rj2 a été expulsé de là et a démarré comme un nouveau pod sur le nœud kworker-rj1.
L'état des nœuds reste le même :
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready,SchedulingDisabled <none> 44d v1.18.8
[email protected]:~#
Étape 3 :Déconnecter le nœud une fois la maintenance terminée
Vous devez ensuite exécuter la commande suivante pour indiquer à Kubernetes qu'il peut reprendre la planification de nouveaux pods sur le nœud.
[email protected]:~# kubectl uncordon kworker-rj2
node/kworker-rj2 uncordoned
Vérifiez l'état du nœud :
[email protected]:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kmaster-rj Ready master 44d v1.18.8
kworker-rj1 Ready <none> 44d v1.18.8
kworker-rj2 Ready <none> 44d v1.18.8
Le nœud kworker-rj2 redevient prêt à gérer de nouvelles charges de travail.
J'espère que vous aimez ce conseil rapide sur le drainage des nœuds dans Kubernetes.
Rakesh Jain
DevOps Professionnel | RHCA | Jenkins | Gite | Docker | Kubernetes | Ansible | Prométhée | Grafane | Nuage AWS