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: VolumeSnapshot1 metadata: name: <snapshot_name>2 spec: volumeSnapshotClassName: topolvm-snapclass3 source: persistentVolumeClaimName: test-claim-thin4 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. ボリュームスナップショットの削除 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat build of MicroShift がボリュームスナップショットを削除する方法を設定できます。
手順
以下の例のように、
VolumeSnapshotClassオブジェクトで必要な削除ポリシーを指定します。volumesnapshotclass.yaml
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: csi-hostpath-snap driver: hostpath.csi.k8s.io deletionPolicy: Delete1 - 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ファイナライザーが削除され、ボリュームスナップショットが削除されます。