7.3. ボリュームスナップショットについて
論理ボリュームマネージャー (LVM) シンボリュームでボリュームスナップショットを使用すると、MicroShift クラスターで実行されているアプリケーションからのデータ損失を防ぐことができます。MicroShift は、論理ボリュームマネージャーストレージ (LVMS) Container Storage Interface (CSI) プロバイダーのみをサポートします。
LVMS は、WaitForFirstConsumer
に設定されているストレージクラスの volumeBindingMode
のみをサポートします。この設定では、Pod がストレージボリュームをマウントする準備ができるまで、ストレージボリュームがプロビジョニングされません。
単一 Pod および PVC をデプロイするワークロードの例
7.3.1. ボリュームスナップショットの作成 リンクのコピーリンクがクリップボードにコピーされました!
MicroShift ストレージボリュームのスナップショットを作成するには、まず RHEL for Edge とクラスターを設定する必要があります。以下の手順例では、ソースボリュームがマウントされている Pod が削除されます。Pod を削除すると、スナップショットの作成時にデータが Pod に書き込まれないようにします。実行可能なスナップショットを作成するには、スナップショット中にデータが書き込まれていない点を確認することが重要です。
前提条件
- MicroShift クラスターへの root アクセス権がある。
- MicroShift クラスターが実行されている。
- デバイスクラスが LVM シンプールを定義している。
-
volumeSnapshotClass
がdriver: topolvm.io
を指定している。 - ソース PVC に割り当てられたワークロードは一時停止または削除されている。これにより、データの破損を回避できます。
スナップショットの作成時には、ボリュームへの書き込みをすべて停止する必要があります。書き込みを停止しないと、データが破損する可能性があります。
手順
次の 2 つの手順のいずれかを使用して、スナップショットの作成中にデータがボリュームに書き込まれないようにします。
次のコマンドを実行して、Pod を削除し、スナップショット中にデータがボリュームに書き込まれないようにします。
oc delete my-pod
$ oc delete my-pod
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - レプリケーションコントローラーで管理されている Pod 上のレプリカ数をゼロにスケールします。カウントをゼロに設定すると、新しい Pod が削除されたときにすぐに新しい Pod が作成されなくなります。
ボリュームへの書き込みがすべて停止したら、以下のようなコマンドを実行します。独自の設定情報を挿入します。
スナップショット設定の例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、ストレージドライバーがスナップショットの作成を完了するのを待ちます。
oc wait volumesnapshot/<snapshot_name> --for=jsonpath\='{.status.readyToUse}=true'
$ oc wait volumesnapshot/<snapshot_name> --for=jsonpath\='{.status.readyToUse}=true'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
次のステップ
-
volumeSnapshot
オブジェクトがReadyToUse
状態にある場合は、今後の PVC 用のボリュームとして復元できます。Pod を再起動するか、レプリカ数を必要な数に戻します。 - ボリュームスナップショットの作成後に、ソース PVC を新規 Pod に再マウントできます。
ボリュームスナップショットは元のデータと同じデバイスにあります。ボリュームスナップショットをバックアップとして使用するには、スナップショットを安全な場所に移動します。
7.3.2. ボリュームスナップショットのバックアップ リンクのコピーリンクがクリップボードにコピーされました!
MicroShift クラスター上で実行されているアプリケーションからのデータのスナップショットは、元のデータと同じデバイス上にある読み取り専用の論理ボリューム (LV) として作成されます。ローカルボリュームを永続ボリューム (PV) としてコピーし、バックアップコピーとして使用する前に、ローカルボリュームを手動でマウントする必要があります。MicroShift ストレージボリュームのスナップショットをバックアップとして使用するには、ローカルホスト上でスナップショットを見つけて、セキュアな場所に移動します。
特定のスナップショットを検索してコピーするには、以下の手順を行います。
前提条件
- ホストマシンへの root アクセス権限がある。
- 既存のボリュームスナップショットがある。
手順
次のコマンドを実行して、ボリュームスナップショットの名前を取得します。
oc get volumesnapshot -n <namespace> <snapshot_name> -o 'jsonpath={.status.volumeSnapshotContentName}'
$ oc get volumesnapshot -n <namespace> <snapshot_name> -o 'jsonpath={.status.volumeSnapshotContentName}'
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- <namespace> と <snapshot_name> は、使用した namespace とスナップショット名に置き換えます。
以下のコマンドを使用して、前のステップで取得した名前を挿入して、ストレージバックエンドで作成したボリュームの一意の ID を取得します。
oc get volumesnapshotcontent snapcontent-<retrieved_volume_identity> -o 'jsonpath={.status.snapshotHandle}'
$ oc get volumesnapshotcontent snapcontent-<retrieved_volume_identity> -o 'jsonpath={.status.snapshotHandle}'
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- <retrieved_volume_identity> はボリューム ID に置き換えます。
次のコマンドを実行して、前の手順で取得したボリュームの一意 ID を使用してスナップショットを表示し、どのボリュームをバックアップするかを決定します。
sudo lvdisplay <retrieved_volume_identity>
$ sudo lvdisplay <retrieved_volume_identity>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- <retrieved_volume_identity> はボリューム ID に置き換えます。
出力例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のコマンドを実行して、LV のマウントに使用するディレクトリーを作成します。
sudo mkdir /mnt/snapshot
$ sudo mkdir /mnt/snapshot
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、取得したスナップショットハンドルのデバイス名を使用して LV をマウントします。
sudo mount /dev/<retrieved_snapshot_handle> /mnt/snapshot
$ sudo mount /dev/<retrieved_snapshot_handle> /mnt/snapshot
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- <retrieved_snapshot_handle> は、デバイス名に置き換えます。
次のコマンドを実行して、マウントされた場所からファイルをコピーし、安全な場所に保存します。
sudo cp -r /mnt/snapshot <destination>
$ sudo cp -r /mnt/snapshot <destination>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- <destination> は、セキュアな場所へのパスに置き換えます。
7.3.3. ボリュームスナップショットの復元 リンクのコピーリンクがクリップボードにコピーされました!
以下のワークフローは、スナップショットの復元を示しています。この例では、ソースの永続ボリューム要求 (PVC) に書き込まれたデータが保存され、新しい PVC に復元されることを確認するための検証手順も示されています。
スナップショットは、スナップショットのソースボリュームと全く同じサイズの PVC に復元される必要があります。より大きな PVC が必要な場合は、スナップショットが正常に復元された後に PVC のサイズを変更できます。
手順
次のコマンドを入力して、
VolumeSnapshot
オブジェクトを永続ボリューム要求のデータソースとして指定して、スナップショットを復元します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
Pod が
Ready
状態になるまで待機します。oc wait --for=condition=Ready pod/base
$ oc wait --for=condition=Ready pod/base
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 新規 Pod の準備ができたら、スナップショット内でアプリケーションのデータが正しいことを確認します。
7.3.4. ボリュームスナップショットの削除 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat build of MicroShift がボリュームスナップショットを削除する方法を設定できます。
手順
以下の例のように、
VolumeSnapshotClass
オブジェクトで必要な削除ポリシーを指定します。volumesnapshotclass.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- ボリュームスナップショットの削除時に
Delete
値を設定すると、VolumeSnapshotContent
オブジェクトと共に基礎となるスナップショットが削除されます。Retain
値を設定すると、基礎となるスナップショットとVolumeSnapshotContent
オブジェクトの両方が残ります。Retain
値を設定し、対応するVolumeSnapshotContent
オブジェクトを削除せずにVolumeSnapshot
オブジェクトを削除すると、コンテンツは残ります。スナップショット自体はストレージバックエンドにも保持されます。
以下のコマンドを入力してボリュームスナップショットを削除します。
oc delete volumesnapshot <volumesnapshot_name>
$ oc delete volumesnapshot <volumesnapshot_name>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- <volumesnapshot_name> は、削除するボリュームスナップショットの名前に置き換えます。
出力例
volumesnapshot.snapshot.storage.k8s.io "mysnapshot" deleted
volumesnapshot.snapshot.storage.k8s.io "mysnapshot" deleted
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 削除ポリシーが
Retain
に設定されている場合は、以下のコマンドを入力してボリュームスナップショットのコンテンツを削除します。oc delete volumesnapshotcontent <volumesnapshotcontent_name>
$ oc delete volumesnapshotcontent <volumesnapshotcontent_name>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- <volumesnapshotcontent_name> は、削除するコンテンツに置き換えます。
オプション:
VolumeSnapshot
オブジェクトが正常に削除されていない場合は、以下のコマンドを実行して残されているリソースのファイナライザーを削除し、削除操作を続行できるようにします。重要永続ボリューム要求またはボリュームスナップショットのコンテンツのいずれかから
VolumeSnapshot
オブジェクトへの既存の参照がない場合にのみファイナライザーを削除します。--force
オプションを使用する場合でも、すべてのファイナライザーが削除されるまで削除操作でスナップショットオブジェクトは削除されません。oc patch -n $PROJECT volumesnapshot/$NAME --type=merge -p '{"metadata": {"finalizers":null}}'
$ oc patch -n $PROJECT volumesnapshot/$NAME --type=merge -p '{"metadata": {"finalizers":null}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例
volumesnapshotclass.snapshot.storage.k8s.io "csi-ocs-rbd-snapclass" deleted
volumesnapshotclass.snapshot.storage.k8s.io "csi-ocs-rbd-snapclass" deleted
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ファイナライザーが削除され、ボリュームスナップショットが削除されます。