ディスクからボリュームスナップショットを作成してアプリケーションデータをバックアップし、ボリュームスナップショットからアプリケーションデータを復元できます。 Container Service for Kubernetes (ACK) クラスターで複数のディスクが使用されている場合、VolumeSnapshotリソースを使用して、各ディスクからボリュームスナップショットを作成できます。 ただし、スナップショットは同時に作成されない可能性があり、スナップショット間でデータの不一致が発生する可能性があります。 この場合、ディスクからグループスナップショットを作成して、ディスク上のデータを一元的に管理およびバックアップできます。 これにより、非同期ボリューム作成によるデータの不整合のリスクを軽減できます。
前提条件
Kubernetes 1.28以降を実行するACKマネージドクラスターが作成されます。 詳細については、「ACK管理クラスターの作成」をご参照ください。
Container Storage Interface (CSI) プラグインがクラスターにインストールされており、CSIプラグインのバージョンは1.31.4以降です。 csi-pluginおよびcsi-provisionerを更新する方法の詳細については、「csi-pluginおよびcsi-provisionerの更新」をご参照ください。
説明ACKで廃止されたFlexVolumeをクラスターが使用している場合は、FlexVolumeからCSIにアップグレードし、グループスナップショットを作成します。 詳細については、「FlexVolumeからCSIへのアップグレード」をご参照ください。 ACKコンソールのクラスター詳細ページに移動します。 左側のナビゲーションウィンドウで、 を選択します。 次に、[ストレージ] タブをクリックして、クラスターにインストールされているボリュームプラグインのタイプを確認します。
Elastic Compute Service (ECS) スナップショットサービスが有効化されています。 ECSスナップショットサービスを無料で有効化できます。 作成したスナップショットに対してのみ課金されます。 詳細については、「ECSスナップショットの有効化」をご参照ください。
課金
グループスナップショットは、ECSのsnapshot-consistent Group機能に基づいて実装されます。 スナップショット一貫性グループは無料ですが、スナップショット一貫性グループ内のスナップショットは、スナップショットによって消費されたストレージ容量に基づいて課金されます。 詳細については、「スナップショット課金」をご参照ください。
制限事項
グループスナップショットとECSスナップショットにも同じ制限が適用されます。 詳細については、「制限事項」をご参照ください。
使用上の注意
ACKは、グループスナップショットを管理するカスタムリソースを作成するために使用できる次のCustomResourceDefinitions (CRD) を提供します。
CRD | 説明 |
VolumeGroupSnapshotClass | 削除ポリシーなど、VolumeGroupSnapshotの作成に使用するパラメーターを指定します。 |
VolumeGroupSnapshot | ボリュームグループのスナップショットの要求。 VolumeGroupSnapshotは、バックアップするディスクを指定します。 |
VolumeGroupSnapshotContent | ECSスナップショット整合性グループに関する情報を記録します。 |
VolumeSnapshot | ボリュームスナップショットの要求。 VolumeGroupSnapshotを作成すると、同時にバックアップするディスクに対してVolumeSnapshotのグループが自動的に作成されます。 |
VolumeSnapshotContent | ECSスナップショットに関する情報を記録します。 |
VolumeGroupSnapshotClassはStorageClassに似ています。 VolumeGroupSnapshotは、永続ボリュームクレーム (PVC) に似ています。 VolumeGroupSnapshotContentは、永続ボリューム (PV) に似ています。 VolumeGroupSnapshotを作成した後、CSIはECSスナップショット一貫性グループを作成し、VolumeSnapshotsとVolumeSnapshotContentsのグループを自動的に生成します。 ディスクでエラーが発生した場合は、ディスクをバックアップするVolumeSnapshotを使用して、ディスク上のデータを復元できます。
例:
1. グループスナップショットに関連する機能ゲートを有効にする
グループスナップショットを作成する前に、EnableVolumeGroupSnapshots機能ゲートを有効にする必要があります。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、 を選択します。
[アドオン] ページで、csi-provisionerカードを見つけ、csi-provisionerカードの右下隅にある [設定] をクリックします。
csi-provisionerのパラメーターダイアログボックスで、FeatureGateフィールドに
EnableVolumeGroupSnapshots=trueを指定し、OKをクリックします。他のフィーチャゲートが有効になっている場合は、FeatureGateフィールドを
xxxxxx=true、yyyyy=false、EnableVolumeGroupSnapshots=true形式に設定します。
2. MySQLアプリケーションの作成
mysql.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。
MySQLをデプロイするステートフルなアプリケーションを作成します。
kubectl apply -f mysql.yamlMySQLアプリケーションの2つのポッドレプリカにデータを書き込みます。
mysql-0ポッドにログインし、MySQLデータベースに接続します。
kubectl exec -it mysql-0 -- bash # Log on to the pod. mysql -uroot -p123456 # Connect to the MySQL database.次のコマンドを実行して、データベースにデータを書き込みます。
create database test; use test; create table scores( name VARCHAR(50) NOT NULL, score INT AUTO_INCREMENT PRIMARY KEY ); insert into scores(name,score) values("Amy",95); select * from scores;期待される出力:
+------+-------+ | name | score | +------+-------+ | Amy | 95 | +------+-------+上記の操作を再度実行して、mysql-1ポッドにデータを書き込みます。
3. MySQLアプリケーションのグループスナップショットの作成
VolumeGroupSnapshotClassを作成します。
alibabacloud-disk-group-snapshotという名前のデフォルトのVolumeGroupSnapshotClassがクラスターに作成されます。 次のgroup-snapshot-class-demo.yamlファイルを使用して、カスタムVolumeGroupSnapshotClassを作成できます。
apiVersion: groupsnapshot.storage.k8s.io/v1alpha1 kind: VolumeGroupSnapshotClass metadata: name: group-snapshot-class-demo deletionPolicy: Delete driver: diskplugin.csi.alibabacloud.comdeletionPolicyパラメーターの有効な値:削除: VolumeGroupSnapshotを削除すると、VolumeGroupSnapshotContentと関連するグループスナップショットも削除されます。保持: VolumeGroupSnapshotを削除すると、VolumeGroupSnapshotContentと関連するグループスナップショットが保持されます。
説明ECSスナップショット整合性グループの有効期限を設定することはできません。 グループスナップショットを手動で削除する必要があります。
VolumeGroupSnapshotClassを作成します。
kubectl apply -f group-snapshot-class-demo.yaml次のgroup-snapshot-demo.yamlファイルを使用して、MySQLアプリケーションにマウントされた2つのディスクボリュームからグループスナップショットを作成します。
apiVersion: groupsnapshot.storage.k8s.io/v1alpha1 kind: VolumeGroupSnapshot metadata: name: group-snapshot-demo namespace: default spec: source: selector: matchLabels: app: mysql volumeGroupSnapshotClassName: group-snapshot-class-demosource.selector: バックアップ用のPVCを選択するためにVolumeGroupSnapshotが使用するラベルセレクタ。volumeClaimTemplatesセクションのパラメーターに基づいて作成されたPVCに、PVCがマウントされているアプリケーションを示すラベルが追加されます。 他の方法を使用してアプリケーションで使用されるPVCを作成する場合は、手動でPVCにラベルを追加して、PVCがマウントされているアプリケーションを示す必要があります。
グループスナップショットを作成します。
kubectl apply -f group-snapshot-demo.yaml
4. グループスナップショットが作成されているかどうかを確認する
VolumeGroupSnapshotsを照会します。 VolumeGroupSnapshotsが作成されている場合は、作成されるまで待ちます。
kubectl get vgs group-snapshot-demo -wREADYTOUSEパラメーターの値がfalseからtrueに変更された場合、グループスナップショットが作成されます。バックアップされたPVCと、バックアップPVCごとに作成されたVolumeSnapshotを照会します。
kubectl describe vgs group-snapshot-demo期待される出力:
Status: Bound Volume Group Snapshot Content Name: groupsnapcontent-adcef6ef-811a-4e9d-ba51-3927caxxxxxx Creation Time: 2024-11-27T06:02:56Z Pvc Volume Snapshot Ref List: Persistent Volume Claim Ref: Name: disk-mysql-0 Volume Snapshot Ref: Name: snapshot-1c2c5bcaf47ee2bffcc5b2f52dff65a4aacaaea38032c05d75acd536f7xxxxxx-2024-11-27-6.4.7 Persistent Volume Claim Ref: Name: disk-mysql-1 Volume Snapshot Ref: Name: snapshot-37a2fbf634d68cd2103f261313c2ed781fbd2bd52b5a0d0e0c0ef7c339xxxxxx-2024-11-27-6.4.9パラメーター
説明
バインドされたボリュームグループのスナップショットコンテンツ名VolumeGroupSnapshotにバインドされたVolumeGroupSnapshotContent。
PvcボリュームスナップショットRef ListPVCに関連付けられたVolumeSnapshot。 以下のパラメータが表示されます。
Persistent Volume Claim Ref: バックアップPVCの名前。Volume Snapshot Ref: PVC用に作成されたVolumeSnapshotの名前。
作成されたVolumeSnapshotsを照会します。
kubectl get volumesnapshot \期待される出力:
snapshot-1c2c5bcaf47ee2bffcc5b2f52dff65a4aacaaea38032c05d75acd536f7xxxxxx-2024-11-27-6.4.7 \ snapshot-37a2fbf634d68cd2103f261313c2ed781fbd2bd52b5a0d0e0c0ef7c339xxxxxx-2024-11-27-6.4.92つのVolumeSnapshotの
READYTOUSEパラメーターの値が両方ともtrueの場合、VolumeSnapshotが作成されます。作成されたECSスナップショット整合性グループを照会します。
kubectl describe vgsc groupsnapcontent-adcef6ef-811a-4e9d-ba51-3927caxxxxxx期待される出力:
Volume Group Snapshot Handle: ssg-2zeg72d1qym6vnxxxxxxECS コンソールに移動します。 左側のナビゲーションウィンドウで、[ストレージとスナップショット] > [スナップショット] を選択します。 [スナップショット整合性グループ] タブで、検索ボックスに
ssg-2zeg72d1qym6vnxxxxxx(上記の出力で返されたスナップショット整合性グループID) を入力し、検索アイコンをクリックします。 作成されたスナップショット整合性グループを表示できます。
5. スナップショットからディスクボリュームを復元する
ディスクボリュームを1つずつ手動で復元するか、スナップショットからディスクボリュームを1つのバッチで復元するスクリプトを実行することができます。
手動でディスクボリュームを1つずつ復元する
disk-mysql-0ポッドにマウントされているディスクボリュームを復元する例を次に示します。
disk-mysql-0-copy.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。 このファイルは、ディスクボリュームをプロビジョニングできるPVCを作成するために使用されます。 CSIは、PVCに基づいて新しいディスクを自動的に作成します。 ディスクには、disk-mysql-0ポッドに接続されているディスクと同じデータが格納されます。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: disk-mysql-0-copy spec: volumeMode: Filesystem accessModes: - ReadWriteOnce resources: requests: storage: 20Gi storageClassName: "alicloud-disk-essd" dataSource: # The VolumeSnapshot created for the PVC mounted to the disk-mysql-0 pod. name: snapshot-1c2c5bcaf47ee2bffcc5b2f52dff65a4aacaaea38032c05d75acd536f7xxxxxx-2024-11-27-6.4.7 kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.ioディスクボリュームを復元します。
kubectl apply -f disk-mysql-0-copy.yaml作成されたPVCを照会します。
kubectl get pvc disk-mysql-0-copy期待される出力:
disk-mysql-0-copy Bound d-2ze0iwwqg0s6b0xxxxxx 20Gi RWO alicloud-disk-essd <unset> 69sECS コンソールに移動します。 左側のナビゲーションウィンドウで、[ストレージとスナップショット] > [ストレージのブロック] を選択します。 [クラウドディスク] タブで、検索ボックスに
d-2ze0iwwqg0s6b0xxxxxx(上記の出力で返されたディスクID) を入力し、検索アイコンをクリックします。 作成されたディスクを表示できます。 ディスクIDをクリックして、ディスクの詳細ページに移動します。 ディスクがスナップショットから作成されていることがわかります。
スナップショットからディスクボリュームを1回のバッチで復元するためのスクリプトの実行
次の例では、グループスナップショットを使用して、MySQLアプリケーションにマウントされたPVCを1回のバッチで復元する方法について説明します。
MySQLアプリケーションによってプロビジョニングされたポッドレプリカの数をゼロにスケーリングします。
kubectl scale sts mysql --replicas=0MySQLアプリケーションにマウントされている2つのディスクボリュームを削除します。
kubectl delete pvc data-mysql-0 data-mysql-1次の内容を使用してgenerate_pvc.shという名前のスクリプトを作成し、そのスクリプトを使用してスナップショットからPVCを順番に展開するYAMLファイルを作成します。
最初にjqコマンドラインツールをインストールする必要があります。
次の表に、generate_pvc.shスクリプトの入力パラメーターを示します。
入力パラメータ
説明
例
1
VolumeGroupSnapshotが属する名前空間。
default
2
VolumeGroupSnapshotの名前。
group-snapshot-デモ
3
StorageClassの名前。
alicloud-disk-essd
4
ディスク容量。
20Gi
5
kubeconfigファイルのパス。
. kube/config (デフォルト)
6
生成されたPVC YAMLファイルのパス。
. /output.yaml
スナップショットから作成されたPVCのYAMLファイルを生成します。
bash generate_pvc.sh default group-snapshot-demo alicloud-disk-essd 20Gi .kube/config ./output.yaml次のYAMLテンプレートに、output.yamlファイルの例を示します。 ビジネス要件に基づいてファイルを編集し、クラスターにファイルをデプロイできます。
--- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: disk-mysql-0 spec: volumeMode: Filesystem accessModes: - ReadWriteOnce resources: requests: storage: 20Gi storageClassName: "alicloud-disk-essd" dataSource: name: snapshot-1c2c5bcaf47ee2bffcc5b2f52dff65a4aacaaea38032c05d75acd536f7adb850-2024-11-27-6.4.7 kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: disk-mysql-1 spec: volumeMode: Filesystem accessModes: - ReadWriteOnce resources: requests: storage: 20Gi storageClassName: "alicloud-disk-essd" dataSource: name: snapshot-37a2fbf634d68cd2103f261313c2ed781fbd2bd52b5a0d0e0c0ef7c3396fea1c-2024-11-27-6.4.9 kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io出力. yamlファイルをクラスターにデプロイして、ディスクのPVCを1つのバッチで復元します。
kubectl apply -f output.yaml
MySQLアプリケーションによってプロビジョニングされたポッドレプリカの数を2つにスケーリングします。
kubectl scale sts mysql --replicas=2アプリケーションの再起動後、データが復元されているかどうかを確認します。
kubectl exec -it mysql-0 -- bash # Log on to the pod. mysql -uroot -p123456 # Run this command in the pod. use test; # Run this command in the database. select * from scores;期待される出力:
+------+-------+ | name | score | +------+-------+ | Amy | 95 | +------+-------+
関連ドキュメント
ディスクボリュームのスナップショットを作成する方法の詳細については、「ディスクボリュームのスナップショットの作成」をご参照ください。