当云盘非预期删除导致数据丢失时,您可以通过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应用中模拟写入数据的大小一致,说明数据已完成恢复。