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