7.3. ボリュームスナップショットについて
論理ボリュームマネージャー (LVM) シンボリュームでボリュームスナップショットを使用すると、MicroShift クラスターで実行されているアプリケーションからのデータ損失を防ぐことができます。MicroShift は、論理ボリュームマネージャーストレージ (LVMS) Container Storage Interface (CSI) プロバイダーのみをサポートします。
LVMS は、WaitForFirstConsumer
に設定されているストレージクラスの volumeBindingMode
のみをサポートします。この設定では、Pod がストレージボリュームをマウントする準備ができるまで、ストレージボリュームがプロビジョニングされません。
単一 Pod および PVC をデプロイするワークロードの例
$ oc apply -f - <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: test-claim-thin spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: topolvm-provisioner-thin --- apiVersion: v1 kind: Pod metadata: name: base spec: containers: - command: - nginx - -g - 'daemon off;' image: registry.redhat.io/rhel8/nginx-122@sha256:908ebb0dec0d669caaf4145a8a21e04fdf9ebffbba5fd4562ce5ab388bf41ab2 name: test-container securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL volumeMounts: - mountPath: /vol name: test-vol securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault volumes: - name: test-vol persistentVolumeClaim: claimName: test-claim-thin EOF
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
- レプリケーションコントローラーで管理されている Pod 上のレプリカ数をゼロにスケールします。カウントをゼロに設定すると、新しい Pod が削除されたときにすぐに新しい Pod が作成されなくなります。
ボリュームへの書き込みがすべて停止したら、以下のようなコマンドを実行します。独自の設定情報を挿入します。
スナップショット設定の例
# oc apply -f <<EOF apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot 1 metadata: name: <snapshot_name> 2 spec: volumeSnapshotClassName: topolvm-snapclass 3 source: persistentVolumeClaimName: test-claim-thin 4 EOF
次のコマンドを実行して、ストレージドライバーがスナップショットの作成を完了するのを待ちます。
$ oc wait volumesnapshot/<snapshot_name> --for=jsonpath\='{.status.readyToUse}=true'
次のステップ
-
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}'
以下のコマンドを使用して、前のステップで取得した名前を挿入して、ストレージバックエンドで作成したボリュームの一意の ID を取得します。
$ oc get volumesnapshotcontent snapcontent-<retrieved_volume_identity> -o 'jsonpath={.status.snapshotHandle}'
次のコマンドを実行して、前の手順で取得したボリュームの一意 ID を使用してスナップショットを表示し、どのボリュームをバックアップするかを決定します。
$ sudo lvdisplay <retrieved_snapshot_handle>
出力例
--- Logical volume --- LV Path /dev/rhel/732e45ff-f220-49ce-859e-87ccca26b14c LV Name 732e45ff-f220-49ce-859e-87ccca26b14c VG Name rhel LV UUID 6Ojwc0-YTfp-nKJ3-F9FO-PvMR-Ic7b-LzNGSx LV Write Access read only LV Creation host, time rhel-92.lab.local, 2023-08-07 14:45:26 -0500 LV Pool name thinpool LV Thin origin name a2d2dcdc-747e-4572-8c83-56cd873d3b07 LV Status available # open 0 LV Size 1.00 GiB Mapped size 1.04% Current LE 256 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:11
以下のコマンドを実行して、LV のマウントに使用するディレクトリーを作成します。
$ sudo mkdir /mnt/snapshot
次のコマンドを実行して、取得したスナップショットハンドルのデバイス名を使用して LV をマウントします。
$ sudo mount /dev/<retrieved_snapshot_handle> /mnt/snapshot
次のコマンドを実行して、マウントされた場所からファイルをコピーし、安全な場所に保存します。
$ sudo cp -r /mnt/snapshot <destination>
7.3.3. ボリュームスナップショットの復元
以下のワークフローは、スナップショットの復元を示しています。この例では、ソースの永続ボリューム要求 (PVC) に書き込まれたデータが保存され、新しい PVC に復元されることを確認するための検証手順も示されています。
スナップショットは、スナップショットのソースボリュームと全く同じサイズの PVC に復元される必要があります。より大きな PVC が必要な場合は、スナップショットが正常に復元された後に PVC のサイズを変更できます。
手順
次のコマンドを入力して、
VolumeSnapshot
オブジェクトを永続ボリューム要求のデータソースとして指定して、スナップショットを復元します。$ oc apply -f <<EOF apiVersion: v1 kind: PersistentVolumeClaim metadata: name: snapshot-restore spec: accessModes: - ReadWriteOnce dataSource: apiGroup: snapshot.storage.k8s.io kind: VolumeSnapshot name: my-snap resources: requests: storage: 1Gi storageClassName: topolvm-provisioner-thin --- apiVersion: v1 kind: Pod metadata: name: base spec: containers: - command: - nginx - -g - 'daemon off;' image: registry.redhat.io/rhel8/nginx-122@sha256:908ebb0dec0d669caaf4145a8a21e04fdf9ebffbba5fd4562ce5ab388bf41ab2 name: test-container securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL volumeMounts: - mountPath: /vol name: test-vol securityContext: runAsNonRoot: true seccompProfile: type: RuntimeDefault volumes: - name: test-vol persistentVolumeClaim: claimName: snapshot-restore EOF
検証
Pod が
Ready
状態になるまで待機します。$ oc wait --for=condition=Ready pod/base
- 新規 Pod の準備ができたら、スナップショット内でアプリケーションのデータが正しいことを確認します。
関連情報
7.3.4. ボリュームスナップショットの削除
MicroShift によるボリュームスナップショットの削除方法を設定できます。
手順
以下の例のように、
VolumeSnapshotClass
オブジェクトで必要な削除ポリシーを指定します。volumesnapshotclass.yaml
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: csi-hostpath-snap driver: hostpath.csi.k8s.io deletionPolicy: Delete 1
- 1
- ボリュームスナップショットの削除時に
Delete
値を設定すると、VolumeSnapshotContent
オブジェクトと共に基礎となるスナップショットが削除されます。Retain
値を設定すると、基礎となるスナップショットとVolumeSnapshotContent
オブジェクトの両方が残ります。Retain
値を設定し、対応するVolumeSnapshotContent
オブジェクトを削除せずにVolumeSnapshot
オブジェクトを削除すると、コンテンツは残ります。スナップショット自体はストレージバックエンドにも保持されます。
以下のコマンドを入力してボリュームスナップショットを削除します。
$ oc delete volumesnapshot <volumesnapshot_name>
出力例
volumesnapshot.snapshot.storage.k8s.io "mysnapshot" deleted
削除ポリシーが
Retain
に設定されている場合は、以下のコマンドを入力してボリュームスナップショットのコンテンツを削除します。$ oc delete volumesnapshotcontent <volumesnapshotcontent_name>
オプション:
VolumeSnapshot
オブジェクトが正常に削除されていない場合は、以下のコマンドを実行して残されているリソースのファイナライザーを削除し、削除操作を続行できるようにします。重要永続ボリューム要求またはボリュームスナップショットのコンテンツのいずれかから
VolumeSnapshot
オブジェクトへの既存の参照がない場合にのみファイナライザーを削除します。--force
オプションを使用する場合でも、すべてのファイナライザーが削除されるまで削除操作でスナップショットオブジェクトは削除されません。$ oc patch -n $PROJECT volumesnapshot/$NAME --type=merge -p '{"metadata": {"finalizers":null}}'
出力例
volumesnapshotclass.snapshot.storage.k8s.io "csi-ocs-rbd-snapclass" deleted
ファイナライザーが削除され、ボリュームスナップショットが削除されます。