云盘存储数据安全最佳实践

当云盘非预期删除导致数据丢失时,您可以通过ESSD类型云盘数据卷的自动极速快照功能,实现数据的快速恢复,以保证存储数据的安全性。本文介绍如何使用ESSD云盘的自动极速快照功能实现云盘存储数据安全。

前提条件

  • 已创建Kubernetes集群,且集群版本为1.20及以上。具体操作,请参见创建ACK托管集群

  • 访问指定地域的ECS控制台,确认已开启云盘快照服务。具体操作,请参见开通快照

  • 确保CSI-Plugin和CSI-Provisioner组件版本不低于v1.24.4-7371f039-aliyun。关于升级CSI-Plugin和CSI-Provisioner组件的具体操作,请参见管理CSI组件

使用场景

云盘非预期删除导致的数据丢失

云盘回收策略为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_SNAPtrue时,允许使用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类型云盘自动创建极速快照功能保护并恢复数据。

  1. 使用以下内容,创建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
  2. 执行以下命令,部署MySQL应用。

    kubectl apply -f mysql.yaml
  3. 执行以下命令,确认MySQL应用已挂载对应的云盘存储卷。

    kubectl get pvc -nautosnapshot | grep essd-pvc

    预期输出:

    essd-pvc   Bound    d-2zeit7uza22vjya1****   25Gi       RWO            alicloud-datasafe-essd   54s

    其中, d-2zeit7uza22vjya1****为已挂载成功的ESSD云盘实例ID。

  4. 执行以下命令,进入MySQL应用容器。

    kubectl -n autosnapshot exec -it mysql-sts-0 -- /bin/sh
  5. 在容器Shell中执行以下命令,模拟数据写入。

    dd if=/dev/urandom of=/var/lib/mysql/mysql/record.txt bs=1M count=1000
  6. 在容器Shell中执行以下命令,查看写入数据的大小。

    ls /var/lib/mysql/mysql -l | grep record

    预期输出:

    -rw-r--r-- 1 root  root  1048576000 Nov  8 02:36 record.txt

数据安全的云盘删除

  1. 执行以下命令,将MySQL应用副本缩减为0。

    kubectl scale sts/mysql-sts -n autosnapshot --replicas=0
  2. 执行以下命令,删除MySQL应用所使用的PVC。

    kubectl delete pvc essd-pvc -n autosnapshot
  3. 执行以下命令,查询自动极速快照相关的集群资源。

    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。

  1. 使用以下命令,查询自动极速快照对应的VolumeSnapshotContent中snapshotHandle字段的值。

    kubectl get volumesnapshotcontent d-2zeit7uza22vjya1****-delprotect-content -oyaml | grep snapshotHandle

    预期输出:

    snapshotHandle: s-2zegw6gmuc866xgc****
  2. 使用以下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应用所在命名空间。
  3. 使用以下YAML内容,在MySQL应用所在的命名空间中创建对应的VolumeSnapshot。

    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: datasafe-volumesnapshot
      namespace: autosnapshot
    spec:
      source:
        volumeSnapshotContentName: datasafe-volumesnapshotcontent
  4. 使用以下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
  5. 执行以下命令,将MySQL应用副本恢复至1。

    kubectl scale sts/mysql-sts -n autosnapshot --replicas=1
  6. 执行以下命令,确认PVC已成功绑定到MySQL应用中。

    kubectl describe pvc essd-pvc -n autosnapshot | grep "Used By"

    预期输出:

    Used By:     mysql-sts-0
  7. 执行以下命令,进入MySQL应用容器。

    kubectl -n autosnapshot exec -it mysql-sts-0 -- /bin/sh
  8. 执行以下命令,查看模拟写入的数据是否已经恢复。

    ls /var/lib/mysql/mysql -l | grep record

    预期输出:

    -rw-r--r-- 1 root  root  1048576000 Nov  8 02:36 record.txt

    预期输出数据大小1048576000和MySQL应用中模拟写入数据的大小一致,说明数据已完成恢复。