第 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. 关于应用程序一致性快照和备份
您可以通过冻结和解译周期,为 Linux 或 Windows 虚拟机(VM)配置应用程序一致性快照和备份。对于任何应用程序,您可以在 Linux 虚拟机上配置脚本,或者在 Windows 虚拟机上注册,以便在快照或备份开始时获得通知。
在 Linux 虚拟机上,当生成快照或使用备份时自动触发 GFS 和 thaw 进程,例如,来自 Velero 或其他备份供应商的插件。QEMU 客户机代理(QEMU GA)执行的冻结过程会冻结 hook,确保在虚拟机的快照或备份发生前,所有虚拟机的文件系统都会冻结,每个配置的应用程序都会显示快照或备份要启动。此通知可负担每个应用程序获得其状态的机会。根据应用程序,静默可能涉及临时拒绝新请求、完成进行中的操作,以及将数据刷新到磁盘。然后,操作系统会被定向到静止文件系统,方法是清除未完成的写入磁盘并释放新的写入活动。所有新的连接请求都会被拒绝。当所有应用程序都不活跃时,QEMU GA 会冻结文件系统,并生成一个快照或启动备份。在执行快照或开始备份后,解动过程开始。文件系统写入会被重新激活,应用程序会收到通知以恢复正常操作。
Windows 虚拟机上提供了相同的冻结和波动周期。使用卷 Shadow Copy Service (VSS) 注册应用程序,以接收通知,因为备份或快照不会清除其数据。在备份或快照完成后,对应用程序进行修复会将它们返回到 active 状态。如需了解更多详细信息,请参阅有关卷 Shadow 复制服务的 Windows 服务器文档。
14.1.3. 创建快照
您可以使用 OpenShift Container Platform web 控制台或命令行创建虚拟机(VM)的快照。
14.1.3.1. 使用 Web 控制台创建快照
您可以使用 OpenShift Container Platform web 控制台为虚拟机(VM)创建快照。
VM 快照包括以下要求的磁盘:
- 数据卷或持久性卷声明
- 属于支持容器存储接口(CSI)卷快照的存储类
流程
-
在 web 控制台中进入到 Virtualization
VirtualMachines。 - 选择一个虚拟机以打开 VirtualMachine 详情页。
- 点 Snapshots 标签页,然后点 Take Snapshot。
- 输入快照名称。
- 扩展 Disks included in this Snapshot 以查看快照中包含的存储卷。
- 如果您的虚拟机有无法包含在快照中的磁盘,并且您希望继续,请选择 I am aware of this warning and wish to proceed。
- 点击 Save。
14.1.3.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.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 控制台或命令行从快照中恢复虚拟机(VM)。
14.1.5.1. 使用 Web 控制台从快照中恢复虚拟机
您可以将虚拟机(VM)恢复到 OpenShift Container Platform web 控制台中的快照代表的以前的配置。
流程
-
在 web 控制台中进入到 Virtualization
VirtualMachines。 - 选择一个虚拟机以打开 VirtualMachine 详情页。
- 如果虚拟机正在运行,点选项菜单 并选择 Stop 关闭它。
- 点 Snapshots 选项卡查看与虚拟机关联的快照列表。
- 选择快照以打开 Snapshot Details 屏幕。
- 点选项菜单 并选择 Restore VirtualMachine from snapshot。
- 单击 Restore。
14.1.5.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.6. 删除快照
您可以使用 OpenShift Container Platform web 控制台或命令行删除虚拟机快照。
14.1.6.1. 使用 Web 控制台删除快照
您可以使用 web 控制台删除现有虚拟机(VM)快照。
流程
-
在 web 控制台中进入到 Virtualization
VirtualMachines。 - 选择一个虚拟机以打开 VirtualMachine 详情页。
- 点 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