apiVersion: snapshot.kubevirt.io/v1beta1
kind: VirtualMachineSnapshot
metadata:
name: <snapshot_name>
spec:
source:
apiGroup: kubevirt.io
kind: VirtualMachine
name: <vm_name>
您可以使用快照备份和还原虚拟机 (VM)。以下存储提供程序支持快照
Red Hat OpenShift 数据基础
任何其他支持 Kubernetes 卷快照 API 的容器存储接口 (CSI) 驱动程序的云存储提供程序
在线快照的默认截止时间为五分钟 (5m
),如有需要,可以更改。
支持具有热插拔虚拟磁盘的虚拟机的在线快照。但是,虚拟机规范中不包含的热插拔磁盘不包含在快照中。 |
要创建具有最高完整性的在线(运行状态)VM 的快照,如果您的操作系统中不包含 QEMU 访客代理,请安装它。QEMU 访客代理包含在默认的 Red Hat 模板中。
QEMU 虚拟机代理通过尽可能地使虚拟机文件系统休眠来创建一致性快照,这取决于系统的工作负载。这确保了在快照创建之前将进行中的 I/O 写入磁盘。如果不存在虚拟机代理,则无法进行休眠,并且将创建尽力而为的快照。快照的创建条件会反映在 Web 控制台或 CLI 中显示的快照指示中。
快照代表虚拟机 (VM) 在特定时间点的状态和数据。您可以使用快照将现有虚拟机恢复到以前的状态(由快照表示),用于备份和灾难恢复,或者快速回滚到以前的开发版本。
虚拟机快照是从已关闭电源(停止状态)或已开启电源(运行状态)的虚拟机创建的。
在对正在运行的虚拟机创建快照时,控制器会检查 QEMU 虚拟机代理是否已安装并正在运行。如果是,它会在创建快照之前冻结虚拟机文件系统,并在创建快照后解冻文件系统。
快照会存储附加到虚拟机的每个容器存储接口 (CSI) 卷的副本,以及虚拟机规范和元数据的副本。快照创建后无法更改。
您可以执行以下快照操作:
创建新的快照
从快照创建虚拟机的副本
列出附加到特定虚拟机的所有快照
从快照恢复虚拟机
删除现有的虚拟机快照
虚拟机快照功能引入了三个新的 API 对象,它们被定义为自定义资源定义 (CRD),用于管理快照。
VirtualMachineSnapshot
:表示用户创建快照的请求。它包含有关虚拟机当前状态的信息。
VirtualMachineSnapshotContent
:表示集群上已预配的资源(快照)。它由虚拟机快照控制器创建,并包含恢复虚拟机所需的所有资源的引用。
VirtualMachineRestore
:表示用户从快照恢复虚拟机的请求。
虚拟机快照控制器将VirtualMachineSnapshotContent
对象与其为其创建的VirtualMachineSnapshot
对象绑定,实现一对一的映射。
您可以通过冻结和解冻周期为 Linux 或 Windows 虚拟机 (VM) 配置应用程序一致性快照和备份。对于任何应用程序,您可以在 Linux 虚拟机上配置脚本,或在 Windows 虚拟机上注册以在即将开始快照或备份时收到通知。
在 Linux 虚拟机上,冻结和解冻过程会在使用 Velero 插件或其他备份供应商的插件启动快照或备份时自动触发。冻结过程由 QEMU 虚拟机代理 (QEMU GA) 冻结钩子执行,它确保在虚拟机的快照或备份发生之前,所有虚拟机的文件系统都已冻结,并且每个已正确配置的应用程序都会收到有关即将开始快照或备份的通知。此通知使每个应用程序都有机会使其状态休眠。根据应用程序的不同,休眠可能涉及暂时拒绝新请求、完成正在进行的操作以及将数据刷新到磁盘。然后指示操作系统通过将未完成的写入刷新到磁盘并冻结新的写入活动来使文件系统休眠。所有新的连接请求都将被拒绝。当所有应用程序都处于非活动状态时,QEMU GA 会冻结文件系统,并创建快照或启动备份。在创建快照或启动备份后,解冻过程开始。文件系统写入被重新激活,应用程序收到通知以恢复正常操作。
Windows 虚拟机上也提供了相同的冻结和解冻周期。应用程序向卷影复制服务 (VSS) 注册以接收通知,指示它们应刷新其数据,因为备份或快照即将到来。备份或快照完成后,应用程序的解冻会将其恢复到活动状态。有关更多详细信息,请参阅有关卷影复制服务的 Windows Server 文档。
您可以使用 OpenShift Container Platform Web 控制台或命令行创建虚拟机 (VM) 快照。
您可以使用 OpenShift Container Platform Web 控制台创建虚拟机 (VM) 快照。
虚拟机快照包括满足以下要求的磁盘:
数据卷或持久卷声明
属于支持容器存储接口 (CSI) 卷快照的存储类
在 Web 控制台中导航到**虚拟化** → **虚拟机**。
选择一个虚拟机以打开**虚拟机详细信息**页面。
单击**快照**选项卡,然后单击**创建快照**。
输入快照名称。
展开**此快照中包含的磁盘**以查看要包含在快照中的存储卷。
如果您的虚拟机包含无法包含在快照中的磁盘,并且您希望继续,请选择**我知道此警告并希望继续**。
单击**保存**。
您可以通过创建VirtualMachineSnapshot
对象为脱机或联机虚拟机创建虚拟机 (VM) 快照。
确保持久卷声明 (PVC) 位于支持容器存储接口 (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
- 联机快照操作失败。
在线快照的默认超时时间为五分钟( 要更改默认超时时间,请在虚拟机快照规范中添加 要设置无超时时间,您可以指定 如果您未指定时间单位,例如 |
验证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)
1 | Progressing 条件的status 字段指定快照是否仍在创建中。 |
2 | Ready 条件的status 字段指定快照创建过程是否已完成。 |
3 | 指定快照是否可以立即使用。 |
4 | 指定快照已绑定到快照控制器创建的VirtualMachineSnapshotContent 对象。 |
检查VirtualMachineSnapshotContent
资源的spec:volumeBackups
属性,以验证预期 PVC 是否包含在快照中。
快照指示信息是关于在线虚拟机 (VM) 快照操作的上下文信息。脱机虚拟机 (VM) 快照操作不提供指示信息。指示信息有助于描述在线快照创建的详细信息。
您必须尝试创建在线虚拟机快照。
通过执行以下操作之一来显示快照指示信息的输出:
使用命令行查看VirtualMachineSnapshot
对象 YAML 的status
部分中的指示器输出。
在 Web 控制台中,单击“快照详细信息”屏幕中的VirtualMachineSnapshot → 状态。
通过查看status.indications
参数的值来验证在线虚拟机快照的状态。
Online
表示在线快照创建期间虚拟机正在运行。
GuestAgent
表示在线快照创建期间 QEMU 访客代理正在运行。
NoGuestAgent
表示在线快照创建期间 QEMU 访客代理未运行。QEMU 访客代理无法用于冻结和解冻文件系统,原因可能是 QEMU 访客代理未安装或运行,或者由于其他错误。
您可以使用 OpenShift Container Platform Web 控制台或命令行从快照还原虚拟机 (VM)。
您可以使用 OpenShift Container Platform Web 控制台将虚拟机 (VM) 还原到快照表示的先前配置。
在 Web 控制台中导航到**虚拟化** → **虚拟机**。
选择一个虚拟机以打开**虚拟机详细信息**页面。
如果虚拟机正在运行,请单击选项菜单并选择停止将其关闭。
单击快照选项卡以查看与虚拟机关联的快照列表。
选择一个快照以打开快照详细信息屏幕。
单击选项菜单并选择从快照还原虚拟机。
单击还原。
您可以使用命令行将现有虚拟机 (VM) 还原到以前的配置。您只能从脱机虚拟机快照还原。
关闭要还原的虚拟机的电源。
创建一个 YAML 文件来定义一个VirtualMachineRestore
对象,该对象指定要还原的虚拟机的名称和用作源的快照的名称,如下例所示。
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
1 | 指定将虚拟机还原到快照表示的状态的过程是否已完成。 |
2 | Progressing 条件的status 字段指定虚拟机是否仍在还原中。 |
3 | Ready 条件的status 字段指定虚拟机还原过程是否已完成。 |