第 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)卷快照的存储类

流程

  1. 在 web 控制台中进入到 Virtualization VirtualMachines
  2. 选择一个虚拟机以打开 VirtualMachine 详情页。
  3. 如果虚拟机正在运行,点选项菜单 kebab 并选择 Stop 关闭它。
  4. Snapshots 标签页,然后点 Take Snapshot
  5. 输入快照名称。
  6. 扩展 Disks included in this Snapshot 以查看快照中包含的存储卷。
  7. 如果您的虚拟机有无法包含在快照中的磁盘,并且您希望继续,请选择 I am aware of this warning and wish to proceed
  8. 点击 Save

14.1.2.2. 使用命令行创建快照

您可以通过创建一个 VirtualMachineSnapshot 对象来为离线或在线虚拟机创建虚拟机快照。

先决条件

  • 确保持久性卷声明(PVC)位于支持 Container Storage Interface(CSI)卷快照的存储类中。
  • 安装 OpenShift CLI (oc) 。
  • 可选:关闭您要为其创建快照的虚拟机。

流程

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

    apiVersion: snapshot.kubevirt.io/v1alpha1
    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,直到您删除失败的快照镜像。

        要更改默认时间期限,在 VM 快照 spec 中添加 FailureDeadline 属性,指定在快照超时前的时间,以分钟(m)或秒(s)为单位。

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

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

验证

  1. 验证 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

    1
    Progressingstatus 字段指定快照是否仍然在创建。
    2
    Ready 条件的 status 字段指定快照创建过程是否完成。
    3
    指定快照是否准备就绪可用被使用。
    4
    指定快照被绑定到快照控制器创建的 VirtualMachineSnapshotContent 对象。
  2. 检查 VirtualMachineSnapshotContent 资源的 spec:volumeBackups 属性,以验证快照中包含了预期的 PVC。

14.1.3. 使用快照指示验证在线快照

快照表示是有关在线虚拟机 (VM) 快照操作的上下文信息。对于离线虚拟机 (VM) 快照操作,提示不可用。暗示有助于描述在线快照创建的详细信息。

先决条件

  • 您必须已尝试创建在线虚拟机快照。

流程

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

    • 使用命令行查看 VirtualMachineSnapshot 对象 YAML 的 status 小节中的指示符输出。
    • 在 web 控制台中,在 Snapshot details 屏幕中点 VirtualMachineSnapshot Status
  2. 通过查看 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 控制台中的快照代表的以前的配置。

流程

  1. 在 web 控制台中进入到 Virtualization VirtualMachines
  2. 选择一个虚拟机以打开 VirtualMachine 详情页。
  3. 如果虚拟机正在运行,点选项菜单 kebab 并选择 Stop 关闭它。
  4. Snapshots 选项卡查看与虚拟机关联的快照列表。
  5. 选择快照以打开 Snapshot Details 屏幕。
  6. 点选项菜单 kebab 并选择 Restore VirtualMachineSnapshot
  7. 单击 Restore

14.1.4.2. 使用命令行从快照中恢复虚拟机

您可以使用命令行将现有虚拟机(VM)恢复到以前的配置。您只能从离线虚拟机快照中恢复。

先决条件

  • 关闭您要恢复的虚拟机。

流程

  1. 创建一个 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>
  2. 创建 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

    1
    指定将虚拟机恢复到快照代表的状态的进程是否已完成。
    2
    Progressing 条件的 status 字段指定 VM 是否仍然被恢复。
    3
    Ready 条件的 status 字段指定 VM 恢复过程是否完成。

14.1.5. 删除快照

您可以使用 OpenShift Container Platform web 控制台或命令行删除虚拟机快照。

14.1.5.1. 使用 Web 控制台删除快照

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

流程

  1. 在 web 控制台中进入到 Virtualization VirtualMachines
  2. 选择一个虚拟机以打开 VirtualMachine 详情页。
  3. Snapshots 选项卡查看与虚拟机关联的快照列表。
  4. 点快照旁的选项菜单 kebab 并选择 Delete VirtualMachineSnapshot
  5. 点击 Delete

14.1.5.2. 通过 CLI 删除虚拟机快照

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

先决条件

  • 安装 OpenShift CLI (oc) 。

流程

  • 删除 VirtualMachineSnapshot 对象:

    $ oc delete vmsnapshot <snapshot_name>

    快照控制器会删除 VirtualMachineSnapshot 和关联的 VirtualMachineSnapshotContent 对象。

验证

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

    $ oc get vmsnapshot

14.1.6. 其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.