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_SNAP
をtrue
に設定した場合にのみ、ディスクを削除する前に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がマウントされています。
次の要件に基づいて、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
次のコマンドを実行して、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
マウントされたESSDのIDは
d-2zeit7uza22vjya1 ****
です。次のコマンドを実行して、MySQLアプリケーションのコンテナーにアクセスします。
kubectl -n autosnapshot exec -it mysql-sts-0 -- /bin/sh
コンテナーのシェルで次のコマンドを実行して、コンテナーにデータを書き込みます。
dd if=/dev/urandom of=/var/lib/mysql/mysql/record.txt bs=1M count=1000
次のコマンドを実行して、コンテナーに書き込まれるデータのサイズを照会します。
ls /var/lib/mysql/mysql -l | grep record
期待される出力:
-rw-r--r-- 1 root root 1048576000 Nov 8 02:36 record.txt
ディスクの削除
次のコマンドを実行して、MySQLアプリケーションのレプリケートされたポッドの数を0に減らします。
kubectl scale sts/mysql-sts -n autosnapshot --replicas=0
次のコマンドを実行して、MySQLアプリケーションで使用されるPVCを削除します。
kubectl delete pvc essd-pvc -n autosnapshot
次のコマンドを実行して、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を作成する必要があります。
次のコマンドを実行して、IAスナップショット用に作成された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**** # 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.
次のYAMLテンプレートを使用して、MySQLアプリケーションがデプロイされている名前空間にVolumeSnapshotを作成します。
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: datasafe-volumesnapshot namespace: autosnapshot spec: source: volumeSnapshotContentName: datasafe-volumesnapshotcontent
次の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
次のコマンドを実行して、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
が返されます。 サイズは、以前にコンテナに書き込んだデータのサイズと同じです。 これは、データの復元が成功したことを示します。