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