Questo documento descrive come sostituire una replica etcd non riuscita in un cluster utente ad alta affidabilità (HA) per Google Distributed Cloud.
Le istruzioni riportate qui si applicano a un cluster utente HA che utilizza kubeception; ovvero un cluster utente in cui Controlplane V2 non è abilitato. Se devi sostituire una replica etcd in un cluster utente in cui è abilitato Controlplane V2, contatta l'assistenza clienti Google Cloud.
Prima di iniziare
Assicurati che il cluster di amministrazione funzioni correttamente.
Assicurati che gli altri due membri etcd nel cluster utente funzionino correttamente. Se si è verificato un errore in più di un membro etcd, consulta Recupero da etcd danneggiamento o perdita dei dati.
Sostituzione di una replica etcd non riuscita
Esegui il backup di una copia di PodDisruptionBudget (PDB) etcd in modo da poterla ripristinare in un secondo momento.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get pdb kube-etcd-pdb -o yaml > PATH_TO_PDB_FILE
Dove:
ADMIN_CLUSTER_KUBECONFIGè il percorso del file kubeconfig per il cluster di amministrazione.USER_CLUSTER_NAMEè il nome del cluster utente che contiene la replica etcd non riuscita.PATH_TO_PDB_FILEè il percorso in cui vuoi salvare il file PDB etcd, ad esempio/tmp/etcpdb.yaml.
Elimina PodDisruptionBudget (PDB) etcd.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
Esegui il comando seguente per aprire kube-etcd StatefulSet nell'editor di testo:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd
Modifica il valore del flag
--initial-cluster-stateinexisting.containers: - name: kube-etcd ... args: - --initial-cluster-state=existing ...Esegui il drain del nodo della replica etcd non riuscita.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG drain NODE_NAME --ignore-daemonsets --delete-local-data
Dove
NODE_NAMEè il nome del nodo della replica etcd non riuscita.Crea una nuova shell nel container di uno dei pod kube-etcd funzionanti.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it \ KUBE_ETCD_POD --container kube-etcd --namespace USER_CLUSTER_NAME \ -- bin/sh
Dove
KUBE_ETCD_PODè il nome del pod kube-etcd funzionante. Ad esempio,kube-etcd-0.Da questa nuova shell, esegui i seguenti comandi:
Rimuovi il nodo della replica etcd non riuscita dal cluster etcd.
Innanzitutto, elenca tutti i membri del cluster etcd:
etcdctl member list -w table
L'output mostra tutti gli ID dei membri. Determina l'ID membro della replica non riuscita.
Poi, rimuovi la replica non riuscita:
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
Dove
MEMBER_IDè l'ID membro esadecimale del pod della replica etcd non riuscita.Aggiungi un nuovo membro con lo stesso nome e lo stesso URL peer del nodo della replica non riuscita.
etcdctl member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380
Dove
MEMBER_NAMEè l'identificatore del nodo della replica kube-etcd non riuscita. Ad esempio,kube-etcd-1okube-etcd2.
Elenca i pod etcd che gestiscono l'archivio etcd per il cluster utente. Questi pod vengono eseguiti nel cluster di amministrazione:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --namespace USER_CLUSTER_NAME \ --output wide | grep kube-etcdL'output mostra i pod etcd e i nodi in cui vengono eseguiti i pod. I nodi mostrati nell'output sono nodi nel cluster di amministrazione che fungono da piani di controllo per il cluster utente:
NAME ... NODE kube-etcd-0 ... node-abc kube-etcd-1 ... node-yyy kube-etcd-2 ... node-zzz
Prendi nota dei nomi dei pod e dei nomi dei nodi del piano di controllo da utilizzare nel manifest del pod che crei nel passaggio successivo.
Tieni presente che ogni pod etcd è denominato
kube-etcdseguito da un numero. Questo numero è chiamato numero membro del pod. Identifica il pod come membro specifico del cluster etcd che contiene i dati degli oggetti per il cluster utente. Questa guida utilizza il segnaposto MEMBER_NUMBER per fare riferimento al numero membro del pod etcd.Tieni presente inoltre che ogni pod nel cluster etcd viene eseguito sul proprio nodo.
Crea un manifest del pod che descriva un pod di utilità che esegui temporaneamente per ripristinare i dati etcd. Salva il seguente manifest del pod nella directory corrente in un file denominato
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_NAMESostituisci quanto segue:
NODE_NAME: il nodo in cui è in esecuzione il podkube-etcd-0.USER_CLUSTER_NAME: il nome del cluster utente.GKE_ON_PREM_VERSION: la versione del cluster in cui vuoi eseguire il ripristino di etcd (ad esempio, 1.31.100-gke.136).KUBE_ETCD_SECRET_NAME: il nome del secret utilizzato da etcd nel cluster utente, a partire dakube-etcd-certs.
Crea il pod di utilità nel cluster di amministrazione:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
Libera spazio nella directory dei dati etcd dal pod di utilità.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- /bin/bash -c 'rm -rf /var/lib/etcd/*'
Elimina il pod di utilità.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
Rimuovi la protezione del nodo non riuscito.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
Apri kube-etcd StatefulSet nell'editor di testo.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd
Modifica il valore del flag
--initial-cluster-stateinnew.containers: - name: kube-etcd ... args: - --initial-cluster-state=new ...Ripristina il PDB etcd eliminato nel passaggio 1.
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml