Reemplaza una réplica de etcd con errores

En este documento, se describe cómo reemplazar una réplica de etcd con errores en un clúster de usuario de alta disponibilidad (HA) para GKE en VMware.

Las instrucciones que se brindan aquí se aplican a un clúster de usuario con alta disponibilidad que usa kubeception, es decir, un clúster de usuario que no tiene habilitado Controlplane V2. Si necesitas reemplazar una réplica de etcd en un clúster de usuario que tiene Controlplane V2 habilitado, comunícate con Atención al cliente de Cloud.

Antes de comenzar

  • Asegúrate de que el clúster de administrador funcione correctamente.

  • Asegúrate de que los otros dos miembros de etcd en el clúster de usuario funcionen de forma correcta. Si falló más de un miembro de etcd, consulta Recuperación ante daños o pérdidas de datos de etcd.

Reemplaza una réplica de etcd con errores

  1. Crea una copia de seguridad de un etcd PodDisruptionBudget (PDB) para que puedas restablecerlo más tarde.

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

    Aquí:

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

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

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

  2. Borra 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. Desvía el nodo de réplica etcd con errores.

    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 errores.

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

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

    En el ejemplo anterior, KUBE_ETCD_POD es el nombre del Pod de kube-etcd en funcionamiento. Por ejemplo, kube-etcd-0

    Desde este shell nuevo, 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

      El resultado muestra todos los IDs de miembros. Determina el ID de miembro de la réplica con errores.

      Luego, quita la réplica con errores:

      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

      En el que MEMBER_ID es el ID de miembro hexadecimal del Pod de réplica de etcd con errores.

    2. Agrega un miembro nuevo con el mismo nombre y la misma URL de par que el nodo de réplica con errores.

      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 errores. Por ejemplo, kube-etcd-1 o kube-etcd2.

  6. Sigue los pasos 1 a 3 en Implementa 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 falló en el clúster de usuario.

  7. Limpia el directorio de datos de etcd desde el Pod de 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. Borra el pod de utilidad.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
  9. Desacordonar el nodo con errores.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  10. Abre StatefulSet de kube-etcd en el 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
          ...
     
  11. Restablece el PDB de etcd que se borró en el paso 1.

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