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
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.
Elimine o PodDisruptionBudget (PDB) do etcd.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
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-stateparaexisting.containers: - name: kube-etcd ... args: - --initial-cluster-state=existing ...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.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:
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.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-1oukube-etcd2.
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-etcdA 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
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-etcdseguido 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ó.
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_NAMESubstitua o seguinte:
NODE_NAME: o nó onde o podkube-etcd-0está 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 porkube-etcd-certs.
Crie o pod de utilidade no cluster de administrador:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
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/*'
Elimine o pod de utilidade.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
Remova a vedação do nó com falhas.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
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-stateparanew.containers: - name: kube-etcd ... args: - --initial-cluster-state=new ...Restaure o PDB do etcd que foi eliminado no passo 1.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml