すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ディスクボリュームのデータセキュリティに関するベストプラクティス

最終更新日:Nov 14, 2024

ESSDが誤って削除されたためにデータが失われた場合は、ESSDのインスタントアクセス (IA) スナップショットを使用して、ESSD内のデータを復元できます。 このトピックでは、IAスナップショットを使用してESSDのデータを復元する方法について説明します。

前提条件

  • Kubernetes 1.20以降を実行するContainer Service for Kubernetes (ACK) が作成されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。

  • Elastic Compute Service (ECS) コンソールにログインし、クラスターがデプロイされているリージョンを選択します。 ECSスナップショットサービスが有効になっていることを確認します。 詳細については、「ECSスナップショットの有効化」をご参照ください。

  • csi-pluginとcsi-provisionerのバージョンは1.24.4-7371f039-aliyun以降です。 csi-pluginとcsi-provisionerを更新する方法の詳細については、「CSIプラグインの管理」をご参照ください。

シナリオ

偶発的なESSDの削除によりデータ損失が発生します

ESSDの再利用ポリシーが [削除] の場合、ESSDのマウントに使用される永続ボリューム要求 (PVC) を削除すると、関連する永続ボリューム (PV) とESSDも削除されます。 ディスクを誤って削除した場合、ディスクのスナップショットを使用して、スナップショットが作成された時点にディスクデータを復元できます。 スナップショットが作成されていない場合、ディスクデータを復元できません。 スナップショットの作成後にディスクに書き込まれたデータを復元することはできません。

誤ってESSDを削除したときにディスクデータを復元できるようにするため、ACKはディスクを削除する前にESSDのIAスナップショットを自動的に作成できます。 ACKによって作成されたIAスナップショットは、特定の期間保持されます。 これにより、ACKによって作成されたIAスナップショットを使用してESSDのデータを復元できます。

メリット

  • ディスクが誤って削除された場合は、ディスクのIAスナップショットを使用してディスクデータを復元できます。

  • IAスナップショットは数秒以内に作成できるため、IAスナップショット機能は削除操作に影響しません。

    説明

    ESSDのみがIAスナップショットをサポートしています。

設定

csi-provisionerの設定

次のコマンドを実行して、kube-system名前空間のcsi-provisionerのcontainersパラメーターに次の環境変数を追加します。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"}]}]}}}}'
説明

ACKは、VOLUME_DEL_AUTO_SNAPtrueに設定した場合にのみ、ディスクを削除する前にESSDのIAスナップショットを自動的に作成できます。

StorageClassの構成

次のテンプレートに基づいてStorageClassを作成します。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alicloud-datasafe-essd
provisioner: diskplugin.csi.alibabacloud.com
parameters:
  type: cloud_essd
  volumeDeleteSnapshotRetentionDays: "3"   # This setting takes effect only when the reclaimPolicy parameter is set to "Delete". 
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
allowVolumeExpansion: true

パラメーター

説明

volumeDeleteSnapshotRetentionDays

ESSDが拡張される前に自動的に作成されるIAスナップショットをシステムが保持する日数。

このパラメーターを空のままにすると、システムはIAスナップショットを作成できません。 このパラメーターを設定することを推奨します。

IAスナップショットの作成

このセクションでは、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  # Use the StorageClass that you created in the previous section. 
    ---
    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

    マウントされたESSDのIDはd-2zeit7uza22vjya1 **** です。

  4. 次のコマンドを実行して、MySQLアプリケーションのコンテナーにアクセスします。

    kubectl -n autosnapshot exec -it mysql-sts-0 -- /bin/sh
  5. コンテナーのシェルで次のコマンドを実行して、コンテナーにデータを書き込みます。

    dd if=/dev/urandom of=/var/lib/mysql/mysql/record.txt bs=1M count=1000
  6. 次のコマンドを実行して、コンテナーに書き込まれるデータのサイズを照会します。

    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. 次のコマンドを実行して、IAスナップショット用に作成されたVolumeSnapshotを照会します。

    kubectl get volumesnapshot

    期待される出力:

    d-2zeit7uza22vjya1****-delprotect                   true                                d-2zeit7uza22vjya1****-delprotect-content   30Gi                               d-2zeit7uza22vjya1****-delprotect-content          6s             6s

    次のリストでは、上記の出力のいくつかのパラメーターについて説明します。

    • d-2zeit7uza22vjya1 ****: 削除されたESSDのID。 このIDは、ESSD-pvc PVCを使用してマウントされたessdのIDと同じです。

    • d-2zeit7uza22vjya1 ****-delprotect: IAスナップショット用に作成されたVolumeSnapshotの名前。

    • d-2zeit7uza22vjya1 ****-delprotect-content: IAスナップショット用に作成されたVolumeSnapshotContentの名前。

ディスクの削除後にIAスナップショットを使用してデータを復元する

このセクションでは、以前の [ディスクの削除] セクションで作成されたIAスナップショットを使用して、ディスクの削除後にディスクデータを復元します。

説明

デフォルトでは、IAスナップショット用に作成された元のVolumeSnapshotはデフォルトの名前空間に属します。 アプリケーションが別の名前空間にデプロイされている場合は、IAスナップショットの名前空間にVolumeSnapshotを作成する必要があります。 この例では、MySQLアプリケーションはautosapshot名前空間にデプロイされています。 自動スナップショット名前空間にVolumeSnapshotを作成する必要があります。

  1. 次のコマンドを実行して、IAスナップショット用に作成された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****   # Set to the value of the snapshotHandle parameter of the original VolumeSnapshotContent. 
      volumeSnapshotRef:
        name: datasafe-volumesnapshot       # The name of the VolumeSnapshot to be created. 
        namespace: autosnapshot             # The namespace in which the MySQL application is deployed. 
  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を作成します。 テンプレートは、使用するVolumeSnapshotを指定します。

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: essd-pvc       # Set to the name of the PVC used by the MySQL application. 
      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が返されます。 サイズは、以前にコンテナに書き込んだデータのサイズと同じです。 これは、データの復元が成功したことを示します。