当云盘在线扩容引发数据损坏或云盘非预期删除导致数据丢失时,您可以通过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类型云盘数据卷删除前的自动极速快照功能,将创建的云盘快照保留一段时间,用于恢复云盘非预期删除的数据。
使用效果
- 云盘扩容失败时,能通过云盘极速快照完整地恢复数据。
- 非预期删除云盘时,能通过云盘极速快照完整地恢复数据。
- 云盘极速快照秒级创建,降低了在线扩容或删除操作所需的时间。说明 极速快照仅支持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云盘扩容前自动创建极速快照功能,保证数据安全。
默认值为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应用中模拟写入数据的大小一致,说明数据已完成恢复。
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家
阿里云企业补贴进行中: 马上申请
腾讯云限时活动1折起,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠
转转请注明出处:https://www.yunxiaoer.com/156788.html