Como substituir uma réplica do etcd com falha

Este documento descreve como substituir uma réplica com falha do etcd em cluster de alta disponibilidade (HA) no Google Distributed Cloud.

As instruções fornecidas aqui se aplicam a um cluster de usuário de alta disponibilidade que usa kubeception ou seja, um cluster de usuário que não tem Plano de controle V2 ativado. Se você precisar substituir uma réplica do etcd em um cluster de usuário que tenha o Controlplane V2 ativado, entre em contato com o Cloud Customer Care.

Antes de começar

  • Verifique se o cluster de administrador está funcionando corretamente.

  • Verifique se os outros dois membros do etcd no cluster de usuário estão funcionando corretamente. Se mais de um membro do etcd tiver falhado, consulte Recuperação da corrupção ou perda de dados do etcd.

Como substituir uma réplica do etcd com falha

  1. Faça um backup do PodDisruptionBudget (PDB) do etcd para poder restaurá-lo posteriormente.

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

    Em que:

    • ADMIN_CLUSTER_KUBECONFIG é o caminho para o arquivo kubeconfig do cluster do administrador.

    • USER_CLUSTER_NAME é o nome do cluster de usuário que contém a réplica do etcd com falha.

    • PATH_TO_PDB_FILE é o caminho onde você quer salvar o arquivo PDB etcd. Por exemplo, /tmp/etcpdb.yaml.

  2. Exclua o PodDisruptionBudget (PDB) do etcd.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
  3. Execute o seguinte comando para abrir o StatefulSet do kube-etcd no editor de texto:

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

    Altere o valor da sinalização --initial-cluster-state para existing.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=existing
          ...
     
  4. Drene o nó de réplica do etcd com falha.

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

    Em que NODE_NAME é o nome do nó da réplica do etcd com falha.

  5. Crie um novo shell no contêiner de um dos pods do kube-etcd ativo.

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

    Em que KUBE_ETCD_POD é o nome do pod de kube-etcd ativo. Por exemplo, kube-etcd-0.

    Nesse novo shell, execute os seguintes comandos:

    1. Remova o nó da réplica do etcd com falha do cluster do etcd.

      Primeiro, liste todos os membros do cluster do etcd:

      etcdctl member list -w table

      A saída mostra todos os IDs de membros. Determine o ID do membro da réplica com falha.

      Em seguida, remova a réplica com falha:

      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

      Em que MEMBER_ID é o ID de membro hexadecimal do pod de réplica do etcd com falha.

    2. Adicione um novo membro com o mesmo nome e URL de peer do nó da réplica com falha.

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

      Em que MEMBER_NAME é o identificador do nó de réplica kube-etcd com falha. Por exemplo, kube-etcd-1 ou kube-etcd2.

  6. Liste os pods do etcd que gerenciam o armazenamento etcd para seu cluster de usuários. Esses pods são executados no cluster de administrador:

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

    A saída mostra os pods etcd e os nós em que eles são executados. Os nós mostrados na saída são do cluster de administrador, e servem como planos de controle para o cluster de usuário:

    NAME              ...   NODE
    kube-etcd-0       ...   node-abc
    kube-etcd-1       ...   node-yyy
    kube-etcd-2       ...   node-zzz
    
  7. Anote os nomes dos pods e dos nós do plano de controle para usar no manifesto do pod que você vai criar na próxima etapa.

    Observe que cada pod do etcd é chamado de kube-etcd anexado com um número. Esse número é chamado de número de membro do pod. Ele identifica o pod como um membro específico do cluster do etcd com os dados de objeto para o cluster de usuário. Este guia usa o marcador MEMBER_NUMBER para se referir ao número de membro do pod do etcd.

    Observe também que cada pod no cluster do etcd é executado no próprio nó.

  8. Crie um manifesto de pod que descreva um pod utilitário que você executa temporariamente para restaurar dados do etcd. Salve o seguinte manifesto de pod no diretório atual em um arquivo chamado 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
    

    Substitua:

    • NODE_NAME: o nó em que o pod kube-etcd-0 está em execução.

    • USER_CLUSTER_NAME: o nome do cluster do usuário.

    • GKE_ON_PREM_VERSION: a versão do cluster em que você quer executar a restauração do etcd (por exemplo, 1.31.100-gke.136).

    • KUBE_ETCD_SECRET_NAME: o nome do secret usado pelo etcd no cluster do usuário, começando com kube-etcd-certs.

  9. Crie o pod utilitário no seu cluster de administrador:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
    
  10. Limpe o diretório de dados do etcd no pod de utilitário.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- /bin/bash -c 'rm -rf /var/lib/etcd/*'
  11. Exclua o pod utilitário.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
  12. Remova a restrição do nó com falha.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  13. Abra o kube-etcd StatefulSet no editor de texto.

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

    Altere o valor da sinalização --initial-cluster-state para new.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=new
          ...
     
  14. Restaure o PDB do etcd que foi excluído na etapa 1.

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