6.11. 虚拟机网络

6.11.1. 为虚拟机使用默认 Pod 网络

您可以将默认 Pod 网络用于容器原生虚拟化。为此,您必须使用 masquerade 绑定方法。这是用于默认 Pod 网络的唯一推荐绑定方法。不要将 masquerade 模式用于非默认网络。

注意

对于辅助网络,请使用 bridge 绑定方法。

6.11.1.1. 从命令行配置伪装模式

您可使用伪装模式将虚拟机的外发流量隐藏在 Pod IP 地址后。伪装模式使用网络地址转换 (NAT) 来通过 Linux 网桥将虚拟机连接至 Pod 网络后端。

启用伪装模式,并通过编辑虚拟机配置文件让流量进入虚拟机。

先决条件

  • 虚拟机必须配置为使用 DHCP 来获取 IPv4 地址。以下示例配置为使用 DHCP。

流程

  1. 编辑虚拟机配置文件的 interfaces 规格:

    kind: VirtualMachine
    spec:
      domain:
        devices:
          interfaces:
            - name: red
              masquerade: {} 1
              ports:
                - port: 80 2
      networks:
      - name: red
        pod: {}
    1
    使用伪装模式进行连接
    2
    允许通过 80 端口传入流量
  2. 创建虚拟机:

    $ oc create -f <vm-name>.yaml

6.11.1.2. 选择绑定方法

如果从容器原生虚拟化 web 控制台向导创建虚拟机,请从 Networking 屏幕选择所需绑定方法。

6.11.1.2.1. 网络字段
名称描述

名称

网络接口卡的名称

Model

网络接口卡的驱动或网络接口卡的型号。

网络

可用 NetworkAttachmentDefinition 对象列表。

类型

可用绑定方法列表。对于默认的 Pod 网络,masquerade 是唯一推荐的绑定方法。对于辅助网络,请使用 bridge 绑定方法。非默认网络不支持 masquerade 绑定方法。

MAC 地址

网络接口卡的 MAC 地址。如果未指定 MAC 地址,将为会话生成一个临时地址。

6.11.1.3. 默认网络的虚拟机配置示例

6.11.1.3.1. 模板:虚拟机配置文件
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachine
metadata:
  name: example-vm
  namespace: default
spec:
  running: false
  template:
    spec:
      domain:
        devices:
          disks:
            - name: containerdisk
              disk:
                bus: virtio
            - name: cloudinitdisk
              disk:
                bus: virtio
          interfaces:
          - masquerade: {}
            name: default
        resources:
          requests:
            memory: 1024M
      networks:
        - name: default
          pod: {}
      volumes:
        - name: containerdisk
          containerDisk:
            image: kubevirt/fedora-cloud-container-disk-demo
        - name: cloudinitdisk
          cloudInitNoCloud:
            userData: |
              #!/bin/bash
              echo "fedora" | passwd fedora --stdin
6.11.1.3.2. 模板:Windows 虚拟机实例配置文件
apiVersion: kubevirt.io/v1alpha3
kind: VirtualMachineInstance
metadata:
  labels:
    special: vmi-windows
  name: vmi-windows
spec:
  domain:
    clock:
      timer:
        hpet:
          present: false
        hyperv: {}
        pit:
          tickPolicy: delay
        rtc:
          tickPolicy: catchup
      utc: {}
    cpu:
      cores: 2
    devices:
      disks:
      - disk:
          bus: sata
        name: pvcdisk
      interfaces:
      - masquerade: {}
        model: e1000
        name: default
    features:
      acpi: {}
      apic: {}
      hyperv:
        relaxed: {}
        spinlocks:
          spinlocks: 8191
        vapic: {}
    firmware:
      uuid: 5d307ca9-b3ef-428c-8861-06e72d69f223
    machine:
      type: q35
    resources:
      requests:
        memory: 2Gi
  networks:
  - name: default
    pod: {}
  terminationGracePeriodSeconds: 0
  volumes:
  - name: pvcdisk
    persistentVolumeClaim:
      claimName: disk-windows

6.11.2. 将虚拟机附加到多个网络

容器原生虚拟化提供第 2 层网络功能,支持将虚拟机连接至多个网络。您可使用现有工作负载导入虚拟机,具体取决于对多个接口的访问权限。您还可配置 PXE 网络以便可通过网络启动机器。

要开始工作,网络管理员将为 web 控制台或 CLI 中的命名空间配置桥接 NetworkAttachmentDefinition。然后,用户可以创建一个 vNIC 来将该命名空间中的 Pod 和虚拟机附加到桥接网络。

6.11.2.1. 容器原生虚拟化网络术语表

容器原生虚拟化使用自定义资源和插件提供高级联网功能。

以下是整个容器原生虚拟化文档中使用的术语:

Container Network Interface (CNI)
一个 Cloud Native Computing Foundation 项目,侧重容器网络连接。容器原生虚拟化使用 CNI 插件基于基本 Kubernetes 网络功能进行构建。
Multus
一个“meta”CNI 插件,支持多个 CNI 共存,以便 Pod 或虚拟机可使用其所需的接口。
自定义资源定义 (CRD)
一种 Kubernetes API 资源,用于定义自定义资源,或使用 CRD API 资源定义的对象。
NetworkAttachmentDefinition
一种由 Multus 项目引入的 CRD,用于向一个或多个网络附加 Pod、虚拟机和虚拟机实例。
预启动执行环境 (PXE)
一种接口,让管理员能够通过网络从服务器启动客户端机器。网络启动可用于为客户端远程加载操作系统和其他软件。

6.11.2.2. 创建 NetworkAttachmentDefinition

6.11.2.2.1. 在 Web 控制台中创建 Linux 网桥 NetworkAttachmentDefinition

NetworkAttachmentDefinition 是一个自定义资源,可向容器原生虚拟化集群中的特定命名空间公开第 2 层设备。

网络管理员可创建 NetworkAttachmentDefinition,以向 Pod 和虚拟机提供现有的第 2 层网络。

先决条件

  • 集群上安装了容器原生虚拟化 2.2 或更高版本。
  • 必须在每个节点上配置一个 Linux 网桥,并将其附加到正确的网络接口卡 (NIC)。
  • 如果使用 VLAN,则必须在网桥上启用 vlan_filtering
  • NIC 必须标记到所有相关 VLAN。

    • 例如:bridge vlan add dev bond0 vid 1-4095 master

流程

  1. 在 Web 控制台中,点击 NetworkingNetwork Attachment Definitions
  2. 点击 Create Network Attachment Definition
  3. 输入唯一 Name 和可选 Description
  4. 点击 Network Type 列表并选择 CNV Linux bridge
  5. Bridge Name 字段输入网桥名称。
  6. (可选)如果资源配置了 VLAN ID,请在 VLAN Tag Number 字段中输入 ID 号。
  7. 点击 Create
6.11.2.2.2. 在 CLI 中创建 Linux 网桥 NetworkAttachmentDefinition

作为网络管理员,您可配置 cnv-bridge 类型的 NetworkAttachmentDefinition,为 Pod 和虚拟机提供第 2 层网络。

注意

NetworkAttachmentDefinition 必须与 Pod 或虚拟机位于同一个命名空间中。

先决条件

  • 容器原生虚拟化 2.0 或更新版本
  • 必须在每个节点上配置一个 Linux 网桥,并将其附加到正确的网络接口卡。
  • 如果使用 VLAN,则必须在网桥上启用 vlan_filtering
  • NIC 必须标记到所有相关 VLAN。

    • 例如:bridge vlan add dev bond0 vid 1-4095 master

流程

  1. 在任何本地目录中为 NetworkAttachmentDefinition 新建一个新文件。该文件必须具有以下内容,并修改以匹配您的配置:

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: a-bridge-network
      annotations:
        k8s.v1.cni.cncf.io/resourceName: bridge.network.kubevirt.io/br0 1
    spec:
      config: '{
        "cniVersion": "0.3.1",
        "name": "cnv-bridge-conf", 2
        "plugins": [
          {
            "type": "cnv-bridge", 3
            "bridge": "br0" 4
          },
          {
            "type": "cnv-tuning" 5
          }
        ]
      }'
    1
    如果添加此注解到 NetworkAttachmentDefinition,您的虚拟机实例将只在连接 br0 网桥的节点上运行。
    2
    必需。配置名称。
    3
    为该 NetworkAttachmentDefinition 提供网络的 Container Network Interface (CNI) 插件的实际名称。不要更改此字段,除非要使用不同的 CNI。
    4
    如果该值不是 br0,则必须替换网桥的实际名称。
    5
    必需。MAC 池管理器可通过此项为连接分配唯一的 MAC 地址。
    $ oc create -f <resource_spec.yaml>
  2. 编辑要连接至桥接网络的虚拟机或虚拟机实例的配置文件:

    apiVersion: v1
    kind: VirtualMachine
    metadata:
      name: example-vm
      annotations:
        k8s.v1.cni.cncf.io/networks: a-bridge-network 1
    spec:
    ...
    1
    您必须替换来自 NetworkAttachmentDefinition 的实际 name 值。
  3. 向资源应用配置文件:

    $ oc create -f <local/path/to/network-attachment-definition.yaml>
注意

当在下一部分中定义 vNIC 时,请确保 NETWORK 值是来自您在上一部分中创建的 NetworkAttachmentDefinition 的桥接网络名称。

6.11.2.3. 为虚拟机创建 NIC

从 web 控制台创建并附加额外 NIC。

流程

  1. 在容器原生虚拟化控制台的正确项目中,点击 WorkloadsVirtual Machines
  2. 选择虚拟机。
  3. 点击 Network Interfaces 以显示已附加到虚拟机的 NIC。
  4. 点击 Create Network Interface 在列表中创建新插槽。
  5. 填写新 NIC 的 NameModelNetworkTypeMAC Address
  6. 点击 按钮保存并附加 NIC 到虚拟机。

6.11.2.4. 网络字段

名称描述

名称

网络接口卡的名称

Model

网络接口卡的驱动或网络接口卡的型号。

网络

可用 NetworkAttachmentDefinition 对象列表。

类型

可用绑定方法列表。对于默认的 Pod 网络,masquerade 是唯一推荐的绑定方法。对于辅助网络,请使用 bridge 绑定方法。非默认网络不支持 masquerade 绑定方法。

MAC 地址

网络接口卡的 MAC 地址。如果未指定 MAC 地址,将为会话生成一个临时地址。

在虚拟机上安装可选 QEMU 客户机代理,以便主机可以显示附加网络相关信息。

6.11.3. 在虚拟机上安装 QEMU 客户机代理

QEMU 客户机代理是在虚拟机上运行的守护进程。代理将虚拟机上的网络信息(尤其是附加网络的 IP 地址)传递给主机。

6.11.3.1. 先决条件

  • 通过输入以下命令验证客户机代理是否已安装并正在运行:

    $ systemctl status qemu-guest-agent

6.11.3.2. 在 Linux 虚拟机上安装 QEMU 客户机代理

qemu-guest-agent 广泛可用,默认在红帽虚拟机中可用。安装代理并启动服务

流程

  1. 通过其中一个控制台或通过 SSH 访问虚拟机命令行。
  2. 在虚拟机上安装 QEMU 客户机代理:

    $ yum install -y qemu-guest-agent
  3. 启动 QEMU 客户机代理服务:

    $ systemctl start qemu-guest-agent
  4. 确保服务持久:

    $ systemctl enable qemu-guest-agent

在 web 控制台中创建虚拟机或虚拟机模板时,您还可使用向导的 cloud-init 部分中的 custom script 字段来安装和启动 QEMU 客户机代理。

6.11.3.3. 在 Windows 虚拟机上安装 QEMU 客户机代理

对于 Windows 虚拟机,QEMU 客户机代理包含在 VirtIO 驱动程序中,该驱动程序可使用以下流程之一进行安装:

6.11.3.3.1. 在现有 Windows 虚拟机上安装 VirtIO 驱动程序

从附加的 SATA CD 驱动器将 VirtIO 驱动程序安装到现有 Windows 虚拟机。

注意

该流程使用通用方法为 Windows 添加驱动。具体流程可能会因 Windows 版本而稍有差异。有关具体安装步骤请参考您的 Windows 版本安装文档。

流程

  1. 启动虚拟机并连接至图形控制台。
  2. 登录 Windows 用户会话。
  3. 打开 Device Manager 并展开 Other devices 以列出所有 Unknown device

    1. 打开 Device Properties 以识别未知设备。右击设备并选择 Properties
    2. 单击 Details 选项卡,并在 Property 列表中选择 Hardware Ids
    3. Hardware IdsValue 与受支持的 VirtIO 驱动程序相比较。
  4. 右击设备并选择 Update Driver Software
  5. 点击 Browse my computer for driver software 并浏览所附加的 VirtIO 驱动程序所在 SATA CD 驱动器。驱动程序将按照其驱动程序类型、操作系统和 CPU 架构分层排列。
  6. 点击 Next 以安装驱动程序。
  7. 对所有必要 VirtIO 驱动程序重复这一过程。
  8. 安装完驱动程序后,点击 Close 关闭窗口。
  9. 重启虚拟机以完成驱动程序安装。
6.11.3.3.2. 在 Windows 安装过程中安装 VirtIO 驱动程序

在 Windows 安装过程中,从附加的 SATA CD 驱动程序安装 VirtIO 驱动程序。

注意

该流程使用通用方法安装 Windows,且安装方法可能因 Windows 版本而异。有关您正在安装的 Windows 版本,请参阅相关文档。

流程

  1. 启动虚拟机并连接至图形控制台。
  2. 开始 Windows 安装过程。
  3. 选择 Advanced 安装。
  4. 加载驱动程序前无法识别存储目的地。点击 Load driver
  5. 驱动程序将附加为 SATA CD 驱动器。点击 OK 并浏览 CD 驱动器以加载存储驱动程序。驱动程序将按照其驱动程序类型、操作系统和 CPU 架构分层排列。
  6. 对所有所需驱动程序重复前面两步。
  7. 完成 Windows 安装。

6.11.4. 在虚拟机上查看 NIC 的 IP 地址

QEMU 客户机代理在虚拟机上运行,并会将附加 NIC 的 IP 地址传递给主机,以便您可以通过 web 控制台和 oc 客户端查看 IP 地址。

6.11.4.1. 先决条件

  1. 通过输入以下命令验证客户机代理是否已安装并正在运行:

    $ systemctl status qemu-guest-agent
  2. 如果客户机代理没有安装和运行,请在虚拟机上安装并运行客户机代理

6.11.4.2. 在 CLI 中查看虚拟机接口的 IP 地址

oc describe vmi <vmi_name> 命令中包含网络接口配置。

您还可通过在虚拟机上运行 ip addr 或通过运行 oc get vmi <vmi_name> -o yaml 来查看 IP 地址信息。

流程

  • 使用 oc describe 命令来显示虚拟机接口配置:

    $ oc describe vmi <vmi_name>
    
    ...
    Interfaces:
       Interface Name:  eth0
       Ip Address:      10.244.0.37/24
       Ip Addresses:
         10.244.0.37/24
         fe80::858:aff:fef4:25/64
       Mac:             0a:58:0a:f4:00:25
       Name:            default
       Interface Name:  v2
       Ip Address:      1.1.1.7/24
       Ip Addresses:
         1.1.1.7/24
         fe80::f4d9:70ff:fe13:9089/64
       Mac:             f6:d9:70:13:90:89
       Interface Name:  v1
       Ip Address:      1.1.1.1/24
       Ip Addresses:
         1.1.1.1/24
         1.1.1.2/24
         1.1.1.4/24
         2001:de7:0:f101::1/64
         2001:db8:0:f101::1/64
         fe80::1420:84ff:fe10:17aa/64
       Mac:             16:20:84:10:17:aa

6.11.4.3. 在 web 控制台中查看虚拟机接口的 IP 地址

IP 信息显示在虚拟机的 Virtual Machine Overview 屏幕中。

流程

  1. 在容器原生虚拟化控制台中,点击 WorkloadsVirtual Machines
  2. 点击虚拟机名称以打开 Virtual Machine Overview 屏幕。

每个附加 NIC 的信息会显示在 IP ADDRESSES 下。