GNU/Linux >> Linux Esercitazione >  >> Linux

Come drenare un nodo in Kubernetes

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

Linux
  1. Come installare Node.js su Fedora 35 / Fedora 34

  2. Come usare Podman all'interno di Kubernetes

  3. Come eliminare un servizio in Kubernetes

  4. Come aggiungere o rimuovere etichette ai nodi in Kubernetes

  5. Come installare NodeJs su Ubuntu 18.04

Come installare Kubernetes su Ubuntu 20.04

Come distribuire Kubernetes a nodo singolo con Microk8s su Ubuntu 20.04

Come installare Node.js su AlmaLinux 8

Come installare Node.js su Manjaro 20

Come installare Node.js su Debian 8

Come installare Node.js su Ubuntu 14.04