本文說明如何備份及還原使用 Google Distributed Cloud (僅限軟體) for VMware 建立的管理員叢集 etcd 儲存區。本文也提供指令碼,可用於自動備份叢集的 etcd 存放區。您也可以使用 gkectl 指令列工具備份及還原管理員叢集。
您可以建立備份檔案,以便在發生可能損毀叢集 etcd 資料的意外災害時進行復原。將備份檔案儲存在叢集外部的位置,且該位置不依附於叢集運作。
限制
本文所述的備份和還原程序有下列限制:
- 這項程序不會備份應用程式專屬資料。 
- 這項程序不會備份 PersistentVolume。 
- 備份建立後排定的工作負載不會透過該備份還原。 
- 升級失敗後,您無法還原叢集。 
- 這項程序無法還原已刪除的叢集。 
- 如果叢集已啟用進階叢集,請勿使用這個程序。請改為參閱「使用 gkectl 備份及還原進階叢集」。 
如要進一步瞭解相關限制,請參閱「基礎架構不相容」一文。
備份管理員叢集
管理員叢集備份包含下列項目:
- 管理員叢集 etcd 的快照。
- 管理員控制層的密鑰,用於向管理員和使用者叢集進行驗證。
建立管理員叢集備份前,請完成下列步驟:
- 找出管理員叢集的外部 IP 位址,用於透過 SSH 連線至管理員叢集控制層: - kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get nodes -n kube-system -o wide | grep master - 其中 [ADMIN_CLUSTER_KUBECONFIG] 是管理員叢集的 kubeconfig 檔案。 
- 從管理員叢集的私密金鑰建立名為 - vsphere_tmp的 SSH 金鑰。- 您可以從管理員叢集的密鑰中找到私密金鑰: - kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get secrets sshkeys -n kube-system -o yaml - 在指令輸出中,您可以在 - vsphere_tmp欄位中找到私密金鑰。- 將私密金鑰複製到 - vsphere_tmp:- echo "[PRIVATE_KEY]" | base64 -d > vsphere_tmp; chmod 600 vsphere_tmp 
- 確認您可以使用這個私密金鑰進入管理控制平面: - ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP] 
- 結束容器: - exit 
備份管理員叢集的 etcd 存放區
如要備份管理員叢集的 etcd 存放區,請按照下列步驟操作:
- 取得 etcd Pod 的名稱: - kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] get pods \ -n kube-system -l component=etcd,tier=control-plane -ojsonpath='{$.items[*].metadata.name}{"\n"}'
- 進入 Pod 的 kube-etcd 容器殼層: - kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] exec -it \ -n kube-system [ADMIN_ETCD_POD] -- bin/sh- 其中 [ADMIN_ETCD_POD] 是 etcd Pod 的名稱。 
- 在 Shell 中,使用 - etcdctl在本機目錄中建立名為- 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/healthcheck-client.crt \ --key=/etc/kubernetes/pki/etcd/healthcheck-client.key snapshot save /tmp/snapshot.db
- 結束容器: - exit 
- 使用 - kubectl cp將備份檔複製到 kube-etcd 容器外:- kubectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] cp \ kube-system/[ADMIN_ETCD_POD]:tmp/snapshot.db [RELATIVE_DIRECTORY] - 其中 [RELATIVE_DIRECTORY] 是您要儲存備份的路徑。 
備份管理員叢集的 Secret
如要備份管理員控制層的密鑰,請執行下列操作:
- 使用 SSH 連線至管理員控制平面節點: - ssh -i vsphere_tmp ubuntu@EXTERNAL_IP - 將 - EXTERNAL_IP換成您先前記下的管理控制平面外部 IP 位址。
- 建議您執行以下非強制步驟:建立本機備份目錄。 - 您需要變更備份 Secret 的權限,才能將其從節點複製出來。 - mkdir backup 
- 將密鑰複製到本機備份目錄: - sudo cp -r /etc/kubernetes/pki/* backup/ 
- 變更備份密鑰的權限: - sudo chmod -R a+rX backup/ 
- 退出管理員控制層節點: - exit 
- 執行 - scp,將備份資料夾複製到管理控制平面節點外:- sudo scp -r -i vsphere_tmp ubuntu@EXTERNAL_IP:backup/ RELATIVE_DIRECTORY - 將 - RELATIVE_DIRECTORY替換為您要儲存備份的路徑。
還原管理員叢集
一文。以下程序會重建備份的管理員叢集,以及建立 etcd 快照時管理的所有使用者控制層。
- 執行 - scp,將- snapshot.db複製到管理控制層:- sudo scp -i vsphere_tmp snapshot.db ubuntu@[EXTERNAL_IP]: - 其中 [EXTERNAL_IP] 是您先前收集的管理控制層外部 IP 位址。 
- 進入管理控制層的 Shell: - sudo ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP] 
- 將 - snapshot.db/複製到- /mnt- sudo cp snapshot.db /mnt/ 
- 建立臨時目錄,例如 - backup:- mkdir backup 
- 退出管理控制層: - exit 
- 將憑證複製到 - backup/:- sudo scp -r -i vsphere_tmp [BACKUP_CERT_FILE] ubuntu@[EXTERNAL_IP]:backup/ 
- 進入管理員控制層節點的 Shell: - ssh -i vsphere_tmp ubuntu@[EXTERNAL_IP] - 其中 [EXTERNAL_IP] 是您先前收集的管理控制層外部 IP 位址。 
- 停止 - kube-etcd和- kube-apiserver。- sudo mv /etc/kubernetes/manifests/etcd.yaml /tmp/etcd.yaml - sudo mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/kube-apiserver.yaml 
- 將備份的密鑰複製到 - /etc/kubernetes/pki/:- sudo cp -r backup/* /etc/kubernetes/pki/ 
- 執行 - etcdctl restore:- ETCDCTL_API=3 sudo etcdctl snapshot restore /backup/snapshot.db sudo rm -r /var/lib/etcd/* sudo mv /default.etcd/member/ /var/lib/etcd/ 
- 重新啟動 - kube-etcd和- kube-apiserver。- sudo mv /tmp/etcd.yaml /etc/kubernetes/manifests/etcd.yaml - sudo mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/kube-apiserver.yaml 
- 確認 - kube-etcd和- kube-apiserver已啟動。- sudo crictl ps -a 
- 將 - /etc/kubernetes/admin.conf複製到- .kube資料夾,以便從管理員工作站存取:- mkdir -p [HOME]/.kube - sudo cp -i /etc/kubernetes/admin.conf [HOME]/.kube/config - sudo chown $(id -u):$(id -g) $HOME/.kube/config 
- 退出管理控制層: - exit 
- 將新產生的 kubeconfig 檔案從管理員節點複製出來: - sudo scp -i vsphere_tmp ubuntu@[EXTERNAL_IP]:[HOME]/.kube/config kubeconfig - sudo chown $(id -u):$(id -g) kubeconfig - 其中: - [EXTERNAL_IP] 是管理員控制層的外部 IP 位址。
- [HOME] 是管理員節點上的主目錄。
 - 現在您可以使用這個新的 kubeconfig 檔案存取還原的叢集。 
排解管理員叢集還原問題
如果在還原管理員叢集時發生問題,請務必與 Google 支援團隊聯絡,解決管理員叢集的問題。
同時建議您嘗試透過下列方式進一步排解問題。
- 找出 etcd 容器 ID - sudo crictl ps -a | grep [ADMIN_ETCD_POD] - 其中 [ADMIN_ETCD_POD] 是 etcd Pod 的名稱。 
- 檢查 etc 容器的記錄 - sudo crictl logs [ETCD_CONTAINER_ID] - 其中 [ETCD_CONTAINER_ID] 是 etcd 容器的 ID。 
- 尋找下列權限遭拒的記錄訊息,例如 - etcdserver: create snapshot directory error:mkdir /var/lib/etcd/member/snap: permission denied
- 如果發現權限遭拒訊息,請更新 /opt/data/var/lib/etcd/ 的擁有權 - sudo chown -R 2001:2001 /opt/data/var/lib/etcd/ 
- 確認 - kube-etcd和- kube-apiserver已啟動。- sudo crictl ps 
自動叢集備份
您可以參考這裡的指令碼範例,瞭解如何自動備份叢集。請注意,系統不支援下列指令碼,僅供您參考,以便編寫更完善、更強大且更完整的指令碼。執行指令碼前,請先填入指令碼開頭的五個變數值:
- 將 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 /tmp/${USER_CLUSTER_NAMESPACE}_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp ${USER_CLUSTER_NAMESPACE}/kube-etcd-0:tmp/${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 a+rX /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_snapshot.db"
kubectl --kubeconfig=${ADMIN_CLUSTER_KUBECONFIG} cp -n kube-system ${admin_etcd}:tmp/admin_snapshot.db $BACKUP_DIR/admin-cluster_snapshot.db
後續步驟
- 備份及還原使用者叢集
- 診斷叢集問題
- 瞭解 augur,這項開放原始碼工具可從 etcd 備份還原個別物件。