備份及還原使用者叢集

本文說明如何備份及還原使用 Google Distributed Cloud (僅限軟體) for VMware 建立的使用者叢集 etcd 儲存區。本頁面也提供指令碼,可用於自動備份叢集的 etcd 存放區。

您可以建立備份檔案,以便在發生可能損毀叢集 etcd 資料的意外災害時進行復原。將備份檔案儲存在叢集外部的位置,且不依附於叢集運作。

限制

  • 這項程序不會備份應用程式專屬資料。

  • 這項程序不會備份 PersistentVolume。

  • 備份建立後排定的工作負載不會透過該備份還原。

  • 升級失敗後,您無法還原叢集。

  • 這項程序無法還原已刪除的叢集。

  • 如果叢集已啟用進階叢集,請勿使用這個程序。請改為參閱「使用 gkectl 備份及還原進階叢集」。

如要進一步瞭解相關限制,請參閱「基礎架構不相容」一文。

備份使用者叢集

使用者叢集備份是使用者叢集 etcd 儲存空間的快照。etcd 儲存區包含管理叢集狀態所需的所有 Kubernetes 物件和自訂物件。快照包含重建叢集元件和工作負載所需的資料。

備份步驟取決於使用者叢集是否已啟用 Controlplane V2。啟用 Controlplane V2 後,使用者叢集的控制層會在使用者叢集本身執行。如果未啟用 Controlplane V2,使用者叢集的控制層會在管理員叢集的一或多個節點上執行,這稱為 kubeception。

執行下列指令,判斷叢集是否已啟用 Controlplane V2:

kubectl get onpremuserclusters --kubeconfig USER_CLUSTER_KUBECONFIG \
  -n kube-system -o jsonpath='{.items[0].spec.enableControlplaneV2}' && echo

如果輸出結果為 true,請按照「Controlplane V2」步驟備份叢集。否則,請按照 Kubeception 步驟操作。

Kubeception

  1. 將殼層放入 kube-etcd 容器:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec -it \
     kube-etcd-0 -c kube-etcd -n USER_CLUSTER_NAME \
     -- /bin/sh
    

    其中:

    • ADMIN_CLUSTER_KUBECONFIG 是管理員叢集的 kubeconfig 檔案。
    • USER_CLUSTER_NAME 是使用者叢集的名稱。
  2. 在殼層的 /tmp 目錄中,建立名為 snapshot.db 的備份:

    ETCDCTL_API=3 etcdctl \
      --endpoints=https://127.0.0.1:2379 \
      --cacert=/etcd.local.config/certificates/etcdCA.crt \
      --cert=/etcd.local.config/certificates/etcd.crt \
      --key=/etcd.local.config/certificates/etcd.key \
      snapshot save /tmp/snapshot.db
    
  3. 在殼層中輸入 exit,即可結束殼層。

  4. kube-etcd 容器中的 /tmp/snapshot.db 複製到目前目錄:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG cp \
      USER_CLUSTER_NAME/kube-etcd-0:/tmp/snapshot.db \
      --container kube-etcd snapshot.db
    

Controlplane V2

  1. 取得 etcd Pod 的名稱:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get pods \
     -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}'
    

    其中:

    • USER_CLUSTER_KUBECONFIG 是使用者叢集的 kubeconfig 檔案。

    範例:

    NAME          READY   STATUS    RESTARTS   AGE
    etcd-uc1-cp1  1/1     Running   0          38m
    etcd-uc1-cp2  1/1     Running   0          37m
    etcd-uc1-cp3  1/1     Running   0          38m
    

    請注意,可能有多個 etcd Pod,例如高可用性叢集有 3 個。備份時,任何 etcd Pod 都可以運作。

  2. 將殼層放入 etcd 容器:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG exec -it \
     POD_NAME -c etcd -n kube-system -- /bin/sh
    
    

    其中:

    • POD_NAME 是上一個步驟中取得的 etcd Pod 名稱。
  3. 在殼層中,建立名為 snapshot.db 的備份檔案:

    ETCDCTL_API=3 etcdctl \
      --endpoints=https://127.0.0.1:2379 \
      --cacert=/etc/kubernetes/pki/etcd/ca.crt \
      --cert=/etc/kubernetes/pki/etcd/server.crt \
      --key=/etc/kubernetes/pki/etcd/server.key \
      snapshot save /tmp/snapshot.db
    
  4. 在殼層中輸入 exit,即可結束殼層。

  5. snapshot.dbetcd 容器複製到工作站主目錄:

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
     cp POD_NAME:/tmp/snapshot.db ~/snapshot.db \
     -c etcd -n kube-system
    
  6. 從 PKI 目錄複製密鑰:

    ssh -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP
    sudo chmod -R 0644 /etc/kubernetes/pki/*
    sudo chmod 0755 /etc/kubernetes/pki/etcd
    exit
    scp -ri NODE_NAME.key ubuntu@NODE_EXTERNAL_IP:/etc/kubernetes/pki ~/pki_NODE_NAME
    

    其中:

    • NODE_NAME 是包含控制層節點 SSH 金鑰的檔案
    • NODE_EXTERNAL_IP 是使用者控制層節點的 IP 位址,您要從該節點複製密鑰。

從備份還原使用者叢集 (非高可用性)

使用備份檔案還原使用者叢集的 etcd 存放區前,請先診斷叢集並解決現有問題。使用備份還原有問題的叢集,可能會重新建立或加劇問題。如需進一步協助還原叢集,請與 Google Cloud 支援團隊聯絡。

以下說明如何使用備份檔案還原使用者叢集。如果叢集的 etcd 資料已損毀,且使用者叢集的 etcd Pod 發生無限迴圈當機,請按照下列步驟操作。

Kubeception

您可以部署公用程式 Pod,將備份資料覆寫至損毀的資料,藉此還原 etcd 資料。管理員叢集的 API 伺服器必須正在執行,且管理員叢集的排程器必須能夠排定新的 Pod。

  1. 找出 etcd 在使用者叢集中使用的 Secret 名稱:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME \
       get secrets | grep kube-etcd-certs
    
  2. 將下列 Pod 資訊清單複製到名為 etcd-utility.yaml 的檔案。請替換下列項目:

    • NODE_NAME:執行 kube-etcd-0 Pod 的節點。

    • ADMIN_CLUSTER_KUBECONFIG:管理員叢集的 kubeconfig 檔案。

    • USER_CLUSTER_NAME:使用者叢集的名稱。

    • GKE_ON_PREM_VERSION:您要執行 etcd 還原作業的叢集版本 (例如 1.5.0-gke.0)。

    • KUBE_ETCD_SECRET_NAME:使用者叢集中 etcd 使用的 Secret 名稱,開頭為 kube-etcd-certs

    apiVersion: v1
    kind: Pod
    metadata:
     name: etcd-utility-0
     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-0
     - name: etcd-certs
       secret:
         defaultMode: 420
         secretName: KUBE_ETCD_SECRET_NAME
    
  3. 部署公用程式 Pod:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
      create -f etcd-utility.yaml --namespace USER_CLUSTER_NAME
    
  4. snapshot.db 從目前目錄複製到公用程式 Pod 的根目錄:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG cp snapshot.db \
      USER_CLUSTER_NAME/etcd-utility-0:snapshot.db --container etcd-utility
    
  5. 將殼層放入 etcd-utility 容器:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec it \
      etcd-utility-0 --container etcd-utility --namespace USER_CLUSTER_NAME \
      -- bin/sh
    
  6. 在根目錄的殼層中,執行下列指令來建立含有備份的新資料夾:

    ETCDCTL_API=3 etcdctl \
      --endpoints=https://127.0.0.1:2379 \
      --cacert=/etcd.local.config/certificates/etcdCA.crt \
      --cert=/etcd.local.config/certificates/etcd.crt \
      --key=/etcd.local.config/certificates/etcd.key \
      snapshot restore snapshot.db
    
  7. 在殼層中刪除舊的 etcd 資料:

    rm -r var/lib/etcd/*
    
  8. 在殼層中,將還原的 etcd 資料複製到永久位置:

    cp -r default.etcd/* var/lib/etcd/
    
  9. 在殼層中輸入 exit,即可結束殼層。

  10. 刪除當機的 etcd Pod:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
      delete pod kube-etcd-0 --namespace USER_CLUSTER_NAME
    
  11. 確認 etcd Pod 不再當機。

  12. 刪除公用程式 Pod:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
      delete pod etcd-utility-0 --namespace USER_CLUSTER_NAME
  13. 從目前目錄中移除 etcd-utility.yaml

    rm etcd-utility.yaml
    

Controlplane V2

您可以部署臨時 etcd 容器,以備份資料覆寫損毀的資料,一次還原 etcd 資料。

  1. 取得使用者控制層節點的殼層:

    ssh -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP
    
  2. 在殼層中,停止 Kubernetes API 伺服器和 etcd 伺服器:

    sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /etc/kubernetes/manifests/etcd.yaml ~
    
  3. 在殼層中輸入 exit,即可結束殼層。

  4. 執行 scp,將備份檔案 snapshot.db 和密鑰複製到使用者控制層節點:

    scp -i NODE_NAME.key ~/snapshot.db ubuntu@NODE_EXTERNAL_IP:/tmp/
    
    chmod a+rw pki/
    scp -ri NODE_NAME.key ~/pki_NODE_NAME ubuntu@NODE_EXTERNAL_IP:/etc/kubernetes/pki
    
  5. 在殼層中,使用 snapshot.db 還原 etcd 資料:

    sudo docker run --rm -t \
    -v /opt/data/var/lib:/var/lib \
    -v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd \
    -v /tmp:/tmp \
    --env ETCDCTL_API=3 \
    gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION etcdctl \
    --cacert=/etc/kubernetes/pki/etcd/ca.crt \
    --cert=/etc/kubernetes/pki/etcd/server.crt \
    --key=/etc/kubernetes/pki/etcd/server.key \
    --data-dir=/opt/data/var/lib/etcd \
    --name=NODE_NAME \
    --initial-advertise-peer-urls=https://NODE_IP_ADDRESS:2380 \
    --initial-cluster=NODE_NAME=https://NODE_IP_ADDRESS:2380 \
    snapshot restore /tmp/snapshot.db
    

    其中:

    • GKE_ON_PREM_VERSION 是做為映像檔標記使用的 GKE Enterprise 版本
    • NODE_NAME 是要執行還原作業的節點名稱
    • NODE_IP_ADDRESS 是指該節點的 IP
  6. 在容器指令下方的 etcd 資訊清單檔案中新增 - --initial-cluster-state=new 標記。

    範例:

    containers:
          - command:
            - etcd
            ...
            - --initial-cluster-state=new
            ...

  7. 在殼層中,啟動 kube-apiserver 和 etcd 伺服器:

    sudo mv ~/etcd.yaml ~/kube-apiserver.yaml /etc/kubernetes/manifests/
    
  8. 在殼層中輸入 exit,即可結束殼層。

從備份還原使用者叢集 (高可用性)

Kubeception

本節說明如何還原高可用性 (HA) 使用者叢集的 etcd 資料。

如果是高可用性使用者叢集,管理員叢集會有三個節點做為使用者叢集的控制層。每個節點都會執行 etcd Pod,在儲存空間磁碟區中維護 etcd 資料。

如果兩個 etcd Pod 運作正常,且相關儲存空間磁碟區的資料完好無損,則不需要使用備份檔案。這是因為您仍有 etcd 仲裁。

如果兩個 etcd 儲存空間磁碟區的資料損毀,您需要使用備份檔案還原 etcd 資料。

如要執行本節中的步驟,您必須已按照「備份使用者叢集」一文所述,建立 snapshot.db 檔案。

列出 etcd Pod 和節點

  1. 列出管理使用者叢集 etcd 儲存空間的 etcd Pod。這些 Pod 會在管理叢集中執行:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --namespace USER_CLUSTER_NAME \
    --output wide | grep kube-etcd
    

    輸出內容會顯示 etcd Pod,以及執行 Pod 的節點。輸出內容中顯示的節點是管理員叢集中的節點,會做為使用者叢集的控制層:

    NAME              ...   NODE
    kube-etcd-0       ...   xxx
    kube-etcd-1       ...   yyy
    kube-etcd-2       ...   zzz
    
  2. 請記下 Pod 名稱和控制平面節點名稱,以供稍後使用。

    請注意,每個 etcd Pod 的名稱都是 kube-etcd,並附加一個數字。 這個數字稱為 Pod 的「成員編號」。這個 Pod 是 etcd 叢集的特定成員,負責保存使用者叢集的物件資料。本指南使用預留位置 MEMBER_NUMBER 指稱 etcd Pod 成員編號。

    另請注意,etcd 叢集中的每個 Pod 都會在自己的節點上執行。

準備部署公用程式 Pod

  1. 儲存使用者叢集 Kubernetes API 伺服器的 PodDisruptionBudget (PDB) 資訊清單。然後刪除 PDB。

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG get pdb --namespace USER_CLUSTER_NAME \
    kube-apiserver-pdb --output yaml > kube-apiserver-pdb.yaml
    
    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG delete pdb --namespace USER_CLUSTER_NAME \
    kube-apiserver-pdb
    
  2. 停止 Kubernetes API 伺服器和 etcd 維護部署作業。這可確保還原期間沒有任何元件會使用 etcd:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG --namespace USER_CLUSTER_NAME \
    scale --replicas 0 statefulset kube-apiserver
    
    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG --namespace USER_CLUSTER_NAME \
    scale --replicas 0 deployment gke-master-etcd-maintenance
    
  3. 回想 etcd Pod 的容器映像檔名稱。

部署公用程式 Pod

  1. 回想 etcd Pod 的名稱,以及 Pod 執行的節點名稱。

  2. 將下列 Pod 資訊清單儲存至目前目錄,並命名為 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

上述資訊清單說明您暫時執行的公用程式 Pod,用於還原 etcd 資料。

  1. 在管理員叢集中建立公用程式 Pod:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
    
  2. 將備份檔案 snapshot.db 複製到公用程式 Pod 的根目錄:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG cp snapshot.db \
    USER_CLUSTER_NAME/etcd-utility-MEMBER_NUMBER:snapshot.db
    
  3. 將殼層放入公用程式 Pod 中的 etcd-utility 容器:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG exec -it --namespace USER_CLUSTER_NAME \
    etcd-utility-MEMBER_NUMBER --container etcd-utility -- bin/sh
    
  4. 在根目錄的殼層中,使用 snapshot.db 還原 etcd 資料:

    ETCDCTL_API=3 etcdctl \
    --endpoints=https://127.0.0.1:2379 \
    --cacert=/etcd.local.config/certificates/etcdCA.crt \
    --cert=/etcd.local.config/certificates/etcd.crt \
    --key=/etcd.local.config/certificates/etcd.key \
    --name=kube-etcd-MEMBER_NUMBER \
    --initial-cluster=kube-etcd-0=https://kube-etcd-0.kube-etcd:2380,kube-etcd-1=https://kube-etcd-1.kube-etcd:2380,kube-etcd-2=https://kube-etcd-2.kube-etcd:2380 \
    --initial-cluster-token=etcd-cluster-1 \
    --initial-advertise-peer-urls=https://kube-etcd-MEMBER_NUMBER.kube-etcd:2380 \
    snapshot restore snapshot.db
    

    上述指令會將 etcd 資料儲存在 /kube-etcd-MEMBER_NUMBER.etcd 目錄中。

  5. 在殼層中刪除舊的 etcd 資料:

    rm -r var/lib/etcd/*
    
  6. 在殼層中,將還原的 etcd 資料複製到永久位置:

    cp -r kube-etcd-MEMBER_NUMBER.etcd/* var/lib/etcd/
    
  7. 在殼層中,移除暫時性 etcd 目錄和備份檔案:

    rm -R kube-etcd-MEMBER_NUMBER.etcd/
    rm snapshot.db
    
  8. 在殼層中輸入 exit,即可結束殼層。

  9. 刪除公用程式 Pod:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG delete pod \
    --namespace USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
    

重新啟動元件

您已部署及刪除公用程式 Pod,現在需要重新啟動部分叢集元件。

  1. 重新啟動 kube-etcd StatefulSet 中的 Pod:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG rollout restart statefulset \
    --namespace USER_CLUSTER_NAME kube-etcd
    
  2. 啟動使用者叢集的 Kubernetes API 伺服器:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG scale statefulset --replicas 3 \
    --namespace USER_CLUSTER_NAME kube-apiserver
    
  3. 啟動使用者叢集的 etcd 維護部署作業:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG scale deployment --replicas 1 \
    --namespace=USER_CLUSTER_NAME  gke-master-etcd-maintenance
    
  4. 還原 Kubernetes API 伺服器的 PDB:

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG apply -f kube-apiserver-pdb.yaml
    

Controlplane V2

本節說明如何還原高可用性 (HA) 使用者叢集的 etcd 資料。

如果是高可用性使用者叢集,使用者叢集中會有三個節點做為使用者叢集的控制層。每個節點都會執行 etcd Pod,在儲存空間磁碟區中維護 etcd 資料。

如果兩個 etcd Pod 運作正常,且相關儲存空間磁碟區的資料完好無損,則不需要使用備份檔案。這是因為您仍有 etcd 仲裁。

如果兩個 etcd 儲存空間磁碟區的資料損毀,您需要使用備份檔案還原 etcd 資料。

如要執行本節中的步驟,您必須先按照「備份使用者叢集」一文所述,建立 snapshot.db 檔案。

列出 etcd Pod 和節點

  1. 列出 etcd Pod 和對應的節點:

    kubectl get pod --kubeconfig USER_CLUSTER_KUBECONFIG \
     -n kube-system -l component=etcd,tier=control-plane -o wide
    

    輸出內容會顯示 etcd Pod,以及執行 Pod 的節點。輸出內容中顯示的節點是管理員叢集中的節點,會做為使用者叢集的控制層:

    NAME           ...   NODE
    etcd-xxx       ...   xxx
    etcd-yyy       ...   yyy
    etcd-zzz       ...   zzz
    
  2. 請記下 Pod 名稱和控制平面節點名稱,以供稍後使用。

    請注意,每個 etcd Pod 的名稱都是 etcd-xxx,並附加節點名稱。這是因為在 Controlplane V2 中,etcd Pod 是以靜態 Pod 形式執行。

準備還原

  1. 執行 scp,將備份檔案 snapshot.db 複製到所有使用者控制層節點:

    scp -i NODE_NAME.key ~/snapshot.db ubuntu@NODE_EXTERNAL_IP:/tmp/
    
  2. 將密鑰複製到對應的使用者控制層節點:

    chmod a+rw ~/pki_*
    scp -ri NODE_NAME.key ~/pki_NODE_NAME/* ubuntu@NODE_EXTERNAL_IP:/opt/data/etc/kubernetes/pki/
    
  3. 取得使用者控制層節點的殼層:

    ssh -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP
    

執行還原作業

  1. 回想 etcd Pod 的名稱,以及 Pod 執行的節點名稱。

  2. 在殼層中,停止所有使用者控制層節點上的 Kubernetes API 伺服器和 etcd 伺服器:

    sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /etc/kubernetes/manifests/etcd.yaml ~
    
  3. 在 Shell 中,使用 snapshot.db 還原所有使用者控制平面節點上的 etcd 資料:

    sudo docker run --rm -t \
    -v /opt/data/var/lib:/var/lib \
    -v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd \
    -v /tmp:/tmp \
    --env ETCDCTL_API=3 \
    gcr.io/gke-on-prem-release/etcd-util:GKE_ON_PREM_VERSION etcdctl \
    --cacert=/etc/kubernetes/pki/etcd/ca.crt \
    --cert=/etc/kubernetes/pki/etcd/server.crt \
    --key=/etc/kubernetes/pki/etcd/server.key \
    --data-dir=/opt/data/var/lib/etcd \
    --name=NODE_NAME \
    --initial-advertise-peer-urls=https://NODE_IP_ADDRESS:2380 \
    --initial-cluster=NODE1=https://NODE1_IP:2380,NODE2=https://NODE2_IP:2380,NODE3=https://NODE3_IP:2380 \
    snapshot restore /tmp/snapshot.db
    

    其中:

    • GKE_ON_PREM_VERSION 是做為映像檔標記使用的 GKE Enterprise 版本
    • NODE_NAME 是要執行還原作業的節點名稱
    • NODE_IP_ADDRESS 是指該節點的 IP
    • 填入 --initial-cluster 標記的各個節點 NODE1NODE2NODE3NODE1_IPNODE2_IPNODE3_IP。您也可以從 etcd 資訊清單取得這項資訊。
  4. 在容器指令下方的 etcd 資訊清單檔案中新增 - --initial-cluster-state=existing 標記。

    範例:

    containers:
          - command:
            - etcd
            ...
            - --initial-cluster-state=existing
            ...

重新啟動元件

  1. 在殼層中,啟動所有使用者控制層節點中的 kube-apiserveretcd 伺服器:

    sudo mv ~/etcd.yaml ~/kube-apiserver.yaml /etc/kubernetes/manifests/
    
  2. 在殼層中輸入 exit,即可結束殼層。

  3. 確認 kube-apiserveretcd 正在所有使用者控制層節點上執行:

    kubectl get pod --kubeconfig USER_CLUSTER_KUBECONFIG \
    -n kube-system -l tier=control-plane
    

自動叢集備份

您可以參考這裡的指令碼範例,瞭解如何自動備份叢集。請注意,系統不支援下列指令碼,僅供您參考,以便編寫更完善、更強大且更完整的指令碼。執行指令碼前,請先填入指令碼開頭的五個變數值:

Kubeception

  • BACKUP_DIR 設為您要儲存管理員和使用者叢集備份的路徑。這個路徑不應存在。
  • ADMIN_CLUSTER_KUBECONFIG 設為管理員叢集 kubeconfig 檔案的路徑
  • USER_CLUSTER_NAMESPACE 設為使用者叢集名稱。使用者叢集名稱是管理員叢集中的命名空間。
  • EXTERNAL_IP 設為您為管理員控制層服務保留的 VIP。
  • SSH_PRIVATE_KEY 設為安全殼層金鑰的路徑。
  • 如果您使用私人網路,請將 JUMP_IP 設為網路的跳躍伺服器 IP 位址。
#!/usr/bin/env bash

# Automates manual steps for taking backups of user and admin clusters.
# Fill in the variables below before running the script.

BACKUP_DIR=""                       # path to store user and admin cluster backups
ADMIN_CLUSTER_KUBECONFIG=""         # path to admin cluster kubeconfig
USER_CLUSTER_NAMESPACE=""           # user cluster namespace
EXTERNAL_IP=""                      # admin control plane node external ip - follow steps in documentation
SSH_PRIVATE_KEY=""                  # path to vsphere_tmp ssh private key - follow steps in documentation
JUMP_IP=""                          # network jump server IP - leave empty string if not using private network.

mkdir -p $BACKUP_DIR
mkdir $BACKUP_DIR/pki

# USER CLUSTER BACKUP

# Snapshot user cluster etcd
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n ${USER_CLUSTER_NAMESPACE} kube-etcd-0 -c kube-etcd -- /bin/sh -ec "export ETCDCTL_API=3; etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etcd.local.config/certificates/etcdCA.crt --cert=/etcd.local.config/certificates/etcd.crt --key=/etcd.local.config/certificates/etcd.key snapshot save ${USER_CLUSTER_NAMESPACE}_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp ${USER_CLUSTER_NAMESPACE}/kube-etcd-0:${USER_CLUSTER_NAMESPACE}_snapshot.db $BACKUP_DIR/user-cluster_${USER_CLUSTER_NAMESPACE}_snapshot.db 

# ADMIN CLUSTER BACKUP

# Set up ssh options
SSH_OPTS=(-oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY})
if [ "${JUMP_IP}" != "" ]; then
  SSH_OPTS+=(-oProxyCommand="ssh -oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY} -W %h:%p ubuntu@${JUMP_IP}")
fi

# Copy admin certs
ssh "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP} 'sudo chmod -R +rw /etc/kubernetes/pki/*'
scp -r "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP}:/etc/kubernetes/pki/* ${BACKUP_DIR}/pki/

# Snapshot admin cluster etcd
admin_etcd=$(kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} get pods -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}')
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n kube-system ${admin_etcd} -- /bin/sh -ec "export ETCDCTL_API=3; etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key snapshot save admin_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp -n kube-system ${admin_etcd}:admin_snapshot.db $BACKUP_DIR/admin-cluster_snapshot.db

Controlplane V2

  • BACKUP_DIR 設為您要儲存管理員和使用者叢集備份的路徑。這個路徑不應存在。
  • ADMIN_CLUSTER_KUBECONFIG 設為管理員叢集 kubeconfig 檔案的路徑
  • USER_CLUSTER_KUBECONFIG 設為使用者叢集 kubeconfig 的路徑。
  • EXTERNAL_IP 設為您為管理員控制層服務保留的 VIP。
  • SSH_PRIVATE_KEY 設為安全殼層金鑰的路徑。
  • 如果您使用私人網路,請將 JUMP_IP 設為網路的跳躍伺服器 IP 位址。
#!/usr/bin/env bash

# Automates manual steps for taking backups of user and admin clusters.
# Fill in the variables below before running the script.

BACKUP_DIR=""                       # path to store user and admin cluster backups
ADMIN_CLUSTER_KUBECONFIG=""         # path to admin cluster kubeconfig
USER_CLUSTER_KUBECONFIG=""          # path to user cluster kubeconfig
EXTERNAL_IP=""                      # admin control plane node external ip - follow steps in documentation
SSH_PRIVATE_KEY=""                  # path to ssh private key - follow steps in documentation
JUMP_IP=""                          # network jump server IP - leave empty string if not using private network

mkdir -p $BACKUP_DIR
mkdir $BACKUP_DIR/pki

# USER CLUSTER BACKUP
user_etcd=$(kubectl --kubeconfig=${USER_CLUSTER_KUBECONFIG} get pods -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[0].metadata.name}{"\n"}')
kubectl --kubeconfig=${USER_CLUSTER_KUBECONFIG} exec -it -n kube-system ${user_etcd} -c etcd -- /bin/sh -ec "export ETCDCTL_API=3; etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot save /tmp/${user_etcd}_snapshot.db"
kubectl --kubeconfig=${USER_CLUSTER_KUBECONFIG} cp kube-system/${user_etcd}:/tmp/${user_etcd}_snapshot.db $BACKUP_DIR/${user_etcd}_snapshot.db

# ADMIN CLUSTER BACKUP

# Set up ssh options
SSH_OPTS=(-oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY})
if [ "${JUMP_IP}" != "" ]; then
  SSH_OPTS+=(-oProxyCommand="ssh -oStrictHostKeyChecking=no -i ${SSH_PRIVATE_KEY} -W %h:%p ubuntu@${JUMP_IP}")
fi

# Copy admin certs
ssh "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP} 'sudo chmod -R +rw /etc/kubernetes/pki/*'
scp -r "${SSH_OPTS[@]}" ubuntu@${EXTERNAL_IP}:/etc/kubernetes/pki/* ${BACKUP_DIR}/pki/

# Snapshot admin cluster etcd
admin_etcd=$(kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} get pods -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}')
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} exec -it -n kube-system ${admin_etcd} -- /bin/sh -ec "export ETCDCTL_API=3; etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key snapshot save /tmp/${admin_etcd}_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp -n kube-system ${admin_etcd}:/tmp/${admin_etcd}_snapshot.db $BACKUP_DIR/${admin_etcd}_snapshot.db

確認還原作業

如要確認叢集是否已成功還原,請執行 gkectl diagnose cluster

後續步驟