Eliminación forzada de nodos rotos en clústeres de Anthos alojados en equipos físicos

Cuando un nodo está roto y se debe quitar de un clúster para su reparación o reemplazo, puedes forzar su eliminación del clúster.

Fuerza la eliminación de nodos trabajadores

En los clústeres de Anthos en equipos físicos, puedes agregar una anotación a fin de marcar un nodo para forzar la eliminación.

Después de quitar el nodo del grupo de nodos superior, ejecuta el siguiente comando para anotar la máquina con errores correspondiente con la anotación baremetal.cluster.gke.io/force-remove. El valor de la anotación en sí no tiene importancia:

kubectl --kubeconfig ADMIN_KUBECONFIG -n CLUSTER_NAMESPACE \
  annotate machine 10.200.0.8 baremetal.cluster.gke.io/force-remove=true

Los clústeres de Anthos de equipos físicos quitan el nodo correctamente.

Fuerza la eliminación de los nodos del plano de control

La eliminación automática de un nodo del plano de control es similar a realizar un kubeadm reset en los nodos del plano de control, y requiere pasos adicionales.

Para forzar la eliminación del nodo del plano de control de los grupos de nodos, debes realizar las siguientes acciones en el clúster que contiene el nodo del plano de control con errores:

  • Quita el miembro etcd con errores que se ejecuta en el nodo con errores del clúster etcd
  • actualice el ClusterStatus en kube para quitar el apiEndpoint correspondiente.

Quita un miembro etcd con errores

Para quitar el nodo del plan de control con fallas, primero ejecuta etcdctl en los Pods etcd en buen estado restantes. Para obtener más información general sobre esta operación, consulta esta documentación de Kubernetes.

En el siguiente procedimiento, CLUSTER_KUBECONFIG es la ruta al archivo kubeconfig del clúster.

  1. Busca el Pod etcd con el siguiente comando:

    kubectl --kubeconfig CLUSTER_KUBECONFIG get \
     pod -n kube-system -l component=etcd -o wide
    

    El comando muestra la siguiente lista de nodos. Para este ejemplo, supongamos que el nodo 10.200.0.8 es inaccesible y no se puede recuperar:

    NAME                READY   STATUS    RESTARTS   AGE     IP           NODE
    etcd-357b68f4ecf0   1/1     Running   0          9m2s    10.200.0.6   357b68f4ecf0
    etcd-7d7c21db88b3   1/1     Running   0          33m     10.200.0.7   7d7c21db88b3
    etcd-b049141e0802   1/1     Running   0          8m22s   10.200.0.8   b049141e0802
    

  2. Ejecuta uno de los Pods etcd en buen estado restantes:

    kubectl --kubeconfig CLUSTER_KUBECONFIG exec -it -n \
    kube-system etcd-357b68f4ecf0 -- /bin/sh
    
  3. Busca los miembros actuales para encontrar el ID del miembro con errores. El comando mostrará una lista:

    etcdctl --endpoints=https://10.200.0.6:2379,https://10.200.0.7:2379 --key=/etc/kubernetes/pki/etcd/peer.key \
    --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt  member list
    

    Este comando muestra, por ejemplo, lo siguiente:

    23da9c3f2594532a, started, 7d7c21db88b3, https://10.200.0.6:2380, https://10.200.0.6:2379, false
    772c1a54956b7f51, started, 357b68f4ecf0, https://10.200.0.7:2380, https://10.200.0.7:2379, false
    f64f66ad8d3e7960, started, b049141e0802, https://10.200.0.8:2380, https://10.200.0.8:2379, false
    
  4. Quita el miembro que falla:

    etcdctl --endpoints=https://10.200.0.6:2379,https://10.200.0.7:2379 --key=/etc/kubernetes/pki/etcd/peer.key \
    --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt \
     member remove f64f66ad8d3e7960
    

Actualiza ClusterStatus y quita el apiEndpoint con errores

En el siguiente procedimiento, CLUSTER_KUBECONFIG es la ruta al archivo kubeconfig del clúster.

  1. Busca la sección ClusterStatus dentro del mapa de configuración kubeadm-config:

    kubectl --kubeconfig CLUSTER_KUBECONFIG describe configmap -n \
    kube-system kubeadm-config
    

    El comando muestra resultados similares a los que se muestran a continuación:

    ...
    ClusterStatus:
    ----
    apiEndpoints:
    7d7c21db88b3:
      advertiseAddress: 10.200.0.6
      bindPort: 6444
    357b68f4ecf0:
      advertiseAddress: 10.200.0.7
      bindPort: 6444
    b049141e0802:
      advertiseAddress: 10.200.0.8
      bindPort: 6444
    apiVersion: kubeadm.k8s.io/v1beta2
    kind: ClusterStatus
    ...
    
  2. Edita el mapa de configuración para quitar la sección que contiene la IP con errores (en este ejemplo, se muestran los resultados de la eliminación de 10.200.0.8 con el comando kubectl edit):

    kubectl --kubeconfig CLUSTER_KUBECONFIG edit configmap \
    -n kube-system kubeadm-config
    

    Después de la edición, el mapa de configuración es similar al siguiente:

    ...
    ClusterStatus: |
      apiEndpoints:
        7d7c21db88b3:
          advertiseAddress: 10.200.0.6
          bindPort: 6444
        357b68f4ecf0:
          advertiseAddress: 10.200.0.7
          bindPort: 6444
      apiVersion: kubeadm.k8s.io/v1beta2
      kind: ClusterStatus
    ...
    
  3. Cuando guardas el mapa de configuración editado, el nodo que falla se quita del clúster.