GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo vaciar un nodo en Kubernetes

En este tutorial de Kubernetes, aprenderá a drenar un nodo usando el comando de drenaje kubectl para prepararse para el mantenimiento.

Es tan simple como ingresar este comando:

kubectl drain node_name

Puede obtener los detalles de los nodos usando kubectl get nodes comando.

Pero hay más en el drenaje de nodos en Kubernetes, así que echemos un vistazo detallado.

¿Por qué necesitas drenar los nodos?

Kubernetes está diseñado para ser tolerante a las fallas de los nodos trabajadores.

Puede haber diferentes razones por las que un nodo trabajador se vuelve inutilizable, como por un problema de hardware, un problema del proveedor de la nube o si hay problemas de red entre el nodo trabajador y el maestro, el maestro de Kubernetes lo maneja de manera efectiva.

Pero eso no significa que siempre será así. Y aquí es cuando necesitas drenar los nodos y eliminar todos los pods.

El drenaje es el proceso para desalojar de forma segura todos los pods de un nodo. De esta forma, los contenedores que se ejecutan en el pod terminan correctamente.

Cómo drenar correctamente los nodos en Kubernetes

Comencemos con la demostración práctica.

Paso 1:marcar el nodo como no programable (cordon)

Para realizar el mantenimiento de un nodo, debe anular la programación y luego vaciar un nodo.

Primero eche un vistazo a los nodos que se están ejecutando actualmente:

[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]:~#

Mire los pods que se ejecutan en diferentes nodos:

[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]:~#

Ahora marque el nodo como no programable ejecutando el siguiente comando:

[email protected]:~# kubectl cordon kworker-rj2
node/kworker-rj2 cordoned
[email protected]:~# 

Enumere los nodos nuevamente:

[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]:~#

Puede notar que el nodo kworker-rj2 ahora está etiquetado como SchedulingDisabled.

Hasta este paso, no expulsa los pods que se ejecutan en ese nodo. Verifique el estado 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]:~#

Puede ver que el pod "my-dep-557548758d-d2pmd" sigue ejecutándose en el nodo kworker-rj2.

Paso 2:Drenar el nodo para prepararlo para el mantenimiento

Ahora drene el nodo en preparación para el mantenimiento para eliminar los pods que se ejecutan en el nodo ejecutando el siguiente comando:

[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 no puede eliminar pods que no estén administrados por ReplicationController, ReplicaSet, Job, DaemonSet o StatefulSet. Debe usar --force para anular eso y, al hacerlo, los pods individuales se eliminarán de forma permanente.

Ahora mira las cápsulas:

[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]:~#

El pod que se ejecutaba en el nodo kworker-rj2 se desalojó de allí y comenzó como un nuevo pod en el nodo kworker-rj1.

El estado de los nodos sigue siendo el mismo:

[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]:~#

Paso 3:Desconecte el nodo después de completar el mantenimiento

Debe ejecutar el siguiente comando después para decirle a Kubernetes que puede reanudar la programación de nuevos pods en el nodo.

[email protected]:~# kubectl uncordon kworker-rj2
node/kworker-rj2 uncordoned

Verifique el estado 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

El nodo kworker-rj2 vuelve a estar listo para manejar nuevas cargas de trabajo.

Espero que les guste este consejo rápido sobre el drenaje de nodos en Kubernetes.

Rakesh Jain
Profesional DevOps | RHCA | Jenkins | Git | ventana acoplable | Kubernetes | Ansible | Prometeo | Grafana | Nube de AWS

Linux
  1. Cómo instalar Node.js en Fedora 35 / Fedora 34

  2. Cómo usar Podman dentro de Kubernetes

  3. Cómo eliminar un servicio en Kubernetes

  4. Cómo agregar o quitar etiquetas a los nodos en Kubernetes

  5. Cómo instalar NodeJs en Ubuntu 18.04

Cómo instalar Kubernetes en Ubuntu 20.04

Cómo implementar Kubernetes de un solo nodo con Microk8s en Ubuntu 20.04

Cómo instalar Node.js en AlmaLinux 8

Cómo instalar Node.js en Manjaro 20

Cómo instalar Node.js en Debian 8

Cómo instalar Node.js en Ubuntu 14.04