Substituir uma réplica do etcd com falhas

Este documento descreve como substituir uma réplica do etcd com falhas num cluster de utilizador de alta disponibilidade (HA) para o Google Distributed Cloud.

As instruções apresentadas aqui aplicam-se a um cluster de utilizadores de HA que usa o kubeception, ou seja, um cluster de utilizadores que não tem o Controlplane V2 ativado. Se precisar de substituir uma réplica do etcd num cluster de utilizadores com o Controlplane V2 ativado, contacte o apoio ao cliente do Google Cloud.

Antes de começar

  • Certifique-se de que o cluster de administração está a funcionar corretamente.

  • Certifique-se de que os outros dois membros do etcd no cluster de utilizadores estão a funcionar corretamente. Se falharam mais do que um membro do etcd, consulte o artigo Recuperação de dados danificados ou perdidos do etcd.

Substituir uma réplica do etcd com falhas

  1. Faça uma cópia de segurança do PodDisruptionBudget (PDB) do etcd para que possa restaurá-lo mais tarde.

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

    Onde:

    • ADMIN_CLUSTER_KUBECONFIG é o caminho para o ficheiro kubeconfig do cluster de administrador.

    • USER_CLUSTER_NAME é o nome do cluster de utilizadores que contém a réplica do etcd com falhas.

    • PATH_TO_PDB_FILE é o caminho onde quer guardar o ficheiro PDB do etcd, por exemplo, /tmp/etcpdb.yaml.

  2. Elimine 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 kube-etcd no editor de texto:

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

    Altere o valor da flag --initial-cluster-state para existing.

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

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

    Onde NODE_NAME é o nome do nó de réplica do etcd com falha.

  5. Crie um novo shell no contentor de um dos pods kube-etcd em funcionamento.

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

    Onde KUBE_ETCD_POD é o nome do pod kube-etcd em funcionamento. Por exemplo, kube-etcd-0.

    Nesta nova shell, execute os seguintes comandos:

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

      Primeiro, liste todos os membros do cluster etcd:

      etcdctl member list -w table

      O resultado 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

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

    2. Adicione um novo membro com o mesmo nome e URL de pares que o nó de réplica com falhas.

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

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

  6. Liste os pods etcd que gerem o armazenamento etcd para o cluster de utilizadores. Estes 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 do etcd e os nós onde os pods são executados. Os nós apresentados na saída são nós no cluster de administrador que servem como planos de controlo para o cluster de utilizador:

    NAME              ...   NODE
    kube-etcd-0       ...   node-abc
    kube-etcd-1       ...   node-yyy
    kube-etcd-2       ...   node-zzz
    
  7. Tome nota dos nomes dos pods e dos nomes dos nós do plano de controlo para usar no manifesto do pod que criar no passo seguinte.

    Tenha em atenção que cada pod etcd tem o nome kube-etcd seguido de um número. Este número é denominado número de membro do Pod. Identifica o pod como um membro específico do cluster etcd que contém os dados do objeto para o seu cluster de utilizador. Este guia usa o marcador de posição MEMBER_NUMBER para se referir ao número de membros do pod etcd.

    Repare também que cada Pod no seu cluster etcd é executado no seu próprio nó.

  8. Crie um manifesto de agrupamento que descreva um agrupamento de utilitários que executa temporariamente para restaurar dados etcd. Guarde o seguinte manifesto do Pod no diretório atual num ficheiro denominado 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 o seguinte:

    • NODE_NAME: o nó onde o pod kube-etcd-0 está a ser executado.

    • USER_CLUSTER_NAME: o nome do cluster de utilizadores.

    • GKE_ON_PREM_VERSION: a versão do cluster onde quer fazer o restauro do etcd (por exemplo, 1.31.100-gke.136).

    • KUBE_ETCD_SECRET_NAME: o nome do segredo usado pelo etcd no cluster de utilizadores, começando por kube-etcd-certs.

  9. Crie o pod de utilidade no cluster de administrador:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
    
  10. Limpe o diretório de dados etcd a partir do pod de utilidade.

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- /bin/bash -c 'rm -rf /var/lib/etcd/*'
  11. Elimine o pod de utilidade.

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

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

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

    Altere o valor da flag --initial-cluster-state para new.

    containers:
        - name: kube-etcd
          ...
          args:
            - --initial-cluster-state=new
          ...
     
  14. Restaure o PDB do etcd que foi eliminado no passo 1.

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