全部產品
Search
文件中心

Container Service for Kubernetes:雲端硬碟儲存資料安全最佳實務

更新時間:Oct 30, 2024

當雲端硬碟非預期刪除導致資料丟失時,您可以通過ESSD類型雲端硬碟資料卷的自動極速快照功能,實現資料的快速恢複,以保證儲存資料的安全性。本文介紹如何使用ESSD雲端硬碟的自動極速快照功能實現雲端硬碟儲存資料安全。

前提條件

  • 已建立Kubernetes叢集,且叢集版本為1.20及以上。具體操作,請參見建立ACK託管叢集

  • 訪問指定地區的ECS控制台,確認已開啟雲端硬碟快照服務。具體操作,請參見開通快照

  • 確保CSI-Plugin和CSI-Provisioner組件版本不低於v1.24.4-7371f039-aliyun。關於升級CSI-Plugin和CSI-Provisioner組件的具體操作,請參見管理CSI組件

使用情境

雲端硬碟非預期刪除導致的資料丟失

雲端硬碟回收策略為Delete模式,您在刪除PVC時,PV和雲端硬碟將同時被刪除。當您誤刪除了某個雲端硬碟時,您需要通過已建立的雲端硬碟快照將資料恢複到指定的時間點。若雲端硬碟快照不存在或快照建立後雲端硬碟有新資料寫入,都將導致雲端硬碟儲存資料丟失。

為保護業務資料,Container ServiceACK提供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應用中類比寫入資料的大小一致,說明資料已完成恢複。