第 14 章 备份和恢复
14.1. 使用虚拟机快照备份和恢复
您可以使用快照备份和恢复虚拟机(VM)。以下存储供应商支持快照:
- Red Hat OpenShift Data Foundation
- 使用支持 Kubernetes 卷快照 API 的 Container Storage Interface(CSI)驱动程序的任何其他云存储供应商
在线快照的默认时间期限为五分钟(5m
),可根据需要进行更改。
具有热插虚拟磁盘的虚拟机支持在线快照。但是,没有在虚拟机规格中的热插磁盘不会包含在快照中。
要创建具有最高完整性的在线(Running 状态)虚拟机的快照,请在您的操作系统中没有包括 QEMU 客户机代理时安装它。QEMU 客户机代理包含在默认的红帽模板中。
QEMU 客户机代理通过尝试静止虚拟机的文件系统来尽可能取一个一致的快照,具体取决于系统工作负载。这样可确保在进行快照前将 in-flight I/O 写入磁盘。如果没有客户机代理,则无法静止并生成最佳快照。执行快照的条件反映在 web 控制台或 CLI 中显示的快照声明中。
14.1.1. 关于快照
快照 代表虚拟机(VM)在特定时间点的状态和数据。您可以使用快照将现有虚拟机恢复到以前的状态(由快照代表)进行备份和恢复,或者快速回滚到以前的开发版本。
虚拟机快照从关机(停止状态)或 powred on(Running 状态)上的虚拟机创建。
在为正在运行的虚拟机执行快照时,控制器将检查 QEMU 客户机代理是否已安装并在运行。如果是这样,它会在拍摄快照前冻结虚拟机文件系统,并在拍摄快照后修改文件系统。
快照存储附加到虚拟机的每个 Container Storage Interface(CSI)卷的副本以及虚拟机规格和元数据的副本。创建后无法更改快照。
您可以执行以下快照操作:
- 创建新快照
- 从快照创建虚拟机的副本
- 列出附加到特定虚拟机的所有快照
- 从快照恢复虚拟机
- 删除现有虚拟机快照
VM 快照控制器和自定义资源
VM 快照功能引入了三个新的 API 对象,定义为自定义资源定义(CRD)来管理快照:
-
VirtualMachineSnapshot
:代表创建快照的用户请求。它包含有关虚拟机当前状态的信息。 -
VirtualMachineSnapshotContent
:代表集群中置备的资源(快照)。它由虚拟机快照控制器创建,其中包含恢复虚拟机所需的所有资源的引用。 -
VirtualMachineRestore
:代表从快照中恢复虚拟机的用户请求。
VM 快照控制器会把一个 VirtualMachineSnapshotContent
对象与创建它的 VirtualMachineSnapshotContent
对象绑定,并具有一对一的映射。
14.1.2. 创建快照
您可以使用 OpenShift Container Platform web 控制台或命令行创建虚拟机(VM)的快照。
14.1.2.1. 使用 Web 控制台创建快照
您可以使用 OpenShift Container Platform web 控制台为虚拟机(VM)创建快照。
VM 快照包括以下要求的磁盘:
- 数据卷或持久性卷声明
- 属于支持容器存储接口(CSI)卷快照的存储类
流程
-
在 web 控制台中进入到 Virtualization
VirtualMachines。 - 选择一个虚拟机以打开 VirtualMachine 详情页。
- 如果虚拟机正在运行,点选项菜单 并选择 Stop 关闭它。
- 点 Snapshots 标签页,然后点 Take Snapshot。
- 输入快照名称。
- 扩展 Disks included in this Snapshot 以查看快照中包含的存储卷。
- 如果您的虚拟机有无法包含在快照中的磁盘,并且您希望继续,请选择 I am aware of this warning and wish to proceed。
- 点击 Save。
14.1.2.2. 使用命令行创建快照
您可以通过创建一个 VirtualMachineSnapshot
对象来为离线或在线虚拟机创建虚拟机快照。
先决条件
- 确保持久性卷声明(PVC)位于支持 Container Storage Interface(CSI)卷快照的存储类中。
-
安装 OpenShift CLI (
oc
) 。 - 可选:关闭您要为其创建快照的虚拟机。
流程
创建一个 YAML 文件来定义
VirtualMachineSnapshot
对象,用于指定新VirtualMachineSnapshot
的名称和源虚拟机的名称,如下例所示:apiVersion: snapshot.kubevirt.io/v1alpha1 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
- 在线快照操作失败。注意在线快照的默认时间期限为五分钟(
5m
)。如果快照在五分钟内没有成功完成,其状态将设为failed
。之后,文件系统将被”解冻”,虚拟机将取消冻结,但状态会一直failed
,直到您删除失败的快照镜像。要更改默认时间期限,在 VM 快照 spec 中添加
FailureDeadline
属性,指定在快照超时前的时间,以分钟(m
)或秒(s
)为单位。要设置截止时间,您可以指定
0
,但通常不建议这样做,因为它可能会导致虚拟机没有响应。如果您没有指定时间单位,如
m
或s
,则默认为 秒(s
)。
-
验证
验证
VirtualMachineSnapshot
对象是否已创建并绑定到VirtualMachineSnapshotContent
,并且readyToUse
标志设为true
:$ oc describe vmsnapshot <snapshot_name>
输出示例
apiVersion: snapshot.kubevirt.io/v1alpha1 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/v1alpha1/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.3. 使用快照指示验证在线快照
快照表示是有关在线虚拟机 (VM) 快照操作的上下文信息。对于离线虚拟机 (VM) 快照操作,提示不可用。暗示有助于描述在线快照创建的详细信息。
先决条件
- 您必须已尝试创建在线虚拟机快照。
流程
通过执行以下操作之一来显示快照的输出:
-
使用命令行查看
VirtualMachineSnapshot
对象 YAML 的status
小节中的指示符输出。 -
在 web 控制台中,在 Snapshot details 屏幕中点 VirtualMachineSnapshot
Status。
-
使用命令行查看
通过查看
status.indications
参数的值来验证在线虚拟机快照的状态:-
Online
代表虚拟机在在线快照创建期间运行。 -
GuestAgent
表示 QEMU 客户机代理在在线快照创建过程中运行。 -
NoGuestAgent
表示 QEMU 客户机代理在在线快照创建过程中没有运行。QEMU 客户机代理无法用于冻结和构建文件系统,要么因为 QEMU 客户机代理尚未安装或正在运行,要么是因为另一个错误。
-
14.1.4. 从快照中恢复虚拟机
您可以使用 OpenShift Container Platform web 控制台或命令行从快照中恢复虚拟机(VM)。
14.1.4.1. 使用 Web 控制台从快照中恢复虚拟机
您可以将虚拟机(VM)恢复到 OpenShift Container Platform web 控制台中的快照代表的以前的配置。
流程
-
在 web 控制台中进入到 Virtualization
VirtualMachines。 - 选择一个虚拟机以打开 VirtualMachine 详情页。
- 如果虚拟机正在运行,点选项菜单 并选择 Stop 关闭它。
- 点 Snapshots 选项卡查看与虚拟机关联的快照列表。
- 选择快照以打开 Snapshot Details 屏幕。
- 点选项菜单 并选择 Restore VirtualMachineSnapshot。
- 单击 Restore。
14.1.4.2. 使用命令行从快照中恢复虚拟机
您可以使用命令行将现有虚拟机(VM)恢复到以前的配置。您只能从离线虚拟机快照中恢复。
先决条件
- 关闭您要恢复的虚拟机。
流程
创建一个 YAML 文件来定义
VirtualMachineRestore
对象,用于指定您要恢复的虚拟机的名称以及要用作源的快照名称,如下例所示:apiVersion: snapshot.kubevirt.io/v1alpha1 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
对象的 status 字段,并将现有虚拟机配置替换为快照内容。
验证
验证虚拟机是否已恢复到快照代表的以前的状态,并将
complete
标志设置为true
:$ oc get vmrestore <vm_restore>
输出示例
apiVersion: snapshot.kubevirt.io/v1alpha1 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/v1alpha1/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.5. 删除快照
您可以使用 OpenShift Container Platform web 控制台或命令行删除虚拟机快照。
14.1.5.1. 使用 Web 控制台删除快照
您可以使用 web 控制台删除现有虚拟机(VM)快照。
流程
-
在 web 控制台中进入到 Virtualization
VirtualMachines。 - 选择一个虚拟机以打开 VirtualMachine 详情页。
- 点 Snapshots 选项卡查看与虚拟机关联的快照列表。
- 点快照旁的选项菜单 并选择 Delete VirtualMachineSnapshot。
- 点击 Delete。
14.1.5.2. 通过 CLI 删除虚拟机快照
您可以通过删除正确的 VirtualMachineSnapshot
对象来删除现有虚拟机(VM)快照。
先决条件
-
安装 OpenShift CLI (
oc
) 。
流程
删除
VirtualMachineSnapshot
对象:$ oc delete vmsnapshot <snapshot_name>
快照控制器会删除
VirtualMachineSnapshot
和关联的VirtualMachineSnapshotContent
对象。
验证
验证快照是否已删除,且不再附加到此虚拟机:
$ oc get vmsnapshot