當云盤非預期刪除導致數據丟失時,您可以通過ESSD類型云盤數據卷的自動極速快照功能,實現數據的快速恢復,以保證存儲數據的安全性。本文介紹如何使用ESSD云盤的自動極速快照功能實現云盤存儲數據安全。
前提條件
使用場景
云盤非預期刪除導致的數據丟失
云盤回收策略為Delete模式,您在刪除PVC時,PV和云盤將同時被刪除。當您誤刪除了某個云盤時,您需要通過已創建的云盤快照將數據恢復到指定的時間點。若云盤快照不存在或快照創建后云盤有新數據寫入,都將導致云盤存儲數據丟失。
為保護業務數據,容器服務ACK提供ESSD類型云盤數據卷刪除前的自動極速快照功能,將創建的云盤快照保留一段時間,用于恢復云盤非預期刪除的數據。
使用效果
非預期刪除云盤時,能通過云盤極速快照完整地恢復數據。
云盤極速快照秒級創建,降低了刪除操作所需的時間。
說明極速快照僅支持ESSD類型云盤使用。
配置要求
CSI-Provisioner組件配置
執行以下命令,將kube-system命名空間下CSI-Provisioner的containers字段添加env配置:VOLUME_DEL_AUTO_SNAP: "true"
。
kubectl patch deploy csi-provisioner -n kube-system -p '{"spec":{"template":{"spec":{"containers":[{"name":"csi-provisioner","env":[{"name":"VOLUME_DEL_AUTO_SNAP","value":"true"}]}]}}}}'
僅在VOLUME_DEL_AUTO_SNAP
為true
時,允許使用ESSD云盤刪除前自動創建極速快照功能。
集群存儲類配置
使用以下模板配置集群的存儲類。
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: alicloud-datasafe-essd
provisioner: diskplugin.csi.alibabacloud.com
parameters:
type: cloud_essd
volumeDeleteSnapshotRetentionDays: "3" # 該設置僅在reclaimPolicy為"Delete"時生效。
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
allowVolumeExpansion: true
參數 | 說明 |
volumeDeleteSnapshotRetentionDays | 定義ESSD云盤刪除前自動創建極速快照的保留時間,單位:天。 該字段為空時,不能使用創建極速快照功能,所以建議您在使用時配置該參數值。 |
自動創建極速快照
本文以有狀態應用MySQL為例,介紹云盤在云盤誤刪除數據導致數據丟失的場景下,如何使用ESSD類型云盤自動創建極速快照功能保護并恢復數據。
使用以下內容,創建mysql.yaml文件。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: essd-pvc namespace: autosnapshot spec: accessModes: - ReadWriteOnce resources: requests: storage: 25Gi storageClassName: alicloud-datasafe-essd # 使用集群存儲類最佳實踐配置。 --- apiVersion: v1 kind: Secret metadata: name: mysql-pass namespace: autosnapshot type: Opaque data: username: dGVzdDEK password: dGVzdDEtdmFsdWUK --- apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql-sts namespace: autosnapshot spec: selector: matchLabels: app: mysql-sts serviceName: mysql-sts template: metadata: labels: app: mysql-sts spec: containers: - name: mysql-sts image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-pass key: password ports: - containerPort: 80 name: mysql-sts volumeMounts: - name: mysql mountPath: /var/lib/mysql subPath: mysql volumes: - name: mysql persistentVolumeClaim: claimName: essd-pvc
執行以下命令,部署MySQL應用。
kubectl apply -f mysql.yaml
執行以下命令,確認MySQL應用已掛載對應的云盤存儲卷。
kubectl get pvc -nautosnapshot | grep essd-pvc
預期輸出:
essd-pvc Bound d-2zeit7uza22vjya1**** 25Gi RWO alicloud-datasafe-essd 54s
其中,
d-2zeit7uza22vjya1****
為已掛載成功的ESSD云盤實例ID。執行以下命令,進入MySQL應用容器。
kubectl -n autosnapshot exec -it mysql-sts-0 -- /bin/sh
在容器Shell中執行以下命令,模擬數據寫入。
dd if=/dev/urandom of=/var/lib/mysql/mysql/record.txt bs=1M count=1000
在容器Shell中執行以下命令,查看寫入數據的大小。
ls /var/lib/mysql/mysql -l | grep record
預期輸出:
-rw-r--r-- 1 root root 1048576000 Nov 8 02:36 record.txt
數據安全的云盤刪除
執行以下命令,將MySQL應用副本縮減為0。
kubectl scale sts/mysql-sts -n autosnapshot --replicas=0
執行以下命令,刪除MySQL應用所使用的PVC。
kubectl delete pvc essd-pvc -n autosnapshot
執行以下命令,查詢自動極速快照相關的集群資源。
kubectl get volumesnapshot
預期輸出:
d-2zeit7uza22vjya1****-delprotect true d-2zeit7uza22vjya1****-delprotect-content 30Gi d-2zeit7uza22vjya1****-delprotect-content 6s 6s
部分參數說明如下。
d-2zeit7uza22vjya1****
:刪除的ESSD云盤實例ID,與essd-pvc刪除前綁定的云盤實例ID一致。d-2zeit7uza22vjya1****-delprotect
:對應極速快照的VolumeSnapshot名稱。d-2zeit7uza22vjya1****-delprotect-content
:對應極速快照的VolumeSnapshotContent名稱。
使用云盤刪除時創建的自動極速快照恢復數據
下面以使用數據安全的云盤刪除中創建的自動極速快照為例,介紹如何使用云盤刪除時創建的自動極速快照在應用中恢復數據。
極速快照的VolumeSnapshot默認位于default命名空間中,當應用部署在非default命名空間時,您需要在應用所在的命名空間中創建新的VolumeSnapshot資源用于恢復數據。本文MySQL應用示例部署在autosnapshot命名空間中,您就需要在該空間中創建對應的VolumeSnapshot。
使用以下命令,查詢自動極速快照對應的VolumeSnapshotContent中snapshotHandle字段的值。
kubectl get volumesnapshotcontent d-2zeit7uza22vjya1****-delprotect-content -oyaml | grep snapshotHandle
預期輸出:
snapshotHandle: s-2zegw6gmuc866xgc****
使用以下YAML內容,創建新的VolumeSnapshotContent,并預綁定即將創建的VolumeSnapshot。
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotContent metadata: name: datasafe-volumesnapshotcontent spec: deletionPolicy: Retain driver: diskplugin.csi.alibabacloud.com source: snapshotHandle: s-2zegw6gmuc866xgc**** # 源VolumeSnapshotContent中snapshotHandle字段的值。 volumeSnapshotRef: name: datasafe-volumesnapshot # 即將創建的VolumeSnapshot名稱。 namespace: autosnapshot # MySQL應用所在命名空間。
使用以下YAML內容,在MySQL應用所在的命名空間中創建對應的VolumeSnapshot。
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: datasafe-volumesnapshot namespace: autosnapshot spec: source: volumeSnapshotContentName: datasafe-volumesnapshotcontent
使用以下YAML內容,根據自動極速快照名稱創建PVC。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: essd-pvc # 使用MySQL應用中定義的PVC名稱。 namespace: autosnapshot spec: accessModes: [ "ReadWriteOnce" ] storageClassName: alicloud-datasafe-essd resources: requests: storage: 30Gi dataSource: name: datasafe-volumesnapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io
執行以下命令,將MySQL應用副本恢復至1。
kubectl scale sts/mysql-sts -n autosnapshot --replicas=1
執行以下命令,確認PVC已成功綁定到MySQL應用中。
kubectl describe pvc essd-pvc -n autosnapshot | grep "Used By"
預期輸出:
Used By: mysql-sts-0
執行以下命令,進入MySQL應用容器。
kubectl -n autosnapshot exec -it mysql-sts-0 -- /bin/sh
執行以下命令,查看模擬寫入的數據是否已經恢復。
ls /var/lib/mysql/mysql -l | grep record
預期輸出:
-rw-r--r-- 1 root root 1048576000 Nov 8 02:36 record.txt
預期輸出數據大小
1048576000
和MySQL應用中模擬寫入數據的大小一致,說明數據已完成恢復。