雲端硬碟儲存快照可以協助您實現應用資料的備份和恢複。本文介紹如何通過VolumeSnapshot資源為雲端硬碟儲存卷建立快照,以及如何基於快照恢複資料。
前提條件
已建立ACK託管叢集,且叢集版本為1.18及以上版本。
已開通快照,開通快照不收費,建立快照後才開始收費。
功能概述
在ACK叢集中,通常使用雲端硬碟儲存卷為StatefulSet提供持久化儲存。雲端式盤本身提供的快照功能,Kubernetes使用以下兩個特性來實現雲端硬碟儲存卷的資料備份和恢複能力。
通過VolumeSnapshot資源實現雲端硬碟資料的備份(快照功能)。
通過PVC的DataSource功能實現雲端硬碟資料的恢複。
計費說明
ACK的儲存快照基於ECS快照實現。快照會收取儲存費用,具體請參見快照計費。
使用說明
為了實現快照相關功能,ACK通過CRD定義了以下3個相關的資源類型。
資源類型名稱 | 描述 |
VolumeSnapshotContent | 儲存後端的快照,由叢集管理員建立維護,無NameSpace。類似PV概念。 |
VolumeSnapshot | 聲明一個快照,由操作人員建立維護,屬於特定Namespace。類似PVC概念。 |
VolumeSnapshotClass | 定義一個快照類,描述建立快照使用的參數、Controller。類似StorageClass概念。 |
綁定規則如下:
使用Snapshot資源類型時,類似PV和PVC,首先您需綁定VolumeSnapshot與VolumeSnapshotContent。
如果VolumeSnapshot正確配置了VolumeSnapshotClassName欄位,叢集會自動建立VolumeSnapshotContent。如果沒有配置或者配置錯誤,則無法自動建立,您需要手動建立VolumeSnapshotContent,並綁定VolumeSnapshot。
VolumeSnapshotContent與VolumeSnapshot綁定是一對一的關係。
刪除VolumeSnapshotContent時,後端的快照也會被刪除。
動態建立快照
使用流程
ACK使用雲端硬碟動態建立快照使用流程如下圖所示。
使用PL0、PL1、PL2、PL3層級的ESSD雲端硬碟或ESSD AutoPL雲端硬碟時,動態建立的快照預設開啟快照極速可用能力。
使用流程說明如下:
流程步驟 | 描述 |
① | 建立應用並使用雲端硬碟儲存卷儲存資料。 |
② | 建立關聯了VolumeSnapshotClass的VolumeSnapshot,此時叢集會自動建立VolumeSnapshotContent和儲存後端的快照。 |
③ | 建立新的應用,並配置PVC引用步驟②中建立的快照。 |
上述的三個步驟實現:
備份:Volume1的資料被備份到Snapshot1。
恢複:Snapshot1的資料(也就是Volume1的資料)被恢複成Volume2。
使用樣本
建立VolumeSnapshotClass。
使用以下YAML內容建立volumesnapshotclass.yaml檔案。
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: default-snapclass driver: diskplugin.csi.alibabacloud.com parameters: retentionDays: "5" forceDelete: "true" deletionPolicy: Delete參數
說明
retentionDays指定快照自動回收時間。單位為天。
forceDelete當
forceDelete配置為"true"時,表示使用強制移除快照功能。自csi-provisioner組件v1.26.5-92f859a-aliyun版本起,預設使用強制移除且不可修改,此前預設為普通刪除。
強制移除:強制移除使用者建立的所有已使用和未使用的快照。
普通刪除:只刪除未使用的快照。不刪除已經使用過的快照。
deletionPolicy快照的回收策略。取值範圍:
Delete:刪除VolumeSnapshot時,VolumeSnapshotContent以及關聯的快照也會一起被刪除。Retain:刪除VolumeSnapshot時,VolumeSnapshotContent以及關聯的快照不會被刪除。
建立VolumeSnapshotClass。
kubectl apply -f volumesnapshotclass.yaml
建立應用並寫入資料。
使用以下YAML內容建立nginx.yaml檔案。
apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 imagePullPolicy: IfNotPresent volumeMounts: - name: disk mountPath: /data volumeClaimTemplates: - metadata: name: disk spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "alicloud-disk-topology-alltype" resources: requests: storage: 20Gi建立應用。
kubectl apply -f nginx.yaml查看Pod部署狀態。
kubectl get pod -l app=nginx預期返回:
NAME READY STATUS RESTARTS AGE nginx-0 1/1 Running 0 82s向掛載路徑寫入資料。
kubectl exec -it nginx-0 -- touch /data/test kubectl exec -it nginx-0 -- ls /data預期返回:
lost+found test
建立VolumeSnapshot。
重要如果CSI組件版本不低於v1.22.12-b797ad9-aliyun,則建立快照時,不依賴該是否有Running Pod在使用PVC,可對任意掛載過的雲端硬碟建立快照。
如果CSI組件版本低於v1.22.12-b797ad9-aliyun,則建立快照時,需要保證有Running Pod正在使用當前PVC,即保證雲端硬碟處於掛載狀態。
使用以下YAML內容建立snapshot-1.yaml檔案。
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: new-snapshot-demo namespace: default spec: volumeSnapshotClassName: default-snapclass # 關聯VolumeSnapshotClass source: persistentVolumeClaimName: disk-nginx-0建立VolumeSnapshot。
kubectl apply -f snapshot-1.yaml
查看VolumeSnapshot和VolumeSnapshotContent。
說明您也可以登入ECS控制台查看VolumeSnapshotContent對應的快照。
查看VolumeSnapshot。
kubectl get volumesnapshots預期返回:
NAME READYTOUSE SOURCEPVC SOURCESNAPSHOTCONTENT RESTORESIZE SNAPSHOTCLASS SNAPSHOTCONTENT CREATIONTIME AGE new-snapshot-demo true disk-nginx-0 20Gi default-snapclass snapcontent-48b04625-679a-490f-9ef3-f04b2b8e6c57 28s 28s查看VolumeSnapshotContent。
kubectl get VolumeSnapshotContent預期返回:
NAME READYTOUSE RESTORESIZE DELETIONPOLICY DRIVER VOLUMESNAPSHOTCLASS VOLUMESNAPSHOT VOLUMESNAPSHOTNAMESPACE AGE snapcontent-48b04625-679a-490f-9ef3-f04b2b8e6c57 true 21474836480 Delete diskplugin.csi.alibabacloud.com default-snapclass new-snapshot-demo default 49s
(可選)使用VolumeSnapshot建立一個新的應用,以此恢複資料。
使用以下YAML內容建立nginx-restore檔案。
在
volumeClaimTemplates中,需設定dataSource.kind為VolumeSnapshot,且dataSource.name為VolumeSnapshot名稱。apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx-restore spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 imagePullPolicy: IfNotPresent volumeMounts: - name: disk mountPath: /data volumeClaimTemplates: - metadata: name: disk spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "alicloud-disk-topology-alltype" resources: requests: storage: 20Gi dataSource: name: new-snapshot-demo kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io建立應用。
kubectl apply -f nginx-restore.yaml查看掛載路徑的資料,確認資料是否已經恢複。
kubectl exec -it nginx-restore-0 -- ls /data返回樣本:
lost+found test
(可選)若您暫時不需要建立工作負載,可以使用VolumeSnapshot建立一個PVC。
使用以下YAML內容建立pvc-restore檔案。
需設定
dataSource.kind為VolumeSnapshot,且dataSource.name為VolumeSnapshot名稱。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-disk namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 20Gi dataSource: name: new-snapshot-demo kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: alicloud-disk-topology-alltype volumeMode: Filesystem建立PVC。
說明對於以alicloud-disk-topology-alltype為例的VolumeBindingMode類型為WaitForFirstConsumer的儲存類,建立出的PVC會處於Pending狀態,直到被第一次掛載,期間需要保證VolumeSnapshot、VolumeSnapshotContent資源及對應的ECS快照執行個體未被刪除。
kubectl apply -f pvc-restore.yaml
靜態建立快照(使用已有ECS快照)
如果您已在ECS控制台雲端式盤建立了快照,可參考以下步驟將ECS快照匯入至ACK叢集中。
基於已有ECS快照建立VolumeSnapshotContent。
使用以下YAML內容建立snapshot-content.yaml檔案。
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotContent metadata: name: new-snapshot-content-test spec: deletionPolicy: Retain driver: diskplugin.csi.alibabacloud.com source: snapshotHandle: <YOUR-SNAPSHOTID> volumeSnapshotRef: name: new-snapshot-demo namespace: default參數
描述
snapshotHandle已有快照的ID。您可以在ECS控制台的快照頁面擷取快照ID。
volumeSnapshotRef填寫要建立的VolumeSnapshot的資訊。
name:將要建立的VolumeSnapshot的名稱。namespace:將要建立的VolumeSnapshot所在的命名空間。
建立VolumeSnapshotContent。
kubectl apply -f snapshot-content.yaml
建立VolumeSnapshot,並綁定VolumeSnapshotContent。
使用以下YAML內容建立snapshot-2.yaml檔案。
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: new-snapshot-demo namespace: default spec: source: volumeSnapshotContentName: new-snapshot-content-test參數
描述
metadata.nameVolumeSnapshot名稱,需要和VolumeSnapshotContent中
volumeSnapshotRef.name的配置一致。volumeSnapshotContentName要綁定的VolumeSnapshotContent的名稱。
建立VolumeSnapshot。
kubectl apply -f snapshot-2.yaml
(可選)使用VolumeSnapshot建立一個新的應用,以此恢複資料。
使用以下YAML內容建立nginx-restore檔案。
在
volumeClaimTemplates中,需設定dataSource.kind為VolumeSnapshot,且dataSource.name為VolumeSnapshot名稱。apiVersion: apps/v1 kind: StatefulSet metadata: name: nginx-restore spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 imagePullPolicy: IfNotPresent volumeMounts: - name: disk mountPath: /data volumeClaimTemplates: - metadata: name: disk spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "alicloud-disk-topology-alltype" resources: requests: storage: 20Gi dataSource: name: new-snapshot-demo kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io建立應用。
kubectl apply -f nginx-restore.yaml查看掛載路徑的資料,確認資料是否已經恢複。
kubectl exec -it nginx-restore-0 -- ls /data返回樣本:
lost+found test