在 KubeVirt 上克隆虚拟机

本文档提供了使用 KubeVirt 的 VirtualMachineClone API 克隆虚拟机(VM)的分步指导。

确保先决条件

在启动虚拟机克隆操作之前,请确保满足以下要求:

  • 支持快照的存储:Clone API 依赖于快照与恢复功能。虚拟机所使用的存储类必须支持卷快照,并且该存储后端必须显式启用快照功能。

快速开始

按照以下快速步骤克隆虚拟机:

  1. 准备克隆清单

    创建一个名为 clone.yaml 的文件,内容结构如下:

    apiVersion: clone.kubevirt.io/v1beta1
    kind: VirtualMachineClone
    metadata:
      name: example-vm-clone
      namespace: ns-where-vm-run
    spec:
      source:
        apiGroup: kubevirt.io
        kind: VirtualMachine
        name: source-vm
      target:
        apiGroup: kubevirt.io
        kind: VirtualMachine
        name: target-vm
  2. 执行克隆操作

    应用该清单:

    kubectl create -f clone.yaml
  3. 监控克隆状态

    等待克隆成功完成:

    kubectl wait vmclone example-vm-clone --for condition=Ready
  4. 验证克隆的虚拟机

    查看克隆虚拟机的配置:

    kubectl get vm target-vm -o yaml
  5. 修正 DataVolume 标签(UI 元数据)

    平台 UI 通过标签 vm.cpaas.io/used-by=<vm-name> 将虚拟机与其磁盘关联,该标签会自动添加到每个 DataVolume。 克隆操作后,新创建的 DataVolume 会继承虚拟机的标签,因此 UI 仍然认为它属于旧虚拟机。 需要更新新创建的 DV 上的标签,使关系正确显示(功能不受影响)。

    # 列出虚拟机所在命名空间的 DataVolumes;克隆的 DV 名称通常以 "restore-" 开头
    kubectl get datavolumes -n <ns-where-vm-run>
    
    # 覆盖标签,指向克隆的虚拟机
    kubectl label datavolume <new-dv-name> -n <ns-where-vm-run> vm.cpaas.io/used-by=<target-vm> --overwrite

了解 VirtualMachineClone 对象

查看完整的 VirtualMachineClone 示例

以下是一个带有详细内联注释的完整 VirtualMachineClone 资源示例:

apiVersion: clone.kubevirt.io/v1beta1
kind: VirtualMachineClone
metadata:
  name: detailed-vm-clone
  namespace: ns-where-vm-run
spec:
  # 源虚拟机详情
  source:
    apiGroup: kubevirt.io
    kind: VirtualMachine
    name: vm-source

  # 目标虚拟机详情
  target:
    apiGroup: kubevirt.io
    kind: VirtualMachine
    name: vm-target

  # 从源虚拟机复制的标签和注解过滤器
  labelFilters:
    - "*"
    - "!exclude-key/*"
  annotationFilters:
    - "include-annotations/*"

  # 模板过滤器,用于管理网络相关注解
  template:
    labelFilters:
      - "*"
    annotationFilters:
      - "!network-info/*"

  # 显式设置新的 MAC 地址
  newMacAddresses:
    eth0: "02-00-00-aa-bb-cc"

  # 显式设置 SMBios 序列号
  newSMBiosSerial: "unique-serial-1234"

  # 用于进一步自定义克隆虚拟机的 JSON 补丁
  patches:
    - '{"op": "add", "path": "/metadata/labels/new-label", "value": "new-value"}'
    - '{"op": "replace", "path": "/spec/template/metadata/annotations/new-annotation", "value": "updated-value"}'

理解各字段含义

  • source 和 target

    • 定义原始虚拟机(source)和克隆虚拟机(target)。
    • 如果省略 target 名称,则自动生成。
    • 两个虚拟机必须位于同一命名空间内。
  • 标签和注解过滤器

    • 使用通配符(*)和否定(!)控制是否复制源虚拟机的标签和注解。
  • 模板标签和注解过滤器

    • 主要用于管理网络相关注解,尤其是使用 Kube-OVN 等 CNI 时。
  • newMacAddresses

    • 可选,指定网络接口的新 MAC 地址。
    • 如果省略,则自动重新生成。
  • newSMBiosSerial

    • 可选,指定新的 SMBios 序列号。
    • 如果未提供,则基于虚拟机名称自动生成。
  • JSON 补丁

    • 用于对虚拟机规格进行高级自定义。

检查克隆操作阶段

VirtualMachineClone 对象的 .status.phase 会根据克隆进度变化。下表说明了各阶段含义:

阶段说明
SnapshotInProgress正在创建源虚拟机的快照,克隆运行中虚拟机时的初始步骤。
CreatingTargetVM快照完成;正在创建目标虚拟机的元数据和规格。
RestoreInProgressDataVolume 和 PersistentVolumeClaim 创建中,正在从快照恢复数据。
Succeeded操作成功完成,目标虚拟机及存储已准备就绪。
Failed操作失败。请检查 eventsstatus.conditions 以获取详细错误信息。
Unknown无法确定克隆操作状态,可能表示控制器出现问题。