取代失敗的 etcd 備用資源

本文說明如何在 Google Distributed Cloud 的高可用性 (HA) 使用者叢集中,更換失敗的 etcd 副本。

本文提供的操作說明適用於使用 kubeception 的高可用性使用者叢集,也就是未啟用Controlplane V2 的使用者叢集。如果需要更換已啟用 Controlplane V2 的使用者叢集中的 etcd 副本,請與 Cloud Customer Care 團隊聯絡

事前準備

  • 確認管理員叢集運作正常。

  • 確認使用者叢集中的其他兩個 etcd 成員運作正常。如果有多個 etcd 成員發生故障,請參閱「從 etcd 資料損毀或遺失中復原」。

取代失敗的 etcd 備用資源

  1. 備份 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

  2. 刪除 etcd PodDisruptionBudget (PDB)。

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME delete pdb kube-etcd-pdb
  3. 執行下列指令,在文字編輯器中開啟 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
          ...
     
  4. 排空失敗的 etcd 備用資源節點。

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

    其中 NODE_NAME 是失敗的 etcd 備用節點名稱。

  5. 在其中一個運作中的 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

    在這個新殼層中,執行下列指令:

    1. 從 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。

    2. 新增與失敗副本節點同名和同等網址的成員。

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

      其中 MEMBER_NAME 是失敗的 kube-etcd 副本節點 ID。例如 kube-etcd-1kube-etcd2

  6. 請按照「部署公用程式 Pod」的步驟 1 到 3,在管理員叢集中建立公用程式 Pod。這個 Pod 用於存取使用者叢集中失敗 etcd 成員的 PersistentVolume (PV)。

  7. 從公用程式 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/*'
  8. 刪除公用程式 Pod。

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG delete pod -n USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
  9. 取消限制失敗的節點。

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG uncordon NODE_NAME
  10. 在文字編輯器中開啟 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
          ...
     
  11. 還原在步驟 1 中刪除的 etcd PDB。

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