本文說明如何備份及還原使用 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
將殼層放入
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 是使用者叢集的名稱。
在殼層的
/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
在殼層中輸入
exit
,即可結束殼層。將
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
取得 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 都可以運作。將殼層放入
etcd
容器:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG exec -it \ POD_NAME -c etcd -n kube-system -- /bin/sh
其中:
- POD_NAME 是上一個步驟中取得的 etcd Pod 名稱。
在殼層中,建立名為
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
在殼層中輸入
exit
,即可結束殼層。將
snapshot.db
從etcd
容器複製到工作站主目錄:kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ cp POD_NAME:/tmp/snapshot.db ~/snapshot.db \ -c etcd -n kube-system
從 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。
找出 etcd 在使用者叢集中使用的 Secret 名稱:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME \ get secrets | grep kube-etcd-certs
將下列 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
部署公用程式 Pod:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ create -f etcd-utility.yaml --namespace USER_CLUSTER_NAME
將
snapshot.db
從目前目錄複製到公用程式 Pod 的根目錄:kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG cp snapshot.db \ USER_CLUSTER_NAME/etcd-utility-0:snapshot.db --container etcd-utility
將殼層放入
etcd-utility
容器:kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG exec it \ etcd-utility-0 --container etcd-utility --namespace USER_CLUSTER_NAME \ -- bin/sh
在根目錄的殼層中,執行下列指令來建立含有備份的新資料夾:
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
在殼層中刪除舊的 etcd 資料:
rm -r var/lib/etcd/*
在殼層中,將還原的 etcd 資料複製到永久位置:
cp -r default.etcd/* var/lib/etcd/
在殼層中輸入
exit
,即可結束殼層。刪除當機的 etcd Pod:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ delete pod kube-etcd-0 --namespace USER_CLUSTER_NAME
確認 etcd Pod 不再當機。
刪除公用程式 Pod:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \ delete pod etcd-utility-0 --namespace USER_CLUSTER_NAME
從目前目錄中移除
etcd-utility.yaml
:rm etcd-utility.yaml
Controlplane V2
您可以部署臨時 etcd 容器,以備份資料覆寫損毀的資料,一次還原 etcd
資料。
取得使用者控制層節點的殼層:
ssh -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP
在殼層中,停止 Kubernetes API 伺服器和 etcd 伺服器:
sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /etc/kubernetes/manifests/etcd.yaml ~
在殼層中輸入
exit
,即可結束殼層。執行
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
在殼層中,使用
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
在容器指令下方的 etcd 資訊清單檔案中新增
- --initial-cluster-state=new
標記。範例:
containers: - command: - etcd ... - --initial-cluster-state=new ...
在殼層中,啟動 kube-apiserver 和 etcd 伺服器:
sudo mv ~/etcd.yaml ~/kube-apiserver.yaml /etc/kubernetes/manifests/
在殼層中輸入
exit
,即可結束殼層。
從備份還原使用者叢集 (高可用性)
Kubeception
本節說明如何還原高可用性 (HA) 使用者叢集的 etcd 資料。
如果是高可用性使用者叢集,管理員叢集會有三個節點做為使用者叢集的控制層。每個節點都會執行 etcd Pod,在儲存空間磁碟區中維護 etcd 資料。
如果兩個 etcd Pod 運作正常,且相關儲存空間磁碟區的資料完好無損,則不需要使用備份檔案。這是因為您仍有 etcd 仲裁。
如果兩個 etcd 儲存空間磁碟區的資料損毀,您需要使用備份檔案還原 etcd 資料。
如要執行本節中的步驟,您必須已按照「備份使用者叢集」一文所述,建立 snapshot.db
檔案。
列出 etcd Pod 和節點
列出管理使用者叢集 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
請記下 Pod 名稱和控制平面節點名稱,以供稍後使用。
請注意,每個 etcd Pod 的名稱都是
kube-etcd
,並附加一個數字。 這個數字稱為 Pod 的「成員編號」。這個 Pod 是 etcd 叢集的特定成員,負責保存使用者叢集的物件資料。本指南使用預留位置 MEMBER_NUMBER 指稱 etcd Pod 成員編號。另請注意,etcd 叢集中的每個 Pod 都會在自己的節點上執行。
準備部署公用程式 Pod
儲存使用者叢集 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
停止 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
回想 etcd Pod 的容器映像檔名稱。
部署公用程式 Pod
回想 etcd Pod 的名稱,以及 Pod 執行的節點名稱。
將下列 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 資料。
在管理員叢集中建立公用程式 Pod:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG apply -f etcd-utility-MEMBER_NUMBER.yaml
將備份檔案
snapshot.db
複製到公用程式 Pod 的根目錄:kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG cp snapshot.db \ USER_CLUSTER_NAME/etcd-utility-MEMBER_NUMBER:snapshot.db
將殼層放入公用程式 Pod 中的
etcd-utility
容器:kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG exec -it --namespace USER_CLUSTER_NAME \ etcd-utility-MEMBER_NUMBER --container etcd-utility -- bin/sh
在根目錄的殼層中,使用
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
目錄中。在殼層中刪除舊的 etcd 資料:
rm -r var/lib/etcd/*
在殼層中,將還原的 etcd 資料複製到永久位置:
cp -r kube-etcd-MEMBER_NUMBER.etcd/* var/lib/etcd/
在殼層中,移除暫時性 etcd 目錄和備份檔案:
rm -R kube-etcd-MEMBER_NUMBER.etcd/ rm snapshot.db
在殼層中輸入
exit
,即可結束殼層。刪除公用程式 Pod:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG delete pod \ --namespace USER_CLUSTER_NAME etcd-utility-MEMBER_NUMBER
重新啟動元件
您已部署及刪除公用程式 Pod,現在需要重新啟動部分叢集元件。
重新啟動
kube-etcd
StatefulSet 中的 Pod:kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG rollout restart statefulset \ --namespace USER_CLUSTER_NAME kube-etcd
啟動使用者叢集的 Kubernetes API 伺服器:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG scale statefulset --replicas 3 \ --namespace USER_CLUSTER_NAME kube-apiserver
啟動使用者叢集的 etcd 維護部署作業:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONIFG scale deployment --replicas 1 \ --namespace=USER_CLUSTER_NAME gke-master-etcd-maintenance
還原 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 和節點
列出 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
請記下 Pod 名稱和控制平面節點名稱,以供稍後使用。
請注意,每個 etcd Pod 的名稱都是
etcd-xxx
,並附加節點名稱。這是因為在 Controlplane V2 中,etcd Pod 是以靜態 Pod 形式執行。
準備還原
執行
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:/opt/data/etc/kubernetes/pki/
取得使用者控制層節點的殼層:
ssh -i NODE_NAME.key ubuntu@NODE_EXTERNAL_IP
執行還原作業
回想 etcd Pod 的名稱,以及 Pod 執行的節點名稱。
在殼層中,停止所有使用者控制層節點上的 Kubernetes API 伺服器和 etcd 伺服器:
sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /etc/kubernetes/manifests/etcd.yaml ~
在 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
標記的各個節點NODE1
、NODE2
、NODE3
和NODE1_IP
、NODE2_IP
、NODE3_IP
。您也可以從 etcd 資訊清單取得這項資訊。
在容器指令下方的 etcd 資訊清單檔案中新增
- --initial-cluster-state=existing
標記。範例:
containers: - command: - etcd ... - --initial-cluster-state=existing ...
重新啟動元件
在殼層中,啟動所有使用者控制層節點中的
kube-apiserver
和etcd
伺服器:sudo mv ~/etcd.yaml ~/kube-apiserver.yaml /etc/kubernetes/manifests/
在殼層中輸入
exit
,即可結束殼層。確認
kube-apiserver
和etcd
正在所有使用者控制層節點上執行: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。
後續步驟
- 備份及還原管理員叢集
- 診斷叢集問題
- 瞭解 auger,這項開放原始碼工具可從 etcd 備份還原個別物件。