本主題說明如何在 vSphere 上透過以下方法,備份和還原具有獨立管理叢集的 Tanzu Kubernetes Grid (TKG) 的叢集基礎結構:
附註
- VMware 不支援使用 Velero 來備份 TKG 獨立管理叢集。
- 如果在部署獨立管理叢集後重新設定該叢集,如同此處所述,重建該叢集不見得能全數復原其所有資源。
對於具有獨立管理叢集的 Tanzu Kubernetes Grid (TKG) 工作負載叢集,若要備份及還原其中所託管的工作負載和動態儲存磁碟區,請參閱備份和還原叢集工作負載。
若要備份和還原 vSphere with Tanzu 叢集 (包括主管叢集及其建立的工作負載叢集),請參閱 VMware vSphere 8.0 說明文件中的備份和還原 vSphere with Tanzu。
注意
此功能處於不受支援的技術預覽狀態;請參閱 TKG 功能狀態。
重建工作負載叢集的管理叢集後,對工作負載叢集執行 Pinniped 驗證無法運作。
您可以使用 Velero (一種開放原始碼社群標準工具),來備份和還原 TKG 獨立管理叢集基礎結構和工作負載。
Velero 支援各種儲存區提供者以儲存其備份。Velero 還支援:
Tanzu Kubernetes Grid 訂閱包括對 VMware 測試的、相容的 Velero 發行版的支援,可從 Tanzu Kubernetes Grid 下載頁面取得。
若要備份和還原 TKG 叢集,您需要:
完成上述必備條件後,還可以使用 Velero 在叢集之間遷移工作負載。有關說明,請參見 Velero 文件中的叢集遷移和資源篩選。
注意如果已安裝 Velero CLI v1.8.1 或更早版本 (隨早期版本的 TKG 一起發行),則需要升級到 v1.9.7。較舊的 Velero 版本不能與 v1.9 及更新版本中使用的 CRD 一起使用。
若要安裝 Velero CLI v1.9.7,請執行以下動作:
.gz
檔案。其檔案名稱以 velero-linux-
、velero-mac-
或 velero-windows64-
開頭。使用 gunzip
命令或您選擇的解壓縮工具解壓縮二進位檔:
gzip -d <RELEASE-TARBALL-NAME>.gz
將適用於您的平台的 CLI 二進位檔重新命名為 velero
,確保它是可執行的,然後將其新增至 PATH
。
macOS 和 Linux 平台:
/usr/local/bin
資料夾並將其重新命名為 velero
。chmod +x /usr/local/bin/velero
Windows 平台:
Program Files\velero
資料夾並將二進位檔案複製到其中。velero.exe
。velero
資料夾上按一下滑鼠右鍵,選取內容 (Properties) > 安全性 (Security),並確定您的使用者帳戶具有完全控制 (Full Control) 權限。env
。Path
資料列,然後按一下編輯 (Edit)。velero
二進位檔的路徑。若要備份 Tanzu Kubernetes Grid 工作負載叢集內容,您需要以下儲存區位置:
請參閱 Velero 說明文件中的備份儲存區位置和磁碟區快照位置。Velero 支援各種儲存區提供者,這些提供者可以是:
VMware 建議將唯一的儲存區值區專用於每個叢集。
若要設定 MinIO,請執行以下動作:
執行設有 MinIO 認證和儲存位置的 minio
容器映像,例如:
$ docker run -d --name minio --rm -p 9000:9000 -e "MINIO_ACCESS_KEY=minio" -e "MINIO_SECRET_KEY=minio123" -e "MINIO_DEFAULT_BUCKETS=mgmt" gcr.io/velero-gcp/bitnami/minio:2021.6.17-debian-10-r7
將認證儲存到本機檔案,以傳遞給 velero install
的 --secret-file
選項,例如:
[default]
aws_access_key_id=minio
aws_secret_access_key=minio123
在 vSphere 上,叢集物件儲存區備份和磁碟區快照將儲存到同一儲存區位置。此位置必須是 Amazon Web Services (AWS) 或 S3 提供者 (如 MinIO) 上與 S3 相容的外部儲存區。
若要為 vSphere 上的 Velero 設定儲存區,請參閱適用於 v1.4.3 外掛程式的 Vanilla Kubernetes 叢集中的 Velero Plugin for vSphere。
若要為 AWS 上的 Velero 設定儲存區,請依照適用於 AWS 存放庫的 Velero 外掛程式中的程序操作:
視需要為每個外掛程式設定 S3 儲存區。物件儲存外掛程式會儲存和擷取叢集物件備份,而磁碟區快照程式則會儲存和擷取資料磁碟區。
若要為 Azure 上的 Velero 設定儲存區,請依照適用於 Azure 存放庫的 Velero 外掛程式中的程序操作:
視需要為每個外掛程式設定 S3 儲存區。物件儲存外掛程式會儲存和擷取叢集物件備份,而磁碟區快照程式則會儲存和擷取資料磁碟區。
若要備份工作負載叢集物件,請將 Velero v1.9.7 伺服器安裝到獨立管理叢集並驗證安裝。
若要安裝 Velero,請執行具有下列選項的 velero install
:
--provider $PROVIDER
:例如,aws
--plugins projects.registry.vmware.com/tkg/velero/velero-plugin-for-aws:v1.5.5_vmware.1
--bucket $BUCKET
:S3 值區的名稱--backup-location-config region=$REGION
:值區所在的 AWS 區域--snapshot-location-config region=$REGION
:值區所在的 AWS 區域--kubeconfig
將 Velero 伺服器安裝到目前預設叢集以外的叢集。(選用) --secret-file ./VELERO-CREDS
授與 Velero 存取 S3 值區的一種方法是,將類似如下的本機 VELERO-CREDS
檔案傳遞給這個選項:
[default]
aws_access_key_id=<AWS_ACCESS_KEY_ID>
aws_secret_access_key=<AWS_SECRET_ACCESS_KEY>
如需其他選項,請參閱安裝並啟動 Velero。
執行 velero install
命令時,會在叢集上建立一個稱為 velero
的命名空間,並在其中放置一個名為 velero
的部署。
需要下列設定:
--plugins projects.registry.vmware.com/tkg/velero/velero-mgmt-cluster-plugin:v0.1.0_vmware.1
附註您可以新增以逗號分隔的多個選項。例如:
--plugins projects.registry.vmware.com/tkg/velero/velero-plugin-for-aws:v1.5.5_vmware.1,projects.registry.vmware.com/tkg/velero/velero-mgmt-cluster-plugin:v0.1.0_vmware.1
--snapshot-location-config
velero install
命令完成後,請確認 Velero 已安裝成功:
確認 Velero 網繭的狀態為 Running
:
kubectl -n velero get pod
NAME READY STATUS RESTARTS AGE
velero-78fdbcd446-v5cqr 1/1 Running 0 3h41m
確認備份位置處於 Available
階段:
velero backup-location get
NAME PROVIDER BUCKET/PREFIX PHASE LAST VALIDATED ACCESS MODE DEFAULT
default aws mgmt Available 2022-11-11 05:55:55 +0000 UTC ReadWrite true
若要備份由獨立管理叢集所管理的所有工作負載叢集物件,請執行:
velero backup create my-backup --exclude-namespaces tkg-system --include-resources cluster.cluster.x-k8s.io --wait
附註
--exclude-namespaces tkg-system
會排除管理叢集本身。
--include-resources cluster.cluster.x-k8s.io
會包含工作負載叢集物件VMware 建議您在進行任何結構變更 (例如垂直擴充或縮減) 後,就立即備份工作負載叢集。這可避免備份物件和實體基礎結構之間出現不相符情況,從而避免還原程序失敗。
如果在最近一次備份後變更了叢集物件,則還原後的系統狀態會與其想要的最新狀態不相符。此問題稱為「偏差」。如需如何從某些常見類型的偏差復原的相關資訊,請參閱以下的處理偏差小節。
為了緩解偏差,VMware 建議使用 Velero 來排程定期備份。例如,若要每天備份所有的工作負載叢集,且每個備份保留 14 天,請執行:
velero create schedule daily-bak --schedule="@every 24h" --exclude-namespaces tkg-system --include-resources cluster.cluster.x-k8s.io --ttl 336h0m0s
如需更多 Velero 排程選項,請參閱 Velero 說明文件中的排程備份。
若要還原獨立管理叢集及其管理的工作負載叢集物件,請執行以下動作:
從組態檔 mgmt-cluster-config.yaml
重建管理叢集,如從組態檔來部署管理叢集中所述。
附註在部署管理叢集後,套用至管理叢集的任何組態變更都必須反映在組態檔或環境變數中,否則將不會還原它們。
一建立管理叢集後,就只應有一個 TKR:
tanzu kubernetes-release get
NAME VERSION COMPATIBLE ACTIVE UPDATES AVAILABLE
v1.25.7---vmware.1-tkg.1 v1.25.7+vmware.1-tkg.1 True True
請等待幾分鐘,直到所備份的工作負載叢集使用的所有 TKR 都變成可用:
tanzu kubernetes-release get
NAME VERSION COMPATIBLE ACTIVE UPDATES AVAILABLE
v1.23.17---vmware.2-tkg.2 v1.23.17+vmware.2-tkg.2 True True
v1.24.11---vmware.1-tkg.1 v1.24.11+vmware.1-tkg.1 True True
v1.25.7---vmware.1-tkg.1 v1.25.7+vmware.1-tkg.1 True True
遵循上述將 Velero 伺服器部署到叢集指示,在管理叢集上安裝 Velero。請確定認證和備份位置組態設定的值與執行備份時的值相同。
Velero 安裝後,請執行 velero backup get
,直到備份同步,且命令列出了您想使用的備份:
velero backup get
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
my-backup Completed 0 0 2022-12-07 17:10:42 +0000 UTC 24d default <none>
執行 velero restore create
,還原工作負載叢集資源。VMware 建議使用最新的備份:
velero restore create my-restore --from-backup my-backup --wait
還原完成後,叢集將處於 createdStalled
狀態:
tanzu cluster list
NAME NAMESPACE STATUS CONTROLPLANE WORKERS KUBERNETES ROLES PLAN TKR
tkg-vc-antrea default createdStalled 0/3 0/3 v1.25.7+vmware.1 <none> prod v1.25.7---vmware.1-tkg.1
修補叢集物件,以將其 paused
內容設定為 false
。這是必要的,因為會以 paused
狀態將叢集物件重建在新的管理叢集上,以防止其控制器嘗試協調:
若要在還原叢集後取消暫停它,請執行:
kubectl -n my-namespace patch cluster CLUSTER-NAME --type merge -p '{"spec":{"paused":false}}'
若要取消暫停多個命名空間中的所有叢集,請執行以下指令碼:
#!/bin/bash
for ns in $(kubectl get ns -o custom-columns=":metadata.name" | grep -v "tkg-system");
do
clusters=$(kubectl -n $ns get cluster -o name)
if [[ -n $clusters ]];then
kubectl -n $ns patch $clusters --type merge -p '{"spec":{"paused":false}}'
fi
done
確認所有工作負載叢集都處於 running
狀態,例如:
tanzu cluster list
NAME NAMESPACE STATUS CONTROLPLANE WORKERS KUBERNETES ROLES PLAN TKR
tkg-vc-antrea default running 3/3 3/3 v1.25.7+vmware.1 <none> prod v1.25.7---vmware.1-tkg.1
針對每個工作負載叢集,執行 tanzu cluster get CLUSTER-NAME
,以檢查所有元件是否都處於 running
狀態,例如:
tanzu cluster get tkg-vc-antrea
NAME NAMESPACE STATUS CONTROLPLANE WORKERS KUBERNETES ROLES TKR
tkg-vc-antrea default running 3/3 3/3 v1.25.7+vmware.1 <none> v1.25.7---vmware.1-tkg.1
Details:
NAME READY SEVERITY REASON SINCE MESSAGE
/tkg-vc-antrea True 4h14m
├─ClusterInfrastructure - VSphereCluster/tkg-vc-antrea-s6kl5 True 4h36m
├─ControlPlane - KubeadmControlPlane/tkg-vc-antrea-ch5hn True 4h14m
│ ├─Machine/tkg-vc-antrea-ch5hn-8gfvt True 4h14m
│ ├─Machine/tkg-vc-antrea-ch5hn-vdcrp True 4h23m
│ └─Machine/tkg-vc-antrea-ch5hn-x7nmm True 4h32m
└─Workers
├─MachineDeployment/tkg-vc-antrea-md-0-8b8zn True 4h23m
│ └─Machine/tkg-vc-antrea-md-0-8b8zn-798d5b8897-bnxn9 True 4h24m
├─MachineDeployment/tkg-vc-antrea-md-1-m6dvh True 4h24m
│ └─Machine/tkg-vc-antrea-md-1-m6dvh-79fb858b96-p9667 True 4h28m
└─MachineDeployment/tkg-vc-antrea-md-2-brm2m True 4h21m
└─Machine/tkg-vc-antrea-md-2-brm2m-6478cffc5f-tq5cn True 4h23m
當所有工作負載叢集都正在執行後,就可以使用 Tanzu CLI 來管理工作負載叢集。
偏差情況可能很複雜,但一些常見的模式和緩解措施包括:
失效的工作節點:
Ghost 工作節點基礎結構:
緩解措施:
kubeconfig
,並將其設定為 kubectl
內容。比較下列 kubectl
和 tanzu
命令的輸出:
# Get the actual worker nodes of the workload cluster
$ kubectl --context tkg-vc-antrea-admin@tkg-vc-antrea get node
NAME STATUS ROLES AGE VERSION
tkg-vc-antrea-md-0-p9vn5-645498f59f-42qh9 Ready <none> 44m v1.25.7+vmware.1
tkg-vc-antrea-md-0-p9vn5-645498f59f-shrpt Ready <none> 114m v1.25.7+vmware.1
tkg-vc-antrea-wdsfx-2hkxp Ready control-plane 116m v1.25.7+vmware.1
# Get the worker nodes managed by the TKG
$ tanzu cluster get tkg-vc-antrea
NAME NAMESPACE STATUS CONTROLPLANE WORKERS KUBERNETES ROLES TKR
tkg-vc-antrea default running 1/1 1/1 v1.25.7+vmware.1 <none> v1.25.7---vmware.1-tkg.1-zshippable
Details:
NAME READY SEVERITY REASON SINCE MESSAGE
/tkg-vc-antrea True 13m
├─ClusterInfrastructure - VSphereCluster/tkg-vc-antrea-b7fr9 True 13m
├─ControlPlane - KubeadmControlPlane/tkg-vc-antrea-wdsfx True 13m
│ └─Machine/tkg-vc-antrea-wdsfx-2hkxp True 13m
└─Workers
└─MachineDeployment/tkg-vc-antrea-md-0-p9vn5 True 13m
└─Machine/tkg-vc-antrea-md-0-p9vn5-645498f59f-shrpt True 13m
對於 kubectl
所列出的工作節點,只要該工作節點並無 tanzu cluster get
中的 Workers
> Machine
清單,請執行下列動作:
將工作節點數量垂直擴充為預期值,例如:
tanzu cluster scale ${cluster_name} --worker-machine-count 2
kubeconfig
來清空 Ghost 節點,這會將其工作負載移至 TKG 所管理的節點:kubectl drain ${node_name} --delete-emptydir-data --ignore-daemonsets
從叢集中移除 Ghost 節點:
kubectl delete node ${node_name}
登入 vSphere 或其他基礎結構,然後手動移除虛擬機器。
控制平面上的失效節點和 Ghost 基礎結構
緩解措施:
kubeconfig
,並將其設定為 kubectl
內容。比較下列 kubectl
和 tanzu
命令的輸出:
# Get the actual control plane nodes of the workload cluster
$ kubectl --context wc-admin@wc get node
NAME STATUS ROLES AGE VERSION
wc-2cjn4-4xbf8 Ready control-plane 107s v1.25.7+vmware.1
wc-2cjn4-4zljs Ready control-plane 26h v1.25.7+vmware.1
wc-2cjn4-59v95 Ready control-plane 26h v1.25.7+vmware.1
wc-2cjn4-ncgxb Ready control-plane 25h v1.25.7+vmware.1
wc-md-0-nl928-5df8b9bfbd-nww2w Ready <none> 26h v1.25.7+vmware.1
wc-md-1-j4m55-589cfcd9d6-jxmvc Ready <none> 26h v1.25.7+vmware.1
wc-md-2-sd4ww-7b7db5dcbb-crwdv Ready <none> 26h v1.25.7+vmware.1
# Get the control plane nodes managed by the TKG
$ tanzu cluster get wc
NAME NAMESPACE STATUS CONTROLPLANE WORKERS KUBERNETES ROLES TKR
wc default updating 4/3 3/3 v1.25.7+vmware.1 <none> v1.25.7---vmware.1-tkg.1-zshippable
Details:
NAME READY SEVERITY REASON SINCE MESSAGE
/wc True 24m
├─ClusterInfrastructure - VSphereCluster/wc-9nq7v True 26m
├─ControlPlane - KubeadmControlPlane/wc-2cjn4 True 24m
│ ├─Machine/wc-2cjn4-4xbf8 True 24m
│ ├─Machine/wc-2cjn4-4zljs True 26m
│ └─Machine/wc-2cjn4-59v95 True 26m
└─Workers
├─MachineDeployment/wc-md-0-nl928 True 26m
│ └─Machine/wc-md-0-nl928-5df8b9bfbd-nww2w True 26m
├─MachineDeployment/wc-md-1-j4m55 True 26m
│ └─Machine/wc-md-1-j4m55-589cfcd9d6-jxmvc True 26m
└─MachineDeployment/wc-md-2-sd4ww True 26m
└─Machine/wc-md-2-sd4ww-7b7db5dcbb-crwdv True 26m
對於 kubectl
所列出的 control-plane
節點,只要該控制平面並無 tanzu cluster get
中的 ControlPlane
> Machine
清單,請執行下列動作:
刪除節點:
kubectl delete node ${node_name}