Como substituir uma réplica do etcd com falha

Nesta página, descrevemos como substituir uma réplica do etcd com falha em um cluster de usuário de alta disponibilidade (HA, na sigla em inglês) para clusters do Anthos no VMware (GKE On-Prem).

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/etcdpdb.yaml

    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.

  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.

      ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key --endpoints=https://127.0.0.1:2379 member remove MEMBER_ID

      Em que MEMBER_ID é o ID do nó de réplica do etcd com falha. Para conseguir o ID, execute o seguinte comando:

      ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key member list -w fields

      O comando anterior exibe todos os membros do cluster do etcd. A resposta será semelhante a:

      sh-5.0# ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcd.key member list -w fields
      
      "ClusterID" : 6963206042588294154
      "MemberID" : 4645269864592341793
      "Revision" : 0
      "RaftTerm" : 15
      "ID" : 2279696924967222455
      "Name" : "kube-etcd-2"
      "PeerURL" : "https://kube-etcd-2.kube-etcd:2380"
      "ClientURL" : "https://kube-etcd-2.kube-etcd:2379"
      "IsLearner" : false
      
      "ID" : 3728561467092418843
      "Name" : "kube-etcd-1"
      "PeerURL" : "https://kube-etcd-1.kube-etcd:2380"
      "ClientURL" : "https://kube-etcd-1.kube-etcd:2379"
      "IsLearner" : false
      
      "ID" : 4645269864592341793
      "Name" : "kube-etcd-0"
      "PeerURL" : "https://kube-etcd-0.kube-etcd:2380"
      "ClientURL" : "https://kube-etcd-0.kube-etcd:2379"
      "IsLearner" : false
      
      sh-5.0#
      

      O MemberID na saída anterior é o ID do membro do pod kube-etcd em funcionamento. Em seguida, copie o ID do nó de réplica do etcd com falha. No exemplo anterior, kube-etcd-0 tem umID de 4645269864592341793, kube-etcd-1 tem umID de 3728561467092418843 e kube-etcd-2 tem umID de 2279696924967222455.

      Depois de ter o membro ID, converta-o de decimal para hexadecimal, porque o comando member remove aceita um membro hexadecimal ID, enquanto member list retorna um decimal. Você pode usar printf para fazer a conversão. Neste exemplo para kube-etcd-2 será:

      printf '%x\n' 2279696924967222455
      

      A saída do comando anterior é o MEMBER_ID que você precisa usar para o comando member remove.

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

      ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key 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. Siga as etapas 1 a 3 de Como implantar os pods de utilitário para criar um pod de utilitário no cluster de administrador. Esse pod é usado para acessar o PersistentVolume (PV) do membro do etcd com falha no cluster do usuário.

  7. 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 -- bash -c 'rm -rf /var/lib/etcd/*'
  8. Exclua o pod utilitário.

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

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  10. 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
          ...
     
  11. Restaure o PDB do etcd que foi excluído na etapa 1.

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