第14章 バックアップおよび復元
14.1. 仮想マシンスナップショットを使用したバックアップと復元
スナップショットを使用して、仮想マシンをバックアップおよび復元できます。スナップショットは、次のストレージプロバイダーによってサポートされています。
- Red Hat OpenShift Data Foundation
- Kubernetes Volume Snapshot API をサポートする Container Storage Interface (CSI) ドライバーを使用するその他のクラウドストレージプロバイダー
オンラインスナップショットのデフォルト期限は 5 分 (5m
) で、必要に応じて変更できます。
オンラインスナップショットは、ホットプラグされた仮想ディスクを持つ仮想マシンでサポートされます。ただし、仮想マシンの仕様に含まれていないホットプラグされたディスクは、スナップショットに含まれません。
最も整合性の高いオンライン (実行状態) 仮想マシンのスナップショットを作成する際、QEMU ゲストエージェントがオペレーティングシステムに含まれていない場合はインストールします。QEMU ゲストエージェントは、デフォルトの Red Hat テンプレートに含まれています。
QEMU ゲストエージェントは、システムのワークロードに応じて、可能な限り仮想マシンのファイルシステムの休止しようとすることで一貫性のあるスナップショットを取得します。これにより、スナップショットの作成前にインフライトの I/O がディスクに書き込まれるようになります。ゲストエージェントが存在しない場合は、休止はできず、ベストエフォートスナップショットが作成されます。スナップショットの作成条件は、Web コンソールまたは CLI に表示されるスナップショットの指示に反映されます。
14.1.1. スナップショット
スナップショット は、特定の時点における仮想マシン (VM) の状態およびデータを表します。スナップショットを使用して、バックアップおよび障害復旧のために既存の仮想マシンを (スナップショットで表される) 以前の状態に復元したり、以前の開発バージョンに迅速にロールバックしたりできます。
仮想マシンのスナップショットは、電源がオフ (停止状態) またはオン (実行状態) の仮想マシンから作成されます。
実行中の仮想マシンのスナップショットを作成する場合には、コントローラーは QEMU ゲストエージェントがインストールされ、実行中であることを確認します。その場合、スナップショットを取得する前に仮想マシンファイルシステムをフリーズし、スナップショットを取得した後にファイルシステムをフリーズ解除します。
スナップショットは、仮想マシンに割り当てられた各 Container Storage Interface (CSI) ボリュームのコピーと、仮想マシンの仕様およびメタデータのコピーを保存します。スナップショットは作成後に変更できません。
次のスナップショットアクションを実行できます。
- 新規スナップショットの作成
- スナップショットから仮想マシンのコピーを作成する
- 特定の仮想マシンに割り当てられているすべてのスナップショットのリスト表示
- スナップショットからの仮想マシンの復元
- 既存の仮想マシンスナップショットの削除
仮想マシンスナップショットコントローラーとカスタムリソース
仮想マシンスナップショット機能では、スナップショットを管理するためのカスタムリソース定義 (CRD) として定義される 3 つの新しい API オブジェクトが導入されています。
-
VirtualMachineSnapshot
: スナップショットを作成するユーザー要求を表します。これには、仮想マシンの現在の状態に関する情報が含まれます。 -
VirtualMachineSnapshotContent
: クラスター上のプロビジョニングされたリソース (スナップショット) を表します。これは、仮想マシンのスナップショットコントローラーによって作成され、仮想マシンの復元に必要なすべてのリソースへの参照が含まれます。 -
VirtualMachineRestore
: スナップショットから仮想マシンを復元するユーザー要求を表します。
仮想マシンスナップショットコントローラーは、1 対 1 のマッピングで、VirtualMachineSnapshotContent
オブジェクトを、この作成に使用した VirtualMachineSnapshot
オブジェクトにバインドします。
14.1.2. アプリケーションコンシステントなスナップショットとバックアップについて
フリーズとフリーズ解除のサイクルにより、Linux または Windows 仮想マシン (VM) のアプリケーションコンシステントなスナップショットおよびバックアップを設定できます。任意のアプリケーションに対して、スナップショットまたはバックアップの開始予定時に通知を受け取るように、Linux 仮想マシン上でスクリプトを設定するか、Windows 仮想マシン上で登録することができます。
Linux 仮想マシンでは、たとえばスナップショットが取得されたり、Velero や別のバックアップベンダーのプラグインを使用してバックアップが開始されたりすると、フリーズおよびフリーズ解除プロセスが自動的にトリガーされます。QEMU Guest Agent (QEMU GA) のフリーズフックによって実行されるフリーズプロセスにより、仮想マシンのスナップショットまたはバックアップが実行される前に、仮想マシンのすべてのファイルシステムがフリーズされ、適切に設定された各アプリケーションにスナップショットまたはバックアップが開始されることが通知されます。この通知により、各アプリケーションに状態を休止する機会が与えられます。アプリケーションによっては、休止に伴い、新しいリクエストの一時的な拒否、進行中の操作の終了、データのディスクへのフラッシュが実行される場合があります。その後、オペレーティングシステムが、未処理の書き込みをディスクにフラッシュし、新しい書き込みアクティビティーをフリーズすることによって、ファイルシステムを休止するように指示されます。新しい接続要求はすべて拒否されます。すべてのアプリケーションが非アクティブになると、QEMU GA がファイルシステムをフリーズし、スナップショットが取得されるか、バックアップが開始されます。スナップショットの取得またはバックアップの開始後、フリーズ解除プロセスが開始します。ファイルシステムの書き込みが再アクティブ化され、アプリケーションが通常の操作を再開するための通知を受け取ります。
Windows 仮想マシンでも、同様のフリーズおよびフリーズ解除のサイクルを利用できます。アプリケーションが Volume Shadow Copy Service (VSS) に登録され、バックアップまたはスナップショットの実行が近づいているため、データをフラッシュする必要があるという通知を受け取ります。バックアップまたはスナップショットの完了後にアプリケーションがフリーズ解除されると、アプリケーションはアクティブな状態に戻ります。詳細は、Volume Shadow Copy Service に関する Windows Server のドキュメントを参照してください。
14.1.3. スナップショットの作成
OpenShift Container Platform Web コンソールまたはコマンドラインを使用して、仮想マシンのスナップショットを作成できます。
14.1.3.1. Web コンソールを使用したスナップショットを作成する
OpenShift Container Platform Web コンソールを使用して、仮想マシンのスナップショットを作成できます。
仮想マシンスナップショットには、以下の要件を満たすディスクが含まれます。
- データボリュームまたは永続ボリュームの要求のいずれか
- Container Storage Interface (CSI) ボリュームスナップショットをサポートするストレージクラスに属している必要があります。
手順
-
Web コンソールで Virtualization
VirtualMachines に移動します。 - 仮想マシンを選択して、VirtualMachine details ページを開きます。
- Snapshots タブをクリックしてから Take Snapshot をクリックします。
- スナップショット名を入力します。
- Disks included in this Snapshot を拡張し、スナップショットに組み込むストレージボリュームを表示します。
- 仮想マシンにスナップショットに含めることができないディスクがあり、続行する場合は、I am aware of this warning and wish to proceed を選択します。
- Save をクリックします。
14.1.3.2. コマンドラインを使用したスナップショットの作成
VirtualMachineSnapshot
オブジェクトを作成し、オフラインまたはオンラインの仮想マシンの仮想マシン (VM) スナップショットを作成できます。
前提条件
- 永続ボリューム要求 (PVC) が Container Storage Interface (CSI) ボリュームスナップショットをサポートするストレージクラスにあることを確認している。
-
OpenShift CLI (
oc
) がインストールされている。 - オプション: スナップショットを作成する仮想マシンの電源を切っている。
手順
次の例のように、YAML ファイルを作成して、新しい
VirtualMachineSnapshot
の名前とソース仮想マシンの名前を指定するVirtualMachineSnapshot
オブジェクトを定義します。apiVersion: snapshot.kubevirt.io/v1beta1 kind: VirtualMachineSnapshot metadata: name: <snapshot_name> spec: source: apiGroup: kubevirt.io kind: VirtualMachine name: <vm_name>
VirtualMachineSnapshot
オブジェクトを作成します。$ oc create -f <snapshot_name>.yaml
スナップコントローラーは
VirtualMachineSnapshotContent
オブジェクトを作成し、これをVirtualMachineSnapshot
にバインドし、VirtualMachineSnapshot
オブジェクトのstatus
およびreadyToUse
フィールドを更新します。オプション: オンラインスナップショットを作成している場合は、
wait
コマンドを使用して、スナップショットのステータスを監視できます。以下のコマンドを入力します。
$ oc wait <vm_name> <snapshot_name> --for condition=Ready
スナップショットのステータスを確認します。
-
InProgress
: オンラインスナップショットの操作が進行中です。 -
Succeeded
: オンラインスナップショット操作が正常に完了しました。 Failed
: オンラインスナップショットの操作に失敗しました。注記オンラインスナップショットのデフォルト期限は 5 分 (
5m
) です。スナップショットが 5 分後に正常に完了しない場合には、ステータスがfailed
に設定されます。その後、ファイルシステムと仮想マシンのフリーズが解除され、失敗したスナップショットイメージが削除されるまで、ステータスはfailed
のままになります。デフォルトの期限を変更するには、仮想マシンスナップショット仕様に
FailureDeadline
属性を追加して、スナップショット操作がタイムアウトするまでの時間を分単位 (m
) または秒単位 (s
) で指定します。期限を指定しない場合は、
0
を指定できますが、仮想マシンが応答しなくなる可能性があるため、通常は推奨していません。m
またはs
などの時間の単位を指定しない場合、デフォルトは秒 (s
) です。
-
検証
VirtualMachineSnapshot
オブジェクトが作成され、VirtualMachineSnapshotContent
にバインドされていることと、readyToUse
フラグがtrue
に設定されていることを確認します。$ oc describe vmsnapshot <snapshot_name>
出力例
apiVersion: snapshot.kubevirt.io/v1beta1 kind: VirtualMachineSnapshot metadata: creationTimestamp: "2020-09-30T14:41:51Z" finalizers: - snapshot.kubevirt.io/vmsnapshot-protection generation: 5 name: mysnap namespace: default resourceVersion: "3897" selfLink: /apis/snapshot.kubevirt.io/v1beta1/namespaces/default/virtualmachinesnapshots/my-vmsnapshot uid: 28eedf08-5d6a-42c1-969c-2eda58e2a78d spec: source: apiGroup: kubevirt.io kind: VirtualMachine name: my-vm status: conditions: - lastProbeTime: null lastTransitionTime: "2020-09-30T14:42:03Z" reason: Operation complete status: "False" 1 type: Progressing - lastProbeTime: null lastTransitionTime: "2020-09-30T14:42:03Z" reason: Operation complete status: "True" 2 type: Ready creationTime: "2020-09-30T14:42:03Z" readyToUse: true 3 sourceUID: 355897f3-73a0-4ec4-83d3-3c2df9486f4f virtualMachineSnapshotContentName: vmsnapshot-content-28eedf08-5d6a-42c1-969c-2eda58e2a78d 4
-
VirtualMachineSnapshotContent
リソースのspec:volumeBackups
プロパティーをチェックし、予想される PVC がスナップショットに含まれることを確認します。
14.1.4. スナップショット指示を使用したオンラインスナップショットの検証
スナップショットの表示は、オンライン仮想マシン (VM) スナップショット操作に関するコンテキスト情報です。オフラインの仮想マシン (VM) スナップショット操作では、指示は利用できません。イベントは、オンラインスナップショット作成の詳説する際に役立ちます。
前提条件
- オンライン仮想マシンスナップショットを作成しようとしている必要があります。
手順
次のいずれかの操作を実行して、スナップショット指示からの出力を表示します。
-
コマンドラインを使用して、
VirtualMachineSnapshot
オブジェクト YAML のstatus
スタンザのインジケーター出力を表示します。 -
Web コンソールの Snapshot details 画面で、VirtualMachineSnapshot
Status をクリックします。
-
コマンドラインを使用して、
status.indications
パラメーターの値を表示して、オンラインの仮想マシンスナップショットのステータスを確認します。-
Online
は、オンラインスナップショットの作成中に仮想マシンが実行されていたことを示します。 -
GuestAgent
は、オンラインスナップショットの作成中に QEMU ゲストエージェントが実行されていたことを示します。 -
NoGuestAgent
は、オンラインスナップショットの作成中に QEMU ゲストエージェントが実行されていなかったことを示します。QEMU ゲストエージェントがインストールされていないか、実行されていないか、別のエラーが原因で、QEMU ゲストエージェントを使用してファイルシステムをフリーズしてフリーズを解除できませんでした。
-
14.1.5. スナップショットからの仮想マシンの復元
OpenShift Container Platform Web コンソールまたはコマンドラインを使用して、スナップショットから仮想マシンを復元できます。
14.1.5.1. Web コンソールを使用したスナップショットからの仮想マシンの復元
OpenShift Container Platform Web コンソールのスナップショットで表される以前の設定に仮想マシンを復元できます。
手順
-
Web コンソールで Virtualization
VirtualMachines に移動します。 - 仮想マシンを選択して、VirtualMachine details ページを開きます。
- 仮想マシンが実行中の場合は、オプションメニュー をクリックし、Stop を選択して電源を切ります。
- Snapshots タブをクリックして、仮想マシンに関連付けられたスナップショットのリストを表示します。
- スナップショットを選択して、Snapshot Details 画面を開きます。
- オプションメニュー をクリックし、Restore VirtualMachine from snapshot を選択します。
- Restore をクリックします。
14.1.5.2. コマンドラインを使用したスナップショットからの仮想マシンの復元
コマンドラインを使用して、既存の仮想マシンを以前の設定に復元できます。オフラインの仮想マシンスナップショットからしか復元できません。
前提条件
- 復元する仮想マシンの電源を切ります。
手順
次の例のように、復元する仮想マシンの名前およびソースとして使用されるスナップショットの名前を指定する
VirtualMachineRestore
オブジェクトを定義するために YAML ファイルを作成します。apiVersion: snapshot.kubevirt.io/v1beta1 kind: VirtualMachineRestore metadata: name: <vm_restore> spec: target: apiGroup: kubevirt.io kind: VirtualMachine name: <vm_name> virtualMachineSnapshotName: <snapshot_name>
VirtualMachineRestore
オブジェクトを作成します。$ oc create -f <vm_restore>.yaml
スナップショットコントローラーは、
VirtualMachineRestore
オブジェクトのステータスフィールドを更新し、既存の仮想マシン設定をスナップショットのコンテンツに置き換えます。
検証
仮想マシンがスナップショットで表される以前の状態に復元されていること、および
complete
フラグがtrue
に設定されていることを確認します。$ oc get vmrestore <vm_restore>
出力例
apiVersion: snapshot.kubevirt.io/v1beta1 kind: VirtualMachineRestore metadata: creationTimestamp: "2020-09-30T14:46:27Z" generation: 5 name: my-vmrestore namespace: default ownerReferences: - apiVersion: kubevirt.io/v1 blockOwnerDeletion: true controller: true kind: VirtualMachine name: my-vm uid: 355897f3-73a0-4ec4-83d3-3c2df9486f4f resourceVersion: "5512" selfLink: /apis/snapshot.kubevirt.io/v1beta1/namespaces/default/virtualmachinerestores/my-vmrestore uid: 71c679a8-136e-46b0-b9b5-f57175a6a041 spec: target: apiGroup: kubevirt.io kind: VirtualMachine name: my-vm virtualMachineSnapshotName: my-vmsnapshot status: complete: true 1 conditions: - lastProbeTime: null lastTransitionTime: "2020-09-30T14:46:28Z" reason: Operation complete status: "False" 2 type: Progressing - lastProbeTime: null lastTransitionTime: "2020-09-30T14:46:28Z" reason: Operation complete status: "True" 3 type: Ready deletedDataVolumes: - test-dv1 restoreTime: "2020-09-30T14:46:28Z" restores: - dataVolumeName: restore-71c679a8-136e-46b0-b9b5-f57175a6a041-datavolumedisk1 persistentVolumeClaim: restore-71c679a8-136e-46b0-b9b5-f57175a6a041-datavolumedisk1 volumeName: datavolumedisk1 volumeSnapshotName: vmsnapshot-28eedf08-5d6a-42c1-969c-2eda58e2a78d-volume-datavolumedisk1
14.1.6. スナップショットの削除
OpenShift Container Platform Web コンソールまたはコマンドラインを使用して、仮想マシンのスナップショットを削除できます。
14.1.6.1. Web コンソールを使用してスナップショットを削除する
Web コンソールを使用して既存の仮想マシンスナップショットを削除できます。
手順
-
Web コンソールで Virtualization
VirtualMachines に移動します。 - 仮想マシンを選択して、VirtualMachine details ページを開きます。
- Snapshots タブをクリックして、仮想マシンに関連付けられたスナップショットのリストを表示します。
- スナップショットの横にあるオプションメニュー をクリックし、Delete snapshot を選択します。
- Delete をクリックします。
14.1.6.2. CLI での仮想マシンのスナップショットの削除
適切な VirtualMachineSnapshot
オブジェクトを削除して、既存の仮想マシン (VM) スナップショットを削除できます。
前提条件
-
OpenShift CLI (
oc
) がインストールされている。
手順
VirtualMachineSnapshot
オブジェクトを削除します。$ oc delete vmsnapshot <snapshot_name>
スナップショットコントローラーは、
VirtualMachineSnapshot
を、関連付けられたVirtualMachineSnapshotContent
オブジェクトと共に削除します。
検証
スナップショットが削除され、この仮想マシンに割り当てられていないことを確認します。
$ oc get vmsnapshot