Saltar a contenido

Gestión del Clúster

Las 3 Reglas de Oro

  1. La Regla del Salto (Version Skew): NUNCA puedes saltarte una versión menor (minor version). Si estás en la v1.28.x, solo puedes actualizar a la v1.29.x. No puedes saltar directamente a la v1.30.x.

  2. El Orden Estricto: Siempre se actualiza de "arriba hacia abajo":

  3. Primero: La herramienta kubeadm.

  4. Segundo: El nodo Control Plane (Master).
  5. Tercero: Los nodos Workers.
  6. Por último: kubelet y kubectl en cada nodo.

  7. El Respaldo: En la vida real, siempre debes hacer un Backup de etcd antes de iniciar un upgrade.

Fase 1: Actualizar el Control Plane (Nodo Master)

Conéctate por SSH a tu nodo Master. El objetivo aquí es actualizar el "cerebro" del clúster (API server, scheduler, controller-manager).

  1. Actualizar la herramienta kubeadm:

    Primero debemos "descongelar" el paquete, actualizarlo a la versión exacta deseada y volver a congelarlo para que no se actualice por accidente con el sistema operativo.

    # Actualizar Kubeadm
    sudo apt-mark unhold kubeadm
    
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring-v1.30.gpg
    echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring-v1.30.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
    sudo apt-get update
    
    sudo apt-get install -y kubeadm=1.30.14-1.1  # Reemplaza por la versión objetivo
    sudo apt-mark hold kubeadm
    
    # kubeadm, kubectl, kubelet siempre deben estar holdeados
    apt-mark showhold
    # End Actualizar Kubeadm
    
  2. Verificar el plan de actualización:

    Este comando revisa el clúster y te dice a qué versiones puedes actualizar.

    # Verificar el plan
    sudo kubeadm upgrade plan
    # End Verificar el plan
    
  3. Aplicar la actualización:

    Este es el comando mágico que actualiza los Pods estáticos del Control Plane.

    # Aplicar actualización
    sudo kubeadm upgrade apply v1.30.14
    # End Aplicar actualización
    
  4. Drenar el nodo (Evacuar Pods):

    Antes de actualizar el agente local (kubelet), debemos vaciar el nodo de cargas de trabajo de forma segura.

    # Drenar el nodo
    # --ignore-daemonsets es vital, de lo contrario el comando fallará quejándose de que no puede borrar pods gestionados por un DaemonSet).
    kubectl drain <nombre-del-nodo> --ignore-daemonsets
    # End Drenar el nodo
    
  5. Actualizar Kubelet y Kubectl:

    # Actualizar kubelet kubectl
    sudo apt-mark unhold kubelet kubectl
    sudo apt-get install -y kubelet=1.30.14-1.1 kubectl=1.30.14-1.1
    sudo apt-mark hold kubelet kubectl
    # End Actualizar kubelet kubectl
    
  6. Reiniciar el servicio Kubelet:

    # Reiniciar kubelet
    sudo systemctl daemon-reload
    sudo systemctl restart kubelet
    # End Reiniciar kubelet
    
  7. Devolver el nodo a la normalidad (Uncordon):

    Le decimos al clúster que el nodo ya está listo para volver a recibir Pods.

    # Uncordon node
    kubectl uncordon <nombre-del-nodo>
    # End Uncordon node
    

Fase 2: Actualizar los Worker Nodes

Este proceso se repite por cada nodo Worker que tengas en el clúster.

  1. Actualizar kubeadm en el Worker:

    # Actualizar Kubeadm
    sudo apt-mark unhold kubeadm
    
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring-v1.30.gpg
    echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring-v1.30.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
    sudo apt-get update
    
    sudo apt-get install -y kubeadm=1.30.14-1.1  # Reemplaza por la versión objetivo
    sudo apt-mark hold kubeadm
    
    # kubeadm, kubectl, kubelet siempre deben estar holdeados
    apt-mark showhold
    # End Actualizar Kubeadm
    
  2. Drenar el Worker Node (Desde el Master o donde tengas acceso a la API):

    Movemos todos los Pods de las aplicaciones de este nodo a otros nodos sanos.

    # Drenar el nodo
    # --ignore-daemonsets es vital, de lo contrario el comando fallará quejándose de que no puede borrar pods gestionados por un DaemonSet).
    kubectl drain <nombre-del-nodo> --ignore-daemonsets
    # End Drenar el nodo
    
  3. Actualizar la configuración del nodo:

    Esto actualiza la configuración local del nodo.

    # Aplicar actualización en worker
    sudo kubeadm upgrade node
    # End Aplicar actualización en worker
    
  4. Actualizar Kubelet y Kubectl:

    # Actualizar kubelet kubectl
    sudo apt-mark unhold kubelet kubectl
    sudo apt-get install -y kubelet=1.30.14-1.1 kubectl=1.30.14-1.1
    sudo apt-mark hold kubelet kubectl
    # End Actualizar kubelet kubectl
    
  5. Reiniciar el servicio:

    # Reiniciar kubelet
    sudo systemctl daemon-reload
    sudo systemctl restart kubelet
    # End Reiniciar kubelet
    
  6. Devolver el Worker a la normalidad (Uncordon):

    # Uncordon node
    kubectl uncordon <nombre-del-nodo>
    # End Uncordon node
    

Fase 3: Verificación Final

Una vez que hayas actualizado el Control Plane y todos tus Workers, verifica que todos los nodos reporten la nueva versión y estén en estado Ready:

kubectl get nodes -o wide