使用磁碟區快照,在 Google Kubernetes Engine (GKE) 中備份及還原 Persistent Disk 儲存空間。磁碟區快照會建立永久磁碟資料的時間點副本,方便您有效率地復原及測試。這項功能可協助您防止資料遺失、還原至先前的狀態,並確保工作負載的業務持續性。如要進一步瞭解 Kubernetes 磁碟區快照的基本概念,請參閱「關於 Kubernetes 磁碟區快照」。
需求條件
如要在 GKE 使用磁碟區快照,必須符合下列規定:
使用支援快照的 CSI 驅動程式。樹狀結構內 Persistent Disk 驅動程式不支援快照。如要建立及管理快照,您必須使用與基礎
PersistentVolumeClaim(PVC) 相同的 CSI 驅動程式。如要建立 Persistent Disk (PD) 磁碟區快照,請使用 Compute Engine Persistent Disk CSI 驅動程式。根據預設,在執行 GKE 1.18.10-gke.2100 以上版本或 1.19.3-gke.2100 以上版本的新 Linux 叢集上,會安裝 Compute Engine Persistent Disk CSI 驅動程式。您也可以在現有叢集上啟用 Compute Engine Persistent Disk CSI 驅動程式。
如需支援快照的所有 CSI 驅動程式清單,請參閱 Kubernetes 說明文件中驅動程式的「其他功能」欄。
使用控制層版本 1.17 以上版本。如要在
VolumeSnapshot中使用 Compute Engine Persistent Disk CSI 驅動程式,請使用 GKE 1.17.6-gke.4 以上版本。
- 有現有的
PersistentVolumeClaim可用於快照。用於快照來源的PersistentVolume必須由 CSI 驅動程式管理。如要確認是否使用 CSI 驅動程式,請檢查PersistentVolume規格是否含有csi區段,以及driver: pd.csi.storage.gke.io或filestore.csi.storage.gke.io。 如果PersistentVolume是由 CSI 驅動程式動態佈建 (如以下各節所述),則會由 CSI 驅動程式管理。
限制
所有 Compute Engine 磁碟快照建立限制也適用於 GKE。
最佳做法
在 GKE 使用 Persistent Disk Volume 快照時,請務必遵循 Compute Engine 磁碟快照的最佳做法。
事前準備
開始之前,請確認您已執行下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
建立及使用磁碟區快照
本文中的範例說明如何執行下列工作:
- 建立
PersistentVolumeClaim和Deployment。 - 將檔案新增至
Deployment使用的PersistentVolume。 - 建立
VolumeSnapshotClass來設定快照。 - 建立
PersistentVolume的磁碟區快照。 - 刪除測試檔案。
- 將
PersistentVolume還原至您建立的快照。 - 確認還原作業是否正常運作。
如要使用磁碟區快照,請完成下列步驟:
- 建立
VolumeSnapshotClass物件,指定快照的 CSI 驅動程式和刪除政策。 - 建立
VolumeSnapshot物件,要求現有PersistentVolumeClaim的快照。 - 在
PersistentVolumeClaim中參照VolumeSnapshot,將磁碟區還原至該快照,或使用快照建立新磁碟區。
建立 PersistentVolumeClaim 和 Deployment
如要建立
PersistentVolumeClaim物件,請將下列資訊清單儲存為my-pvc.yaml:Persistent Disk
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1Gi這個範例使用 Compute Engine Persistent Disk CSI 驅動程式預設安裝的
standard-rwo儲存空間類別。詳情請參閱「使用 Compute Engine Persistent Disk CSI 驅動程式」。對於
spec.storageClassName,您可以指定任何使用支援的 CSI 驅動程式的儲存空間級別。套用資訊清單:
kubectl apply -f my-pvc.yaml如要建立
Deployment,請將下列資訊清單儲存為my-deployment.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: hello-app spec: selector: matchLabels: app: hello-app template: metadata: labels: app: hello-app spec: containers: - name: hello-app image: google/cloud-sdk:slim args: [ "sleep", "3600" ] volumeMounts: - name: sdk-volume mountPath: /usr/share/hello/ volumes: - name: sdk-volume persistentVolumeClaim: claimName: my-pvc套用資訊清單:
kubectl apply -f my-deployment.yaml檢查
Deployment的狀態:kubectl get deployment hello-appDeployment可能需要一些時間才能準備就緒。您可以執行上述指令,直到看到類似下方的輸出內容:NAME READY UP-TO-DATE AVAILABLE AGE hello-app 1/1 1 1 2m55s
在磁碟區中新增測試檔案
列出
Deployment中的Pods:kubectl get pods -l app=hello-app輸出結果會與下列內容相似:
NAME READY STATUS RESTARTS AGE hello-app-6d7b457c7d-vl4jr 1/1 Running 0 2m56s在
Pod中建立測試檔案:kubectl exec POD_NAME \ -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'將
POD_NAME替換為Pod的名稱。確認檔案是否存在:
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'輸出結果會與下列內容相似:
Hello World!
建立 VolumeSnapshotClass 物件
建立 VolumeSnapshotClass 物件,指定 CSI 驅動程式和磁碟區快照的 deletionPolicy。建立 VolumeSnapshot 物件時,可以參照 VolumeSnapshotClass 物件。
將下列資訊清單儲存為
volumesnapshotclass.yaml。Persistent Disk
如果叢集搭載 1.21 以上版本,請使用
v1API 版本。apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass driver: pd.csi.storage.gke.io deletionPolicy: Delete在這個例子中:
CSI 驅動程式會使用
driver欄位佈建快照。在本範例中,pd.csi.storage.gke.io使用 Compute Engine Persistent Disk CSI 驅動程式。deletionPolicy欄位會告知 GKE,在刪除繫結的VolumeSnapshot物件時,如何處理VolumeSnapshotContent物件和基礎快照。指定Delete即可刪除VolumeSnapshotContent物件和基礎快照。如要保留VolumeSnapshotContent和基礎快照,請指定Retain。如要使用自訂儲存空間位置,請在快照類別中新增
storage-locations參數。如要使用這項參數,叢集必須採用 1.21 以上版本。apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass parameters: storage-locations: us-east2 driver: pd.csi.storage.gke.io deletionPolicy: Delete如要建立磁碟映像檔,請在
parameters欄位中新增下列內容:parameters: snapshot-type: images image-family: IMAGE_FAMILY將
IMAGE_FAMILY替換成您偏好的映像檔系列名稱,例如preloaded-data。
套用資訊清單:
kubectl apply -f volumesnapshotclass.yaml
建立 VolumeSnapshot
VolumeSnapshot 物件是現有 PersistentVolumeClaim 物件的快照要求。建立 VolumeSnapshot 物件時,GKE 會自動建立該物件,並與 VolumeSnapshotContent 物件繫結,後者是叢集中的資源,例如 PersistentVolume 物件。
將下列資訊清單儲存為
volumesnapshot.yaml。apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: my-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: persistentVolumeClaimName: my-pvc套用資訊清單:
kubectl apply -f volumesnapshot.yaml建立
Volume快照後,GKE 會在叢集中建立對應的VolumeSnapshotContent物件。這個物件會儲存VolumeSnapshot物件的快照和繫結。您不會直接與VolumeSnapshotContents物件互動。確認 GKE 是否已建立
VolumeSnapshotContents物件:kubectl get volumesnapshotcontents輸出結果會與下列內容相似:
NAME AGE snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da 55s
建立 Volume 快照內容後,您在 VolumeSnapshotClass 中指定的 CSI 驅動程式會在對應的儲存系統上建立快照。GKE 在儲存系統上建立快照,並將其繫結至叢集上的 VolumeSnapshot 物件後,快照即可使用。您可以執行下列指令來檢查狀態:
kubectl get volumesnapshot \
-o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'
如果快照已可使用,輸出內容會大致如下:
NAME READY
my-snapshot true
刪除測試檔案
刪除您建立的測試檔案:
kubectl exec POD_NAME \ -- sh -c 'rm /usr/share/hello/hello.txt'確認檔案已不存在:
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'輸出結果會與下列內容相似:
cat: /usr/share/hello/hello.txt: No such file or directory
還原磁碟區快照
您可以在 PersistentVolumeClaim 中參照 VolumeSnapshot,使用現有磁碟區中的資料佈建新磁碟區,或將磁碟區還原至快照擷取的狀態。
如要在 PersistentVolumeClaim 中參照 VolumeSnapshot,請將 dataSource 欄位新增至 PersistentVolumeClaim。無論 VolumeSnapshotContents 是指磁碟映像檔或快照,都使用相同的程序。
在本例中,您會在新的 PersistentVolumeClaim 中參照您建立的 VolumeSnapshot,並更新 Deployment 以使用新聲明。
請確認您使用的是磁碟快照還是映像檔快照,兩者差異如下:
- 磁碟快照:頻繁建立快照,但不常還原。
- 圖片快照:不常建立快照,但經常還原。此外,建立映像檔快照的速度可能比磁碟快照慢。
詳情請參閱「快照頻率限制」。瞭解快照類型有助於排解問題。
檢查
VolumeSnapshot:kubectl describe volumesnapshot SNAPSHOT_NAMEvolumeSnapshotClassName欄位會指定快照類別。kubectl describe volumesnapshotclass SNAPSHOT_CLASS_NAMEsnapshot-type參數會指定snapshots或images。如未提供,預設值為snapshots。如果沒有快照類別 (例如快照是以靜態方式建立),請檢查
VolumeSnapshotContents。sh kubectl describe volumesnapshotcontents SNAPSHOT_CONTENTS_NAME輸出內容中的快照控制代碼格式會顯示快照類型,如下所示: *projects/PROJECT_NAME/global/snapshots/SNAPSHOT_NAME:磁碟快照projects/PROJECT_NAME/global/images/IMAGE_NAME:圖片快照
將下列資訊清單儲存為
pvc-restore.yaml:Persistent Disk
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-restore spec: dataSource: name: my-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1Gi套用資訊清單:
kubectl apply -f pvc-restore.yaml更新
my-deployment.yaml檔案,改用新的PersistentVolumeClaim:... volumes: - name: my-volume persistentVolumeClaim: claimName: pvc-restore套用更新後的資訊清單:
kubectl apply -f my-deployment.yaml
確認快照已成功還原
取得 GKE 為更新後的
Deployment建立的新Pod名稱:kubectl get pods -l app=hello-app
確認測試檔案是否存在:
kubectl exec NEW_POD_NAME \
-- sh -c 'cat /usr/share/hello/hello.txt'
將 NEW_POD_NAME 替換為 GKE 建立的新 Pod 名稱。
輸出結果會與下列內容相似:
Hello World!
匯入現有快照
您可以使用在目前叢集外建立的現有磁碟區快照,手動佈建 VolumeSnapshotContents 物件。舉例來說,您可以將在其他叢集建立的Cloud de Confiance 資源快照,填入 GKE 中的磁碟區。
找出快照名稱。
Cloud de Confiance 控制台
Google Cloud CLI
執行下列指令:
gcloud compute snapshots list輸出結果會與下列內容相似:
NAME DISK_SIZE_GB SRC_DISK STATUS snapshot-5e6af474-cbcc-49ed-b53f-32262959a0a0 1 us-central1-b/disks/pvc-69f80fca-bb06-4519-9e7d-b26f45c1f4aa READY將下列
VolumeSnapshot資訊清單儲存為restored-snapshot.yaml。apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: restored-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: volumeSnapshotContentName: restored-snapshot-content套用資訊清單:
kubectl apply -f restored-snapshot.yaml將下列
VolumeSnapshotContent資訊清單儲存為restored-snapshot-content.yaml。將snapshotHandle欄位替換為專案 ID 和快照名稱。volumeSnapshotRef.name和volumeSnapshotRef.namespace都必須指向先前建立的VolumeSnapshot,雙向繫結才會有效。apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotContent metadata: name: restored-snapshot-content spec: deletionPolicy: Retain driver: pd.csi.storage.gke.io source: snapshotHandle: projects/PROJECT_ID/global/snapshots/SNAPSHOT_NAME volumeSnapshotRef: kind: VolumeSnapshot name: restored-snapshot namespace: default套用資訊清單:
kubectl apply -f restored-snapshot-content.yaml將下列
PersistentVolumeClaim資訊清單儲存為restored-pvc.yaml。Kubernetes 儲存空間控制器會尋找名為restored-snapshot的VolumeSnapshot,然後嘗試尋找或動態建立PersistentVolume做為資料來源。接著,您可以在 Pod 中使用這個 PVC,存取還原的資料。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: restored-pvc spec: dataSource: name: restored-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1Gi套用資訊清單:
kubectl apply -f restored-pvc.yaml將下列
Pod資訊清單儲存為restored-pod.yaml,並參照PersistentVolumeClaim。CSI 驅動程式會佈建PersistentVolume,並從快照填入資料。apiVersion: v1 kind: Pod metadata: name: restored-pod spec: containers: - name: busybox image: busybox args: - sleep - "3600" volumeMounts: - name: source-data mountPath: /demo/data volumes: - name: source-data persistentVolumeClaim: claimName: restored-pvc readOnly: false套用資訊清單:
kubectl apply -f restored-pod.yaml確認檔案已還原:
kubectl exec restored-pod -- sh -c 'cat /demo/data/hello.txt'
清除所用資源
如要避免系統向您的 Cloud de Confiance by S3NS 帳戶收取本頁所用資源的費用,請按照下列步驟操作。
刪除
VolumeSnapshot:kubectl delete volumesnapshot my-snapshot刪除
VolumeSnapshotClass:kubectl delete volumesnapshotclass my-snapshotclass刪除
Deployment:kubectl delete deployments hello-app刪除
PersistentVolumeClaim物件:kubectl delete pvc my-pvc pvc-restore
後續步驟
- 參閱 Kubernetes 磁碟區快照說明文件。
- 瞭解磁碟區擴充。
- 瞭解如何手動安裝 CSI 驅動程式。
- 瞭解 GKE 的區塊儲存空間 (Persistent Disk)。