本文說明如何在 Google Distributed Cloud 的高可用性 (HA) 使用者叢集中,更換失敗的 etcd 副本。
本文提供的操作說明適用於使用 kubeception 的高可用性使用者叢集,也就是未啟用Controlplane V2 的使用者叢集。如果需要更換已啟用 Controlplane V2 的使用者叢集中的 etcd 副本,請與 Cloud Customer Care 團隊聯絡。
事前準備
確認管理員叢集運作正常。
確認使用者叢集中的其他兩個 etcd 成員運作正常。如果有多個 etcd 成員發生故障,請參閱「從 etcd 資料損毀或遺失中復原」。
取代失敗的 etcd 備用資源
備份 etcd PodDisruptionBudget (PDB) 的副本,以便稍後還原。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get pdb kube-etcd-pdb -o yaml > PATH_TO_PDB_FILE
其中:
ADMIN_CLUSTER_KUBECONFIG
是管理員叢集的 kubeconfig 檔案路徑。USER_CLUSTER_NAME
是包含失敗 etcd 副本的使用者叢集名稱。PATH_TO_PDB_FILE
是您要儲存 etcd PDB 檔案的路徑,例如/tmp/etcpdb.yaml
。
刪除 etcd PodDisruptionBudget (PDB)。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
執行下列指令,在文字編輯器中開啟 kube-etcd StatefulSet:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd
將
--initial-cluster-state
旗標的值變更為existing
。containers: - name: kube-etcd ... args: - --initial-cluster-state=existing ...
排空失敗的 etcd 備用資源節點。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG drain NODE_NAME --ignore-daemonsets --delete-local-data
其中
NODE_NAME
是失敗的 etcd 備用節點名稱。在其中一個運作中的 kube-etcd Pod 容器中建立新殼層。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it \ KUBE_ETCD_POD --container kube-etcd --namespace USER_CLUSTER_NAME \ -- bin/sh
其中
KUBE_ETCD_POD
是工作 kube-etcd Pod 的名稱。例如:kube-etcd-0
。在這個新殼層中,執行下列指令:
從 etcd 叢集中移除失敗的 etcd 副本節點。
首先,請列出 etcd 叢集的所有成員:
etcdctl member list -w table
輸出內容會顯示所有成員 ID。找出失敗副本的成員 ID。
接著,移除失敗的副本:
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
其中
MEMBER_ID
是失敗的 etcd 副本 Pod 的十六進位成員 ID。新增與失敗副本節點同名和同等網址的成員。
etcdctl member add MEMBER_NAME --peer-urls=https://MEMBER_NAME.kube-etcd:2380
其中
MEMBER_NAME
是失敗的 kube-etcd 副本節點 ID。例如kube-etcd-1
或kube-etcd2
。
請按照「部署公用程式 Pod」的步驟 1 到 3,在管理員叢集中建立公用程式 Pod。這個 Pod 用於存取使用者叢集中失敗 etcd 成員的 PersistentVolume (PV)。
從公用程式 Pod 內清除 etcd 資料目錄。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER -- /bin/bash -c 'rm -rf /var/lib/etcd/*'
刪除公用程式 Pod。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
取消限制失敗的節點。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
在文字編輯器中開啟 kube-etcd StatefulSet。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME edit statefulset kube-etcd
將
--initial-cluster-state
旗標的值變更為new
。containers: - name: kube-etcd ... args: - --initial-cluster-state=new ...
還原在步驟 1 中刪除的 etcd PDB。
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f /path/to/etcdpdb.yaml