×

您可以使用快照备份和还原虚拟机 (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) 快照。

使用 Web 控制台创建快照

您可以使用 OpenShift Container Platform Web 控制台创建虚拟机 (VM) 快照。

虚拟机快照包括满足以下要求的磁盘:

  • 数据卷或持久卷声明

  • 属于支持容器存储接口 (CSI) 卷快照的存储类

步骤
  1. 在 Web 控制台中导航到**虚拟化** → **虚拟机**。

  2. 选择一个虚拟机以打开**虚拟机详细信息**页面。

  3. 单击**快照**选项卡,然后单击**创建快照**。

  4. 输入快照名称。

  5. 展开**此快照中包含的磁盘**以查看要包含在快照中的存储卷。

  6. 如果您的虚拟机包含无法包含在快照中的磁盘,并且您希望继续,请选择**我知道此警告并希望继续**。

  7. 单击**保存**。

使用命令行创建快照

您可以通过创建VirtualMachineSnapshot 对象为脱机或联机虚拟机创建虚拟机 (VM) 快照。

先决条件
  • 确保持久卷声明 (PVC) 位于支持容器存储接口 (CSI) 卷快照的存储类中。

  • 安装 OpenShift CLI (oc)。

  • 可选:关闭要为其创建快照的虚拟机的电源。

步骤
  1. 创建一个 YAML 文件来定义VirtualMachineSnapshot 对象,该对象指定新VirtualMachineSnapshot 的名称和源虚拟机的名称,如下例所示。

    apiVersion: snapshot.kubevirt.io/v1beta1
    kind: VirtualMachineSnapshot
    metadata:
      name: <snapshot_name>
    spec:
      source:
        apiGroup: kubevirt.io
        kind: VirtualMachine
        name: <vm_name>
  2. 创建VirtualMachineSnapshot 对象。

    $ oc create -f <snapshot_name>.yaml

    快照控制器创建一个VirtualMachineSnapshotContent 对象,将其绑定到VirtualMachineSnapshot,并更新VirtualMachineSnapshot 对象的statusreadyToUse 字段。

  3. 可选:如果您正在创建联机快照,可以使用wait 命令并监控快照的状态。

    1. 输入以下命令:

      $ oc wait <vm_name> <snapshot_name> --for condition=Ready
    2. 验证快照的状态。

      • InProgress - 联机快照操作仍在进行中。

      • Succeeded - 联机快照操作已成功完成。

      • Failed - 联机快照操作失败。

        在线快照的默认超时时间为五分钟(5m)。如果快照在五分钟内未成功完成,则状态将设置为failed。之后,文件系统将被解冻,虚拟机将被解冻,但状态将保持为failed,直到您删除失败的快照镜像。

        要更改默认超时时间,请在虚拟机快照规范中添加FailureDeadline属性,并以分钟 (m) 或秒 (s) 为单位指定快照操作超时之前所需的时间。

        要设置无超时时间,您可以指定0,但这通常不建议这样做,因为它可能导致虚拟机无响应。

        如果您未指定时间单位,例如ms,则默认为秒 (s)。

验证
  1. 验证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对象。
  2. 检查VirtualMachineSnapshotContent资源的spec:volumeBackups属性,以验证预期 PVC 是否包含在快照中。

使用快照指示信息验证在线快照

快照指示信息是关于在线虚拟机 (VM) 快照操作的上下文信息。脱机虚拟机 (VM) 快照操作不提供指示信息。指示信息有助于描述在线快照创建的详细信息。

先决条件
  • 您必须尝试创建在线虚拟机快照。

步骤
  1. 通过执行以下操作之一来显示快照指示信息的输出:

    • 使用命令行查看VirtualMachineSnapshot对象 YAML 的status部分中的指示器输出。

    • 在 Web 控制台中,单击“快照详细信息”屏幕中的VirtualMachineSnapshot状态

  2. 通过查看status.indications参数的值来验证在线虚拟机快照的状态。

    • Online表示在线快照创建期间虚拟机正在运行。

    • GuestAgent表示在线快照创建期间 QEMU 访客代理正在运行。

    • NoGuestAgent表示在线快照创建期间 QEMU 访客代理未运行。QEMU 访客代理无法用于冻结和解冻文件系统,原因可能是 QEMU 访客代理未安装或运行,或者由于其他错误。

从快照还原虚拟机

您可以使用 OpenShift Container Platform Web 控制台或命令行从快照还原虚拟机 (VM)。

使用 Web 控制台从快照还原虚拟机

您可以使用 OpenShift Container Platform Web 控制台将虚拟机 (VM) 还原到快照表示的先前配置。

步骤
  1. 在 Web 控制台中导航到**虚拟化** → **虚拟机**。

  2. 选择一个虚拟机以打开**虚拟机详细信息**页面。

  3. 如果虚拟机正在运行,请单击选项菜单kebab并选择停止将其关闭。

  4. 单击快照选项卡以查看与虚拟机关联的快照列表。

  5. 选择一个快照以打开快照详细信息屏幕。

  6. 单击选项菜单kebab并选择从快照还原虚拟机

  7. 单击还原

使用命令行从快照还原虚拟机

您可以使用命令行将现有虚拟机 (VM) 还原到以前的配置。您只能从脱机虚拟机快照还原。

先决条件
  • 关闭要还原的虚拟机的电源。

步骤
  1. 创建一个 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>
  2. 创建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字段指定虚拟机还原过程是否已完成。

删除快照

您可以使用 OpenShift Container Platform Web 控制台或命令行删除虚拟机 (VM) 的快照。

使用 Web 控制台删除快照

您可以使用 Web 控制台删除现有的虚拟机 (VM) 快照。

步骤
  1. 在 Web 控制台中导航到**虚拟化** → **虚拟机**。

  2. 选择一个虚拟机以打开**虚拟机详细信息**页面。

  3. 单击快照选项卡以查看与虚拟机关联的快照列表。

  4. 单击快照旁边的选项菜单kebab并选择删除快照

  5. 单击删除

在 CLI 中删除虚拟机快照

您可以通过删除相应的VirtualMachineSnapshot对象来删除现有的虚拟机 (VM) 快照。

先决条件
  • 安装 OpenShift CLI (oc)。

步骤
  • 删除VirtualMachineSnapshot对象。

    $ oc delete vmsnapshot <snapshot_name>

    快照控制器将删除VirtualMachineSnapshot以及关联的VirtualMachineSnapshotContent对象。

验证
  • 验证快照是否已删除并且不再附加到此虚拟机。

    $ oc get vmsnapshot

其他资源