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 Cloud Customer Care.

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 con fallos.

    • 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. Elimina el nodo de réplica de etcd con fallos del clúster de etcd.

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

      etcdctl member list -w table

      En la salida 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 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. Lista los pods de etcd que gestionan el almacén de etcd de tu clúster de usuarios. Estos pods se ejecutan en el clúster de administrador:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --namespace USER_CLUSTER_NAME \
        --output wide | grep kube-etcd
    

    La salida muestra los pods de etcd y los nodos en los que se ejecutan los pods. Los nodos que se muestran en el resultado son nodos del clúster de administrador que actúan como planos de control de tu clúster de usuario:

    NAME              ...   NODE
    kube-etcd-0       ...   node-abc
    kube-etcd-1       ...   node-yyy
    kube-etcd-2       ...   node-zzz
    
  7. Anota los nombres de los pods y los nombres de los nodos del plano de control para usarlos en el manifiesto de los pods que crearás en el siguiente paso.

    Observa que cada pod de etcd se llama kube-etcd seguido de un número. Este número se denomina número de miembro del pod. Identifica el pod como un miembro concreto del clúster de etcd que contiene los datos del objeto de tu clúster de usuario. En esta guía se usa el marcador de posición MEMBER_NUMBER para hacer referencia al número de miembro del pod de etcd.

    También puedes observar que cada pod de tu clúster de etcd se ejecuta en su propio nodo.

  8. Crea un manifiesto de Pod que describa un Pod de utilidad que ejecutes temporalmente para restaurar los datos de etcd. Guarda el siguiente manifiesto de Pod en el directorio actual en un archivo llamado etcd-utility-MEMBER_NUMBER.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: etcd-utility-MEMBER_NUMBER
      namespace: USER_CLUSTER_NAME
    spec:
      containers:
      - command: ["/bin/sh"]
        args: ["-ec", "while :; do echo '.'; sleep 5 ; done"]
        image: gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION
        name: etcd-utility
        volumeMounts:
        - mountPath: /var/lib/etcd
          name: data
        - mountPath: /etcd.local.config/certificates
          name: etcd-certs
      nodeSelector:
        kubernetes.googleapis.com/cluster-name: USER_CLUSTER_NAME
        kubernetes.io/hostname: NODE_NAME
      tolerations:
      - effect: NoExecute
        key: node.kubernetes.io/not-ready
        operator: Exists
        tolerationSeconds: 300
      - effect: NoExecute
        key: node.kubernetes.io/unreachable
        operator: Exists
        tolerationSeconds: 300
      - effect: NoSchedule
        key: node.kubernetes.io/unschedulable
        operator: Exists
      volumes:
      - name: data
        persistentVolumeClaim:
          claimName: data-kube-etcd-MEMBER_NUMBER
      - name: etcd-certs
        secret:
          defaultMode: 420
          secretName: KUBE_ETCD_SECRET_NAME
    

    Haz los cambios siguientes:

    • NODE_NAME: el nodo en el que se ejecuta el pod kube-etcd-0.

    • USER_CLUSTER_NAME: el nombre del clúster de usuarios.

    • GKE_ON_PREM_VERSION: la versión del clúster en el que quieres realizar la restauración de etcd (por ejemplo, 1.31.100-gke.136).

    • KUBE_ETCD_SECRET_NAME: el nombre del secreto que usa etcd en el clúster de usuario, que empieza por kube-etcd-certs.

  9. Crea el pod de utilidad en tu clúster de administrador:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
    
  10. 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/*'
  11. Elimina el Pod de utilidad.

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

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  13. 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
          ...
     
  14. Restaura el PDB de etcd que se ha eliminado en el paso 1.

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