本文說明如何使用 Kubernetes 磁碟區複製功能,複製 Google Kubernetes Engine (GKE) 叢集中的永久磁碟區。
總覽
副本是新的獨立磁碟區,與現有的 Kubernetes 磁碟區重複。本機副本與磁碟區快照類似,都是特定時間點的磁碟區副本。不過,磁碟區複製作業會從來源磁碟區佈建所有資料,而非建立快照物件。
需求條件
如要在 GKE 上使用磁碟區複製功能,必須符合下列規定:
- 來源 PersistentVolumeClaim 必須與目的地 PersistentVolumeClaim 位於相同命名空間。
- 使用支援磁碟區複製的 CSI 驅動程式。樹內永久磁碟驅動程式不支援磁碟區複製功能。
- Compute Engine Persistent Disk CSI 驅動程式 1.4.0 以上版本支援磁碟區複製功能,且預設會安裝在執行 GKE 1.22 以上版本的新 Linux 叢集。您也可以在現有叢集上啟用 Compute Engine 永久磁碟 CSI 驅動程式。
如要確認 Compute Engine Persistent Disk CSI 驅動程式版本,請在 gcloud CLI 中執行下列指令:
kubectl describe daemonsets pdcsi-node --namespace=kube-system | grep "gke.gcr.io/gcp-compute-persistent-disk-csi-driver"
如果輸出內容顯示的版本早於 1.4.0
,請手動升級控制層,取得最新版本。
限制
- 兩個磁碟區必須使用相同的磁碟區模式。根據預設,GKE 會將 VolumeMode 設為
ext4
。 - Compute Engine 從現有磁碟建立磁碟副本的所有限制,也適用於 GKE。
- 您可以從區域磁碟建立地區磁碟副本,但請注意這種做法的限制。
- 複製作業必須在相容的可用區中進行。使用 allowedTopologies 將佈建磁碟區的拓撲限制在特定區域。或者,您也可以使用 nodeSelectors 或相依性和反相依性來限制 Pod,確保 Pod 只能在相容區域中執行的特定節點上執行。
- 如要進行區域到區域的複製作業,複製區域必須與來源磁碟區域相符。
- 如要將區域磁碟複製到區域磁碟,複製磁碟的其中一個備用資源可用區必須與來源磁碟的可用區相符。
使用磁碟區複製功能
如要佈建磁碟區副本,請在新的 PersistentVolumeClaim 的 dataSource
欄位中,新增對相同命名空間中現有 PersistentVolumeClaim 的參照。下列練習說明如何佈建含有資料的來源磁碟區、建立磁碟區副本,以及使用該副本。
建立來源磁碟區
如要建立來源磁碟區,請按照「使用 Compute Engine 永久磁碟 CSI 驅動程式建立 Linux 叢集」一文中的說明,建立 StorageClass、PersistentVolumeClaim 和 Pod,以使用新磁碟區。您建立的 PersistentVolumeClaim 將做為磁碟區複製作業的來源。
在來源磁碟區中新增測試檔案
在來源磁碟區中新增測試檔案。您可以在磁碟區副本中尋找這個測試檔案,確認複製作業是否成功。
在 Pod 中建立測試檔案:
kubectl exec POD_NAME \ -- sh -c 'echo "Hello World!" > /var/lib/www/html/hello.txt'
將
POD_NAME
替換為使用來源磁碟區的 Pod 名稱。舉例來說,如果您按照「為 Linux 叢集使用 Compute Engine 永久磁碟 CSI 驅動程式」一文中的操作說明進行,請將POD_NAME
替換為web-server
。確認檔案是否存在:
kubectl exec POD_NAME \ -- sh -c 'cat /var/lib/www/html/hello.txt'
輸出結果會與下列內容相似:
Hello World!
複製來源磁碟區
將下列資訊清單儲存為
podpvc-clone.yaml
:kind: PersistentVolumeClaim apiVersion: v1 metadata: name: podpvc-clone spec: dataSource: name: PVC_NAME kind: PersistentVolumeClaim accessModes: - ReadWriteOnce storageClassName: STORAGE_CLASS_NAME resources: requests: storage: STORAGE
更改下列內容:
PVC_NAME
:您在「建立來源磁碟區」中建立的來源 PersistentVolumeClaim 名稱。STORAGE_CLASS_NAME
:要使用的 StorageClass 名稱,必須與來源 PersistentVolumeClaim 的 StorageClass 相同。STORAGE
:要要求的儲存空間大小,必須至少是來源 PersistentVolumeClaim 的大小。
套用資訊清單:
kubectl apply -f podpvc-clone.yaml
建立使用複製磁碟區的 Pod
下列範例會建立 Pod,並使用您建立的磁碟區副本。
將下列資訊清單儲存為
web-server-clone.yaml
:apiVersion: v1 kind: Pod metadata: name: web-server-clone spec: containers: - name: web-server-clone image: nginx volumeMounts: - mountPath: /var/lib/www/html name: mypvc volumes: - name: mypvc persistentVolumeClaim: claimName: podpvc-clone readOnly: false
套用資訊清單:
kubectl apply -f web-server-clone.yaml
確認測試檔案是否存在:
kubectl exec web-server-clone \ -- sh -c 'cat /var/lib/www/html/hello.txt'
輸出結果會與下列內容相似:
Hello World!
清除所用資源
如要避免系統向您的 Google Cloud 帳戶收取本頁所用資源的費用,請按照下列步驟操作。
刪除
Pod
個物件:kubectl delete pod POD_NAME web-server-clone
刪除
PersistentVolumeClaim
個物件:kubectl delete pvc podpvc podpvc-clone