Reemplazar una réplica de etcd con fallos

En este documento se describe cómo sustituir una réplica de etcd que ha fallado en un clúster de usuario de alta disponibilidad (HA) de Google Distributed Cloud.

Las instrucciones que se indican aquí se aplican a un clúster de usuario de alta disponibilidad que usa kubeception, es decir, un clúster de usuario que no tiene habilitado Controlplane V2. Si necesitas sustituir una réplica de etcd en un clúster de usuario que tenga habilitado Controlplane V2, ponte en contacto con el equipo de Asistencia de Google Cloud.

Antes de empezar

Reemplazar una réplica de etcd con fallos

  1. Crea una copia de seguridad del PodDisruptionBudget (PDB) de etcd para poder restaurarlo más adelante.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get pdb kube-etcd-pdb -o yaml > PATH_TO_PDB_FILE

    Donde:

    • ADMIN_CLUSTER_KUBECONFIG es la ruta al archivo kubeconfig del clúster de administrador.

    • USER_CLUSTER_NAME es el nombre del clúster de usuario que contiene la réplica de etcd fallida.

    • PATH_TO_PDB_FILE es la ruta en la que quieres guardar el archivo PDB de etcd. Por ejemplo, /tmp/etcpdb.yaml.

  2. Elimina el PodDisruptionBudget (PDB) de etcd.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
  3. Ejecuta el siguiente comando para abrir el StatefulSet de kube-etcd en tu editor de texto:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd

    Cambia el valor de la marca --initial-cluster-state a existing.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=existing
          ...
     
  4. Drena el nodo de réplica de etcd con fallos.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG drain NODE_NAME --ignore-daemonsets --delete-local-data

    Donde NODE_NAME es el nombre del nodo de réplica de etcd con fallos.

  5. Crea un nuevo shell en el contenedor de uno de los pods de kube-etcd que funcionan.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it \
       KUBE_ETCD_POD --container kube-etcd --namespace USER_CLUSTER_NAME \
       -- bin/sh

    Donde KUBE_ETCD_POD es el nombre del pod de kube-etcd en funcionamiento. Por ejemplo, kube-etcd-0.

    En este nuevo shell, ejecuta los siguientes comandos:

    1. Quita el nodo de réplica de etcd con errores del clúster de etcd.

      Primero, enumera todos los miembros del clúster de etcd:

      etcdctl member list -w table

      En el resultado se muestran todos los IDs de miembro. Determina el ID de miembro de la réplica fallida.

      A continuación, elimina la réplica que ha fallado:

      export ETCDCTL_CACERT=/etcd.local.config/certificates/etcdCA.crt
      export ETCDCTL_CERT=/etcd.local.config/certificates/etcd.crt
      export ETCDCTL_CERT=/etcd.local.config/certificates/etcd.crt
      export ETCDCTL_KEY=/etcd.local.config/certificates/etcd.key
      export ETCDCTL_ENDPOINTS=https://127.0.0.1:2379
      etcdctl member remove MEMBER_ID

      Donde MEMBER_ID es el ID de miembro hexadecimal del pod de réplica de etcd fallido.

    2. Añade un nuevo miembro con el mismo nombre y la misma URL de peer que el nodo de réplica que ha fallado.

      etcdctl member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380

      Donde MEMBER_NAME es el identificador del nodo de réplica de kube-etcd con fallos. Por ejemplo, kube-etcd-1 o kube-etcd2.

  6. Sigue los pasos del 1 al 3 de Implementar los pods de utilidad para crear un pod de utilidad en el clúster de administrador. Este pod se usa para acceder al PersistentVolume (PV) del miembro de etcd que ha fallado en el clúster de usuario.

  7. Limpia el directorio de datos de etcd desde el pod de la utilidad.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- /bin/bash -c 'rm -rf /var/lib/etcd/*'
  8. Elimina el Pod de la compañía eléctrica.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
  9. Deja de acordonar el nodo que ha fallado.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  10. Abre el StatefulSet kube-etcd en tu editor de texto.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd

    Cambia el valor de la marca --initial-cluster-state a new.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=new
          ...
     
  11. Restaura el PDB de etcd que se ha eliminado en el paso 1.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml