In questo tutorial di Kubernetes imparerai a svuotare un nodo usando il comando kubectl drain per prepararti alla manutenzione.
È semplice come inserire questo comando:
kubectl drain node_name
Puoi ottenere i dettagli dei nodi usando kubectl get nodes
comando.
Ma c'è di più per drenare i nodi in Kubernetes, quindi diamo un'occhiata in dettaglio.
Perché hai bisogno di drenare i nodi?
Kubernetes è progettato per essere a tolleranza di errore degli errori dei nodi di lavoro.
Potrebbero esserci diversi motivi per cui un nodo di lavoro diventa inutilizzabile, ad esempio a causa di un problema hardware, un problema del provider cloud o se ci sono problemi di rete tra il nodo di lavoro e il nodo master, il master Kubernetes lo gestisce in modo efficace.
Ma ciò non significa che sarà sempre così. E questo è quando devi drenare i nodi e rimuovere tutti i pod.
Il drenaggio è il processo per sfrattare in sicurezza tutti i pod da un nodo. In questo modo, i contenitori in esecuzione sul pod terminano correttamente.
Come drenare correttamente i nodi in Kubernetes
Iniziamo con la dimostrazione pratica.
Fase 1:contrassegna il nodo come non programmabile (cordone)
Per eseguire la manutenzione su un nodo, devi annullare la pianificazione e quindi svuotare un nodo.
Per prima cosa dai un'occhiata ai nodi attualmente in esecuzione:
[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]:~#
Guarda i pod in esecuzione su nodi diversi:
[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]:~#
Ora contrassegna il nodo come non programmabile eseguendo il comando seguente:
[email protected]:~# kubectl cordon kworker-rj2
node/kworker-rj2 cordoned
[email protected]:~#
Elenca di nuovo i nodi:
[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]:~#
Puoi notare che il nodo kworker-rj2 è ora etichettato come SchedulingDisabled.
Fino a questo passaggio non elimina i pod in esecuzione su quel nodo. Verifica lo stato del 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]:~#
Puoi vedere quel pod "my-dep-557548758d-d2pmd" ancora in esecuzione sul nodo kworker-rj2.
Fase 2:svuota il nodo per prepararlo alla manutenzione
Ora svuota il nodo in preparazione per la manutenzione per rimuovere i pod in esecuzione sul nodo eseguendo il comando seguente:
[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]:~#
NOTA: kubectl drain non può eliminare i pod non gestiti da ReplicationController, ReplicaSet, Job, DaemonSet o StatefulSet. Devi usare --force per ignorarlo e in questo modo i singoli pod verranno eliminati in modo permanente.
Ora guarda i 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-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]:~#
Il pod in esecuzione sul nodo kworker-rj2 è stato rimosso da lì e avviato come nuovo pod sul nodo kworker-rj1.
Lo stato dei nodi rimane lo stesso:
[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]:~#
Fase 3:scollegare il nodo al termine della manutenzione
È necessario eseguire il comando seguente in seguito per dire a Kubernetes che può riprendere la pianificazione di nuovi pod sul nodo.
[email protected]:~# kubectl uncordon kworker-rj2
node/kworker-rj2 uncordoned
Verifica lo stato del nodo:
[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
Il nodo kworker-rj2 diventa di nuovo pronto per gestire nuovi carichi di lavoro.
Spero che questo suggerimento rapido sul drenaggio dei nodi in Kubernetes ti piaccia.
Rakesh Jain
DevOps professionale | RHCA | Jenkins | Git | Docker | Kubernetes | Abile | Prometeo | Grafana | AWS Cloud