Saltar a contenido

Sacar o reemplazar un nodo

Retira un worker de K3s (distribución ligera de Kubernetes) y miembro de Incus: primero se vacía, después se quita de cada clúster y por último del inventario. Para reemplazar un equipo, saca el viejo con este procedimiento y agrega el nuevo con Agregar un nodo.

Nodos que no se sacan con este procedimiento

  • deborah es el control plane de K3s y el DNS (BIND): sacarlo apaga el clúster. Hay que reconstruirlo (ver el runbook de bootstrap).
  • invincible es el leader de Incus y aloja la UI (interfaz de usuario) de Incus: antes hay que mover esos roles a otro nodo.
  • Quorum de Incus: el clúster tiene 3 miembros. Con 2, sigue funcionando pero ya no tolera otra caída. Agrega el reemplazo pronto.

En los ejemplos, el nodo a sacar es nolan.

1. Vaciar el nodo en K3s

kubectl cordon nolan
kubectl drain nolan --ignore-daemonsets --delete-emptydir-data

Si el nodo aporta disco a Longhorn (node.longhorn.io/create-default-disk: "true"), en la UI de Longhorn: Node → nolan → Edit → desactiva Scheduling y marca Eviction Requested. Espera a que sus réplicas se muevan a otros nodos antes de seguir.

2. Vaciar el nodo en Incus

Desde cualquier nodo del clúster Incus:

sudo incus list --all-projects --format csv --columns nL | grep nolan   # instancias en nolan
sudo incus cluster evacuate nolan                                        # las mueve o detiene

3. Quitarlo de K3s

kubectl delete node nolan
cd ansible
ansible-playbook -i inventory.ini playbook-uninstall-k3s.yml --limit nolan

En un worker, el playbook solo quita el agent (nunca toca el control plane).

4. Quitarlo de Incus

Desde el leader (invincible). El ssh entra con el acceso por SSO (opkssh login antes):

ssh devops@invincible.homelab.local sudo incus cluster remove nolan

5. Inventario y DNS

  1. Borra la línea del nodo en inventory.ini (grupo de arquitectura y k3s_agent) y su archivo host_vars/nolan.yml.
  2. Si estaba en reboot_schedule (group_vars/incus_cluster/k3s_install.yml), quítalo de ahí.
  3. Regenera el DNS para quitar nolan.mco.local:
ansible-playbook -i inventory.ini playbook-bind-dns.yml

Verificar

kubectl get nodes                          # nolan ya no aparece
ssh devops@invincible.homelab.local sudo incus cluster list   # nolan ya no aparece
dig +short nolan.mco.local @192.168.20.5   # sin respuesta

En Longhorn, los volúmenes tienen que quedar Healthy (sin réplicas en nolan).

Si falla

Síntoma Revisar
drain se queda esperando Un pod con PodDisruptionBudget o sin controlador; revisa con kubectl get pods -A -o wide \| grep nolan
Volúmenes de Longhorn Degraded No esperaste la evacuación de réplicas (paso 1); vuelve a agregar el disco o espera a que Longhorn reconstruya
incus cluster remove se niega Quedan instancias en el nodo: repite incus cluster evacuate nolan
El nodo ya no enciende Salta los pasos que requieren conectarse a él y usa sudo incus cluster remove --force nolan