×

您可以添加或删除辅助网络接口,而无需停止虚拟机 (VM)。OpenShift Virtualization 支持对使用桥接绑定和 VirtIO 设备驱动程序的辅助接口进行热插拔和热拔出。OpenShift Virtualization 还支持热插拔使用 SR-IOV 绑定的辅助接口。

不支持单根 I/O 虚拟化 (SR-IOV) 接口的热拔出。

VirtIO 限制

每个 VirtIO 接口使用虚拟机中有限的周边连接接口 (PCI) 插槽中的一个。总共有 32 个可用插槽。PCI 插槽还被其他设备使用,并且必须预先保留,因此可能无法按需提供插槽。OpenShift Virtualization 为热插拔接口保留最多四个插槽。这包括任何已插入的现有网络接口。例如,如果您的虚拟机有两个已插入的现有接口,则可以热插拔两个更多网络接口。

可用于热插拔的插槽的实际数量也取决于机器类型。例如,q35 机器类型的默认 PCI 拓扑支持热插拔一个额外的 PCIe 设备。有关 PCI 拓扑和热插拔支持的更多信息,请参阅libvirt 文档

如果在热插拔接口后重新启动虚拟机,该接口将成为标准网络接口的一部分。

使用 CLI 热插拔辅助网络接口

在虚拟机 (VM) 运行时,将辅助网络接口热插拔到虚拟机 (VM)。

先决条件
  • 网络附加定义在与您的虚拟机相同的命名空间中配置。

  • 您已安装 virtctl 工具。

  • 您已安装 OpenShift CLI (oc)。

步骤
  1. 如果要向其热插拔网络接口的虚拟机未运行,请使用以下命令启动它

    $ virtctl start <vm_name> -n <namespace>
  2. 使用以下命令将新的网络接口添加到正在运行的虚拟机。编辑虚拟机规范会将新的网络接口添加到虚拟机和虚拟机实例 (VMI) 配置,但不会将其附加到正在运行的虚拟机。

    $ oc edit vm <vm_name>
    虚拟机配置示例
    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: vm-fedora
    template:
      spec:
        domain:
          devices:
            interfaces:
            - name: defaultnetwork
              masquerade: {}
            # new interface
            - name: <secondary_nic> (1)
              bridge: {}
        networks:
        - name: defaultnetwork
          pod: {}
        # new network
        - name: <secondary_nic> (2)
          multus:
            networkName: <nad_name> (3)
    # ...
    1 指定新网络接口的名称。
    2 指定网络的名称。这必须与您在 template.spec.domain.devices.interfaces 列表中定义的新网络接口的 name 相同。
    3 指定 NetworkAttachmentDefinition 对象的名称。
  3. 要将网络接口附加到正在运行的虚拟机,请通过运行以下命令实时迁移虚拟机

    $ virtctl migrate <vm_name>
验证
  1. 使用以下命令验证虚拟机实时迁移是否成功

    $ oc get VirtualMachineInstanceMigration -w
    示例输出
    NAME                        PHASE             VMI
    kubevirt-migrate-vm-lj62q   Scheduling        vm-fedora
    kubevirt-migrate-vm-lj62q   Scheduled         vm-fedora
    kubevirt-migrate-vm-lj62q   PreparingTarget   vm-fedora
    kubevirt-migrate-vm-lj62q   TargetReady       vm-fedora
    kubevirt-migrate-vm-lj62q   Running           vm-fedora
    kubevirt-migrate-vm-lj62q   Succeeded         vm-fedora
  2. 通过检查 VMI 状态来验证新接口是否已添加到虚拟机

    $ oc get vmi vm-fedora -ojsonpath="{ @.status.interfaces }"
    示例输出
    [
      {
        "infoSource": "domain, guest-agent",
        "interfaceName": "eth0",
        "ipAddress": "10.130.0.195",
        "ipAddresses": [
          "10.130.0.195",
          "fd02:0:0:3::43c"
        ],
        "mac": "52:54:00:0e:ab:25",
        "name": "default",
        "queueCount": 1
      },
      {
        "infoSource": "domain, guest-agent, multus-status",
        "interfaceName": "eth1",
        "mac": "02:d8:b8:00:00:2a",
        "name": "bridge-interface", (1)
        "queueCount": 1
      }
    ]
    1 热插拔接口显示在 VMI 状态中。

使用 CLI 热拔出辅助网络接口

您可以从正在运行的虚拟机 (VM) 中删除辅助网络接口。

不支持单根 I/O 虚拟化 (SR-IOV) 接口的热拔出。

先决条件
  • 您的虚拟机必须正在运行。

  • 虚拟机必须在运行 OpenShift Virtualization 4.14 或更高版本的集群上创建。

  • 虚拟机必须附加桥接网络接口。

步骤
  1. 编辑虚拟机规范以热拔出辅助网络接口。将接口状态设置为 absent 会将网络接口与客户机分离,但接口仍存在于 Pod 中。

    $ oc edit vm <vm_name>
    虚拟机配置示例
    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: vm-fedora
    template:
      spec:
        domain:
          devices:
            interfaces:
              - name: defaultnetwork
                masquerade: {}
              # set the interface state to absent
              - name: <secondary_nic>
                state: absent (1)
                bridge: {}
        networks:
          - name: defaultnetwork
            pod: {}
          - name: <secondary_nic>
            multus:
              networkName: <nad_name>
    # ...
    1 将接口状态设置为 absent 以将其与正在运行的虚拟机分离。从虚拟机规范中删除接口详细信息不会热拔出辅助网络接口。
  2. 通过迁移虚拟机从 Pod 中删除接口

    $ virtctl migrate <vm_name>