当云盘在线扩容引发数据损坏或云盘非预期删除导致数据丢失时,您可以通过ESSD类型云盘数据卷的自动极速快照功能,实现数据的快速恢复,以保证存储数据的安全性。本文介绍如何使用ESSD云盘的自动极速快照功能实现云盘存储数据安全。
前提条件
- 已创建Kubernetes集群,且集群版本为1.20及以上。具体操作,请参见创建Kubernetes托管版集群。
- 访问指定地域的ECS控制台,确认已开启云盘快照服务。具体操作,请参见开通快照。
- 确保CSI-Plugin和CSI-Provisioner组件版本不低于v1.24.4-7371f039-aliyun。关于升级CSI-Plugin和CSI-Provisioner组件的具体操作,请参见安装与升级CSI组件。
使用场景
云盘在线扩容可能引发的数据损坏
随着业务迭代与使用增长,初始为集群Pod挂载的云盘内存容量和性能配置可能不再满足存储需求。您可以通过扩容云盘存储卷增加业务的可用存储空间。从数据保护出发,最稳定的方案是先停止应用层服务、解除挂载目录,然后再进行数据卷扩容。但大部分应用场景并不能容忍业务Pod的暂停。
为保护业务数据,容器服务ACK提供ESSD类型云盘数据卷在线扩容前的自动极速快照功能,以保证文件系统在线扩容造成数据丢失时,您可以通过云盘快照实现云盘存储数据的恢复。
云盘非预期删除导致的数据丢失
云盘回收策略为Delete模式,您在删除PVC时,PV和云盘将同时被删除。当您误删除了某个云盘时,您需要通过已创建的云盘快照将数据恢复到指定的时间点。若云盘快照不存在或快照创建后云盘有新数据写入,都将导致云盘存储数据丢失。
为保护业务数据,容器服务ACK提供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
volumeExpandAutoSnapshot: "forced" # 该设置仅在type为"cloud_essd"时生效。
volumeDeleteSnapshotRetentionDays: "3" # 该设置仅在reclaimPolicy为"Delete"时生效。
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
allowVolumeExpansion: true
参数 |
说明 |
volumeExpandAutoSnapshot |
定义ESSD云盘扩容前自动创建极速快照功能,保证数据安全。
- 扩容成功时,自动删除创建的快照。
- 扩容失败时,保留快照并透出快照ID,默认保留时间为1天。
默认值为 closed。取值如下:
- forced:自动极速快照创建失败时,放弃云盘扩容。
- besteffort:自动极速快照创建失败时报event warning,继续进行云盘扩容。
- closed:不使用云盘扩容自动极速快照功能。
|
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应用中使用的云盘存储卷进行扩容。
kubectl patch pvc essd-pvc -n autosnapshot -p '{"spec":{"resources":{"requests":{"storage":"30Gi"}}}}'
- 执行以下命令,确认扩容成功且自动极速快照功能正常。
kubectl describe pvc essd-pvc -n autosnapshot
部分预期输出:
Capacity: 30Gi
...
Events:
...ControllerExpandVolume:: Snapshot create successful: snapshotName[volume-expand-auto-snapshot-d-2ze9belqefqhdmga****-2022-11-07-21:03:12], sourceId[d-2zeit7uza22vjya1****], snapshotId[s-2ze3pmo5ppaa9stb****]
部分参数说明如下。
sourceId
:扩容的ESSD云盘实例ID,与essd-pvc中绑定的云盘实例ID一致。
snapshotId
:扩容前自动创建的极速快照ID。
- 若云盘扩容成功:您可以在ECS控制台中使用ID搜索该极速快照,显示没有查询到符合条件的数据,说明云盘扩容成功时,该极速快照已自动删除。
- 若云盘扩容失败:该极速快照将被保留,默认保留日期为1天。
数据安全的云盘删除
- 执行以下命令,将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名称。
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应用中模拟写入数据的大小一致,说明数据已完成恢复。