8.18. 虚拟机网络

8.18.1. 为默认 pod 网络配置虚拟机

您可以通过将其网络接口配置为使用 masquerade 绑定模式,将虚拟机连接到默认的内部 pod 网络

注意

附加到默认 pod 网络的虚拟网络接口卡 (vNIC) 上的流量在实时迁移过程中中断。

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

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

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

先决条件

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

流程

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

    kind: VirtualMachine
    spec:
      domain:
        devices:
          interfaces:
            - name: default
              masquerade: {} 1
              ports: 2
                - port: 80
      networks:
      - name: default
        pod: {}
    1
    使用伪装模式进行连接。
    2
    可选:列出您要从虚拟机公开的端口,每个都由 port 字段指定。port 值必须是 0 到 65536 之间的数字。如果没有使用 port 数组,则有效范围内的所有端口都开放给传入流量。在本例中,端口 80 上允许传入的流量。
    注意

    端口 49152 和 49153 保留供 libvirt 平台使用,这些端口的所有其他传入流量将被丢弃。

  2. 创建虚拟机:

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

8.18.1.2. 使用双栈(IPv4 和 IPv6)配置伪装模式

您可以使用 cloud-init 将新虚拟机配置为在默认 pod 网络上同时使用 IPv6 和 IPv4。

虚拟机实例配置中的 Network.pod.vmIPv6NetworkCIDR 字段决定虚拟机的静态 IPv6 地址和网关 IP 地址。virt-launcher Pod 使用它们将 IPv6 流量路由到虚拟机,而不在外部使用。Network.pod.vmIPv6NetworkCIDR 字段在无类别域间路由(CIDR)标记中指定一个 IPv6 地址块。默认值为 fd10:0:2::2/120。您可以根据网络要求编辑这个值。

当虚拟机运行时,虚拟机的传入和传出流量将路由到 IPv4 地址和 virt-launcher Pod 的唯一 IPv6 地址。virt-launcher pod 随后将 IPv4 流量路由到虚拟机的 DHCP 地址,并将 IPv6 流量路由到虚拟机的静态设置 IPv6 地址。

先决条件

  • OpenShift Container Platform 集群必须使用为 dual-stack 配置的 OVN-Kubernetes Container Network Interface(CNI)网络供应商。

流程

  1. 在新的虚拟机配置中,包含具有 masquerade 的接口,并使用 cloud-init 配置 IPv6 地址和默认网关。

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: example-vm-ipv6
    ...
              interfaces:
                - name: default
                  masquerade: {} 1
                  ports:
                    - port: 80 2
          networks:
          - name: default
            pod: {}
          volumes:
          - cloudInitNoCloud:
              networkData: |
                version: 2
                ethernets:
                  eth0:
                    dhcp4: true
                    addresses: [ fd10:0:2::2/120 ] 3
                    gateway6: fd10:0:2::1 4
    1
    使用伪装模式进行连接。
    2
    允许虚拟机上端口 80 上的传入流量。
    3
    由虚拟机实例配置中的 Network.pod.vmIPv6NetworkCIDR 字段确定的静态 IPv6 地址。默认值为 fd10:0:2::2/120
    4
    网关 IP 地址由虚拟机实例配置中的 Network.pod.vmIPv6NetworkCIDR 字段决定。默认值为 fd10:0:2::1
  2. 在命名空间中创建虚拟机:

    $ oc create -f example-vm-ipv6.yaml

验证

  • 要验证 IPv6 是否已配置,启动虚拟机并查看虚拟机实例的接口状态,以确保它具有 IPv6 地址:
$ oc get vmi <vmi-name> -o jsonpath="{.status.interfaces[*].ipAddresses}"

8.18.2. 创建服务以公开虚拟机

您可以使用 Service 对象在集群内或集群外部公开虚拟机。

8.18.2.1. 关于服务

一个 Kubernetes 服务是一个抽象的方式,用于公开在一组 pod 上运行的应用程序作为网络服务。服务允许您的应用程序接收流量。通过在 Service 对象中指定 spec.type,可以使用不同的方式公开服务:

ClusterIP
在集群中的内部 IP 地址上公开服务。ClusterIP 是默认服务类型
NodePort
在集群中每个所选节点的同一端口上公开该服务。NodePort 使服务可从集群外部访问。
LoadBalancer
在当前云中创建外部负载均衡器(如果支持),并为该服务分配固定的外部 IP 地址。
8.18.2.1.1. 双栈支持

如果为集群启用了 IPv4 和 IPv6 双栈网络,您可以通过定义 Service 对象中的 spec.ipFamilyPolicyspec.ipFamilies 字段来创建使用 IPv4、IPv6 或两者的服务。

spec.ipFamilyPolicy 字段可以设置为以下值之一:

SingleStack
control plane 根据配置的第一个服务集群 IP 范围为该服务分配集群 IP 地址。
PreferDualStack
control plane 为配置了双栈的集群中的服务分配 IPv4 和 IPv6 集群 IP 地址。
RequireDualStack
对于没有启用双栈网络的集群,这个选项会失败。对于配置了双栈的集群,其行为与将值设置为 PreferDualStack 时相同。control plane 从 IPv4 和 IPv6 地址范围分配集群 IP 地址。

您可以通过将 spec.ipFamilies 字段设置为以下数组值之一来定义用于单堆栈的 IP 系列,或者定义双栈 IP 系列的顺序:

  • [IPv4]
  • [IPv6]
  • [IPv4, IPv6]
  • [IPv6, IPv4]

8.18.2.2. 将虚拟机作为服务公开

创建 ClusterIPNodePortLoadBalancer 服务,以便从集群内部或外部连接到正在运行的虚拟机 (VM)。

流程

  1. 编辑 VirtualMachine 清单,为创建服务添加标签:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: vm-ephemeral
      namespace: example-namespace
    spec:
      running: false
      template:
        metadata:
          labels:
            special: key 1
    # ...
    1
    spec.template.metadata.labels 部分添加标签 special: key
    注意

    虚拟机上的标签会传递到 pod。special: key 标签必须与 Service 清单的 spec.selector 属性中的标签匹配。

  2. 保存 VirtualMachine 清单文件以应用更改。
  3. 创建 Service 清单以公开虚拟机:

    apiVersion: v1
    kind: Service
    metadata:
      name: vmservice 1
      namespace: example-namespace 2
    spec:
      externalTrafficPolicy: Cluster 3
      ports:
      - nodePort: 30000 4
        port: 27017
        protocol: TCP
        targetPort: 22 5
      selector:
        special: key 6
      type: NodePort 7
    1
    Service 对象的名称。
    2
    Service 对象所在的命名空间。这必须与 VirtualMachine 清单的 metadata.namespace 字段匹配。
    3
    可选:指定节点如何分发在外部 IP 地址上接收的服务流量。这只适用于 NodePortLoadBalancer 服务类型。默认值为 Cluster,它将流量平均路由到所有集群端点。
    4
    可选:设置后,nodePort 值必须在所有服务间是唯一的。如果没有指定,则会动态分配以上 30000 范围中的值。
    5
    可选:由服务公开的虚拟机端口。如果虚拟机清单中定义了端口列表,则必须引用打开端口。如果没有指定 targetPort,它将采用与 port 相同的值。
    6
    对您在 VirtualMachine 清单的 spec.template.metadata.labels 小节中添加的标签的引用。
    7
    服务的类型。可能的值有 ClusterIPNodePortLoadBalancer
  4. 保存 Service 清单文件。
  5. 运行以下命令来创建服务:

    $ oc create -f <service_name>.yaml
  6. 启动虚拟机。如果虚拟机已在运行,重启它。

验证

  1. 查询 Service 对象以验证它是否可用:

    $ oc get service -n example-namespace

    ClusterIP 服务的输出示例

    NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
    vmservice   ClusterIP   172.30.3.149   <none>        27017/TCP   2m

    NodePort 服务的输出示例

    NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)            AGE
    vmservice   NodePort    172.30.232.73   <none>       27017:30000/TCP    5m

    LoadBalancer 服务的输出示例

    NAME        TYPE            CLUSTER-IP     EXTERNAL-IP                    PORT(S)           AGE
    vmservice   LoadBalancer    172.30.27.5   172.29.10.235,172.29.10.235     27017:31829/TCP   5s

  2. 选择连接到虚拟机的适当方法:

    • 对于 ClusterIP 服务,使用服务 IP 地址和服务端口从集群内部连接到虚拟机。例如:

      $ ssh fedora@172.30.3.149 -p 27017
    • 对于 NodePort 服务,通过指定节点 IP 地址和集群网络之外的节点端口来连接到虚拟机。例如:

      $ ssh fedora@$NODE_IP -p 30000
    • 对于 LoadBalancer 服务,使用 vinagre 客户端使用公共 IP 地址和端口连接到虚拟机。外部端口是动态分配的。

8.18.2.3. 其他资源

8.18.3. 将虚拟机连接到 Linux 网桥网络

默认情况下,OpenShift Virtualization 安装了一个内部 pod 网络。

您必须创建一个 Linux 网桥网络附加定义(NAD)以连接到额外网络。

将虚拟机附加到额外网络:

  1. 创建 Linux 网桥节点网络配置策略。
  2. 创建 Linux 网桥网络附加定义。
  3. 配置虚拟机,使虚拟机能够识别网络附加定义。

有关调度、接口类型和其他节点网络活动的更多信息,请参阅节点网络部分

8.18.3.1. 通过网络附加定义连接到网络

8.18.3.1.1. 创建 Linux 网桥节点网络配置策略

使用 NodeNetworkConfigurationPolicy 清单 YAML 文件来创建 Linux 网桥。

流程

  • 创建 NodeNetworkConfigurationPolicy 清单。本例包含示例值,您必须替换为您自己的信息。

    apiVersion: nmstate.io/v1
    kind: NodeNetworkConfigurationPolicy
    metadata:
      name: br1-eth1-policy 1
    spec:
      desiredState:
        interfaces:
          - name: br1 2
            description: Linux bridge with eth1 as a port 3
            type: linux-bridge 4
            state: up 5
            ipv4:
              enabled: false 6
            bridge:
              options:
                stp:
                  enabled: false 7
              port:
                - name: eth1 8
    1
    策略的名称。
    2
    接口的名称。
    3
    可选:接口人类可读的接口描述。
    4
    接口的类型。这个示例会创建一个桥接。
    5
    创建后接口的请求状态。
    6
    在这个示例中禁用 IPv4。
    7
    在这个示例中禁用 STP。
    8
    网桥附加到的节点 NIC。

8.18.3.2. 创建 Linux 网桥网络附加定义

警告

不支持在虚拟机的网络附加定义中配置 IP 地址管理(IPAM)。

8.18.3.2.1. 在 web 控制台中创建 Linux 网桥网络附加定义

网络管理员可创建网络附加定义,为 Pod 和虚拟机提供第 2 层网络。

流程

  1. 在 Web 控制台中,点击 NetworkingNetwork Attachment Definitions
  2. Create Network Attachment Definition

    注意

    网络附加定义必须与 pod 或虚拟机位于同一个命名空间中。

  3. 输入唯一 Name 和可选 Description
  4. 点击 Network Type 列表并选择 CNV Linux bridge
  5. Bridge Name 字段输入网桥名称。
  6. 可选:如果资源配置了 VLAN ID,请在 VLAN Tag Number 字段中输入 ID 号。
  7. 可选: 选择 MAC Spoof Check 来启用 MAC spoof 过滤。此功能只允许单个 MAC 地址退出 pod,从而可以防止使用 MAC 欺骗进行的安全攻击。
  8. Create

    注意

    Linux 网桥网络附加定义是将虚拟机连接至 VLAN 的最有效方法。

8.18.3.2.2. 在 CLI 中创建 Linux 网桥网络附加定义

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

先决条件

  • 节点必须支持 nftables,必须部署 nft 二进制文件才能启用 MAC 欺骗检查。

流程

  1. 在与虚拟机相同的命名空间中创建网络附加定义。
  2. 在网络附加定义中添加虚拟机,如下例所示:

    apiVersion: "k8s.cni.cncf.io/v1"
    kind: NetworkAttachmentDefinition
    metadata:
      name: <bridge-network> 1
      annotations:
        k8s.v1.cni.cncf.io/resourceName: bridge.network.kubevirt.io/<bridge-interface> 2
    spec:
      config: '{
        "cniVersion": "0.3.1",
        "name": "<bridge-network>", 3
        "type": "cnv-bridge", 4
        "bridge": "<bridge-interface>", 5
        "macspoofchk": true, 6
        "vlan": 1 7
      }'
    1
    NetworkAttachmentDefinition 对象的名称。
    2
    可选:为节点选择注解键值对,其中 bridge-interface 必须与某些节点上配置的桥接名称匹配。如果在网络附加定义中添加此注解,您的虚拟机实例将仅在连接 bridge-interface 网桥的节点中运行。
    3
    配置的名称。建议您将配置名称与网络附加定义的 name 值匹配。
    4
    为这个网络附加定义的 Container Network Interface(CNI)插件的实际名称。不要更改此字段,除非要使用不同的 CNI。
    5
    节点上配置的 Linux 网桥名称。
    6
    可选:启用 MAC 欺骗检查。当设置为 true 时,您无法更改 pod 或客户机接口的 MAC 地址。此属性仅允许单个 MAC 地址退出容器集,从而防止 MAC 欺骗攻击。
    7
    可选: VLAN 标签。节点网络配置策略不需要额外的 VLAN 配置。
    注意

    Linux 网桥网络附加定义是将虚拟机连接至 VLAN 的最有效方法。

  3. 创建网络附加定义:

    $ oc create -f <network-attachment-definition.yaml> 1
    1
    其中 <network-attachment-definition.yaml> 是网络附加定义清单的文件名。

验证

  • 运行以下命令验证网络附加定义是否已创建:

    $ oc get network-attachment-definition <bridge-network>

8.18.3.3. 为 Linux 网桥网络配置虚拟机

8.18.3.3.1. 在 web 控制台中为虚拟机创建 NIC

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

先决条件

  • 网络附加定义必须可用。

流程

  1. 在 OpenShift Container Platform 控制台的正确项目中,从侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机以打开 VirtualMachine 详情页面。
  3. Network Interfaces 选项卡查看已附加到虚拟机的 NIC。
  4. Add Network Interface 在列表中创建新插槽。
  5. Network 列表中选择额外网络的网络附加定义。
  6. 填写新 NIC 的 NameModelTypeMAC Address
  7. Save 保存并附加 NIC 到虚拟机。
8.18.3.3.2. 网络字段
名称描述

Name

网络接口控制器的名称。

model

指明网络接口控制器的型号。支持的值有 e1000evirtio

网络

可用网络附加定义的列表。

类型

可用绑定方法列表。选择适合网络接口的绑定方法:

  • 默认 pod 网络:masquerade
  • Linux 网桥网络:bridge
  • SR-IOV 网络: SR-IOV

MAC 地址

网络接口控制器的 MAC 地址。如果没有指定 MAC 地址,则会自动分配一个。

8.18.3.3.3. 在 CLI 中将虚拟机附加到额外网络

通过添加桥接接口并在虚拟机配置中指定网络附加定义,将虚拟机附加到额外网络。

此流程使用 YAML 文件来演示编辑配置,并将更新的文件应用到集群。您还可以使用 oc edit <object> <name> 命令编辑现有虚拟机。

先决条件

  • 在编辑配置前关闭虚拟机。如果编辑正在运行的虚拟机,您必须重启虚拟机才能使更改生效。

流程

  1. 创建或编辑您要连接到桥接网络的虚拟机的配置。
  2. 将网桥接口添加到 spec.template.spec.domain.devices.interfaces 列表中,把网络附加定义添加到 spec.template.spec.networks 列表中。这个示例添加了名为 bridge-net 的桥接接口,它连接到 a-bridge-network 网络附加定义:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
        name: <example-vm>
    spec:
      template:
        spec:
          domain:
            devices:
              interfaces:
                - masquerade: {}
                  name: <default>
                - bridge: {}
                  name: <bridge-net> 1
    ...
          networks:
            - name: <default>
              pod: {}
            - name: <bridge-net> 2
              multus:
                networkName: <network-namespace>/<a-bridge-network> 3
    ...
    1
    网桥接口的名称。
    2
    网络的名称。这个值必须与对应的 spec.template.spec.domain.devices.interfaces 条目的 name 值匹配。
    3
    网络附加定义的名称,并以其存在的命名空间为前缀。命名空间必须是 default 命名空间或创建虚拟机的同一命名空间。本例中使用 multus。Multus 是一个云网络接口(CNI)插件,它支持多个 CNI 存在,以便 pod 或虚拟机可以使用它所需的接口。
  3. 应用配置:

    $ oc apply -f <example-vm.yaml>
  4. 可选:如果编辑了正在运行的虚拟机,您必须重启它才能使更改生效。

8.18.4. 将虚拟机连接到 SR-IOV 网络

您可以通过执行以下步骤将虚拟机 (VM) 连接到单根 I/O 虚拟化 (SR-IOV) 网络:

  1. 配置 SR-IOV 网络设备。
  2. 配置 SR-IOV 网络。
  3. 将虚拟机连接到 SR-IOV 网络。

8.18.4.1. 先决条件

8.18.4.2. 配置 SR-IOV 网络设备

SR-IOV Network Operator 把 SriovNetworkNodePolicy.sriovnetwork.openshift.io CRD 添加到 OpenShift Container Platform。您可以通过创建一个 SriovNetworkNodePolicy 自定义资源 (CR) 来配置 SR-IOV 网络设备。

注意

当应用由 SriovNetworkNodePolicy 对象中指定的配置时,SR-IOV Operator 可能会排空节点,并在某些情况下会重启节点。

它可能需要几分钟时间来应用配置更改。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 您可以使用具有 cluster-admin 角色的用户访问集群。
  • 已安装 SR-IOV Network Operator。
  • 集群中有足够的可用节点,用于处理从排空节点中驱除的工作负载。
  • 您还没有为 SR-IOV 网络设备配置选择任何 control plane 节点。

流程

  1. 创建一个 SriovNetworkNodePolicy 对象,然后在 <name>-sriov-node-network.yaml 文件中保存 YAML。使用配置的实际名称替换 <name>

    apiVersion: sriovnetwork.openshift.io/v1
    kind: SriovNetworkNodePolicy
    metadata:
      name: <name> 1
      namespace: openshift-sriov-network-operator 2
    spec:
      resourceName: <sriov_resource_name> 3
      nodeSelector:
        feature.node.kubernetes.io/network-sriov.capable: "true" 4
      priority: <priority> 5
      mtu: <mtu> 6
      numVfs: <num> 7
      nicSelector: 8
        vendor: "<vendor_code>" 9
        deviceID: "<device_id>" 10
        pfNames: ["<pf_name>", ...] 11
        rootDevices: ["<pci_bus_id>", "..."] 12
      deviceType: vfio-pci 13
      isRdma: false 14
    1
    为 CR 对象指定一个名称。
    2
    指定 SR-IOV Operator 安装到的命名空间。
    3
    指定 SR-IOV 设备插件的资源名称。您可以为一个资源名称创建多个 SriovNetworkNodePolicy 对象。
    4
    指定节点选择器来选择要配置哪些节点。只有所选节点上的 SR-IOV 网络设备才会被配置。SR-IOV Container Network Interface(CNI)插件和设备插件仅在所选节点上部署。
    5
    可选:指定一个 099 之间的整数。较小的数值具有较高的优先权,优先级 10 高于优先级 99。默认值为 99
    6
    可选:为虚拟功能(VF)的最大传输单位 (MTU) 指定一个值。最大 MTU 值可能因不同的 NIC 型号而有所不同。
    7
    为 SR-IOV 物理网络设备指定要创建的虚拟功能 (VF) 的数量。对于 Intel 网络接口控制器(NIC),VF 的数量不能超过该设备支持的 VF 总数。对于 Mellanox NIC,VF 的数量不能超过 128
    8
    nicSelector 映射为 Operator 选择要配置的以太网设备。您不需要为所有参数指定值。建议您以足够的准确度来识别以太网适配器,以便尽量减小意外选择其他以太网设备的可能性。如果指定了rootDevices,则必须同时为 vendordeviceIDpfNames 指定一个值。如果同时指定了 pfNamesrootDevices,请确保它们指向同一个设备。
    9
    可选:指定 SR-IOV 网络设备的厂商十六进制代码。允许的值只能是 808615b3
    10
    可选:指定 SR-IOV 网络设备的设备十六进制代码。允许的值只能是 158b10151017
    11
    可选:参数接受包括以太网设备的一个或多个物理功能 (PF) 的数组。
    12
    参数接受一个包括一个或多个 PCI 总线地址,用于以太网设备的物理功能的数组。使用以下格式提供地址: 0000:02:00.1
    13
    OpenShift Virtualization 中的虚拟功能需要 vfio-pci 驱动程序类型。
    14
    可选:指定是否启用远程直接访问(RDMA)模式。对于 Mellanox 卡,请将 isRdma 设置为 false。默认值为 false
    注意

    如果将 RDMA 标记设定为 true,您可以继续使用启用了 RDMA 的 VF 作为普通网络设备。设备可在其中的一个模式中使用。

  2. 可选:将 SR-IOV 功能的集群节点标记为 SriovNetworkNodePolicy.Spec.NodeSelector (如果它们还没有标记)。有关标记节点的更多信息,请参阅"了解如何更新节点上的标签"。
  3. 创建 SriovNetworkNodePolicy 对象:

    $ oc create -f <name>-sriov-node-network.yaml

    其中 <name> 指定此配置的名称。

    在应用配置更新后,sriov-network-operator 命名空间中的所有 Pod 都会变为 Running 状态。

  4. 要验证是否已配置了 SR-IOV 网络设备,请输入以下命令。将 <node_name> 替换为带有您刚才配置的 SR-IOV 网络设备的节点名称。

    $ oc get sriovnetworknodestates -n openshift-sriov-network-operator <node_name> -o jsonpath='{.status.syncStatus}'

8.18.4.3. 配置 SR-IOV 额外网络

您可以通过创建一个 SriovNetwork 对象来配置使用 SR-IOV 硬件的额外网络。

创建 SriovNetwork 对象时,SR-IOV Network Operator 会自动创建一个 NetworkAttachmentDefinition 对象。

注意

如果一个 SriovNetwork 对象已被附加到状态为 running 的 Pod 或虚拟机上,则不能修改或删除它。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

  1. 创建以下 SriovNetwork 对象,然后在 <name>-sriov-network.yaml 文件中保存 YAML。用这个额外网络的名称替换 <name>
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
  name: <name> 1
  namespace: openshift-sriov-network-operator 2
spec:
  resourceName: <sriov_resource_name> 3
  networkNamespace: <target_namespace> 4
  vlan: <vlan> 5
  spoofChk: "<spoof_check>" 6
  linkState: <link_state> 7
  maxTxRate: <max_tx_rate> 8
  minTxRate: <min_rx_rate> 9
  vlanQoS: <vlan_qos> 10
  trust: "<trust_vf>" 11
  capabilities: <capabilities> 12
1
<name> 替换为对象的名称。SR-IOV Network Operator 创建一个名称相同的 NetworkAttachmentDefinition 对象。
2
指定 SR-IOV Network Operator 安装到的命名空间。
3
<sriov_resource_name> 替换为来自为这个额外网络定义 SR-IOV 硬件的 SriovNetworkNodePolicy 对象的 .spec.resourceName 参数的值。
4
<target_namespace> 替换为 SriovNetwork 的目标命名空间。只有目标命名空间中的 pod 或虚拟机可以附加到 SriovNetwork。
5
可选:使用额外网络的虚拟 LAN (VLAN) ID 替换 <vlan>。它需要是一个从 04095 范围内的一个整数值。默认值为 0
6
可选:将 <spoof_check> 替换为 VF 的 spoof 检查模式。允许的值是字符串 "on""off"
重要

指定的值必须由引号包括,否则 SR-IOV Network Operator 将拒绝 CR。

7
可选:将 <link_state> 替换为 Virtual Function (VF) 的链接状态。允许的值是 enabledisableauto
8
可选:将 <max_tx_rate> 替换为 VF 的最大传输率(以 Mbps 为单位)。
9
可选:将 <min_tx_rate> 替换为 VF 的最小传输率(以 Mbps 为单位)。这个值应该总是小于或等于最大传输率。
注意

Intel NIC 不支持 minTxRate 参数。如需更多信息,请参阅 BZ#1772847

10
可选:将 <vlan_qos> 替换为 VF 的 IEEE 802.1p 优先级级别。默认值为 0
11
可选:将 <trust_vf>替换为 VF 的信任模式。允许的值是字符串 "on""off"
重要

指定的值必须由引号包括,否则 SR-IOV Network Operator 将拒绝 CR。

12
可选:将 <capabilities> 替换为为这个网络配置的功能。
  1. 运行以下命令来创建对象。用这个额外网络的名称替换 <name>

    $ oc create -f <name>-sriov-network.yaml
  2. 可选: 要确认与您在上一步中创建的 SriovNetwork 对象关联的 NetworkAttachmentDefinition 对象是否存在,请输入以下命令。将 <namespace> 替换为您在 SriovNetwork 对象中指定的命名空间。

    $ oc get net-attach-def -n <namespace>

8.18.4.4. 将虚拟机连接到 SR-IOV 网络

您可以通过在虚拟机配置中包含网络详情将虚拟机 (VM) 连接到 SR-IOV 网络。

流程

  1. 在虚拟机配置的 spec.domain.devices.interfacesspec.networks 中包含 SR-IOV 网络详情:

    kind: VirtualMachine
    ...
    spec:
      domain:
        devices:
          interfaces:
          - name: <default> 1
            masquerade: {} 2
          - name: <nic1> 3
            sriov: {}
      networks:
      - name: <default> 4
        pod: {}
      - name: <nic1> 5
        multus:
            networkName: <sriov-network> 6
    ...
    1
    连接到 pod 网络的接口的唯一名称。
    2
    masquerade 绑定到默认 pod 网络。
    3
    SR-IOV 接口的唯一名称。
    4
    pod 网络接口的名称。这必须与之前定义的 interfaces.name 相同。
    5
    SR-IOV 接口的名称。这必须与之前定义的 interfaces.name 相同。
    6
    SR-IOV 网络附加定义的名称。
  2. 应用虚拟机配置:

    $ oc apply -f <vm-sriov.yaml> 1
    1
    虚拟机 YAML 文件的名称。

8.18.5. 将虚拟机连接到服务网格

OpenShift Virtualization 现在与 OpenShift Service Mesh 集成。您可以使用 IPv4 监控、视觉化和控制在默认 pod 网络上运行虚拟机工作负载的 pod 之间的流量。

8.18.5.1. 先决条件

8.18.5.2. 为服务网格配置虚拟机

要将虚拟机 (VM) 工作负载添加到服务网格中,请在虚拟机配置文件中启用自动 sidecar 注入,方法是将 sidecar.istio.io/inject 注解设置为 true。然后,将虚拟机公开为服务,以便在网格中查看应用程序。

先决条件

  • 为了避免端口冲突,请不要使用 Istio sidecar 代理使用的端口。它们包括 15000、15001、15006、15008、15020、15021 和 15090。

流程

  1. 编辑虚拟机配置文件以添加 sidecar.istio.io/inject: "true" 注解。

    配置文件示例

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      labels:
        kubevirt.io/vm: vm-istio
      name: vm-istio
    spec:
      runStrategy: Always
      template:
        metadata:
          labels:
            kubevirt.io/vm: vm-istio
            app: vm-istio 1
          annotations:
            sidecar.istio.io/inject: "true" 2
        spec:
          domain:
            devices:
              interfaces:
              - name: default
                masquerade: {} 3
              disks:
              - disk:
                  bus: virtio
                name: containerdisk
              - disk:
                  bus: virtio
                name: cloudinitdisk
            resources:
              requests:
                memory: 1024M
          networks:
          - name: default
            pod: {}
          terminationGracePeriodSeconds: 180
          volumes:
          - containerDisk:
              image: registry:5000/kubevirt/fedora-cloud-container-disk-demo:devel
            name: containerdisk

    1
    键/值对(标签)必须与 service selector 属性匹配。
    2
    启用自动 sidecar 注入的注解。
    3
    用于默认 pod 网络的绑定方法(伪装模式)。
  2. 应用 VM 配置:

    $ oc apply -f <vm_name>.yaml 1
    1
    虚拟机 YAML 文件的名称。
  3. 创建一个 Service 对象,将虚拟机公开给服务网格。

      apiVersion: v1
      kind: Service
      metadata:
        name: vm-istio
      spec:
        selector:
          app: vm-istio 1
        ports:
          - port: 8080
            name: http
            protocol: TCP
    1
    服务选择器,决定服务的目标 pod 集合。此属性对应于虚拟机配置文件中的 spec.metadata.labels 字段。在上例中,名为 vm-istioService 对象在任何带有标签 app=vm-istio 的 pod 上都以 TCP 端口 8080 为目标。
  4. 创建服务:

    $ oc create -f <service_name>.yaml 1
    1
    服务 YAML 文件的名称。

8.18.6. 为虚拟机配置 IP 地址

您可以为虚拟机配置动态或静态置备的 IP 地址。

先决条件

  • 虚拟机必须连接到一个外部网络
  • 您必须在额外网络中有一个 DHCP 服务器,才能为虚拟机配置动态 IP。

8.18.6.1. 使用 cloud-init 为新虚拟机配置 IP 地址

在创建虚拟机时,您可以使用 cloud-init 来配置 IP 地址。IP 地址可以动态部署,也可以静态置备。

流程

  • 创建虚拟机配置并在虚拟机配置的 spec.volumes.cloudInitNoCloud.networkData 字段中包含 cloud-init 网络详情:

    1. 要配置动态 IP,请指定接口名称和 dhcp4 布尔值:

      kind: VirtualMachine
      spec:
      ...
        volumes:
        - cloudInitNoCloud:
            networkData: |
              version: 2
              ethernets:
                eth1: 1
                  dhcp4: true 2
      1
      接口名称。
      2
      使用 DHCP 来置备 IPv4 地址。
    2. 要配置静态 IP,请指定接口名称和 IP 地址:

      kind: VirtualMachine
      spec:
      ...
        volumes:
        - cloudInitNoCloud:
            networkData: |
              version: 2
              ethernets:
                eth1: 1
                  addresses:
                  - 10.10.10.14/24 2
      1
      接口名称。
      2
      虚拟机的静态 IP 地址。

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

您可以使用 Web 控制台或 oc 客户端查看网络接口控制器 (NIC) 的 IP 地址。QEMU 客户机代理显示有关虚拟机辅助网络的附加信息。

8.18.7.1. 先决条件

  • 在虚拟机上安装 QEMU 客户机代理。

8.18.7.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

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

IP 信息显示在虚拟机的 VirtualMachine Details 页面中。

流程

  1. 在 OpenShift Container Platform 控制台中,从侧边菜单中点 VirtualizationVirtualMachines
  2. 选择虚拟机名称以打开 VirtualMachine 详情页。

每个附加 NIC 的信息会显示在 Details 标签页中的 IP Address 下。

8.18.8. 为虚拟机使用 MAC 地址池

KubeMacPool 组件为命名空间中的虚拟机 NIC 提供 MAC 地址池服务。

8.18.8.1. 关于 KubeMacPool

KubeMacPool 为每个命名空间提供一个 MAC 地址池,并从池中为虚拟机 NIC 分配 MAC 地址。这样可确保为 NIC 分配一 个唯一的 MAC 地址,该地址与另一个虚拟机的 MAC 地址不会有冲突。

从该虚拟机创建的虚拟机实例会在重启后保留分配的 MAC 地址。

注意

KubeMacPool 不处理独立于虚拟机创建的虚拟机实例。

安装 OpenShift Virtualization 时, KubeMacPool 会被默认启用。您可以通过将 mutatevirtualmachines.kubemacpool.io=ignore 标签添加到命名空间来在命名空间中禁用一个 MAC 地址池。通过删除标签为命名空间重新启用 KubeMacPool。

8.18.8.2. 在 CLI 中为命名空间禁用 MAC 地址池

通过将 mutatevirtualmachines.kubemacpool.io=ignore 标签添加到命名空间来禁用命名空间中虚拟机的 MAC 地址池。

流程

  • mutatevirtualmachines.kubemacpool.io=ignore 标签添加到命名空间。以下示例为 <namespace1><namespace2> 这两个命名空间禁用 KubeMacPool:

    $ oc label namespace <namespace1> <namespace2> mutatevirtualmachines.kubemacpool.io=ignore

8.18.8.3. 在 CLI 中为命名空间重新启用 MAC 地址池

如果您为命名空间禁用 KubeMacPool 并希望重新启用它,请从命名空间中删除 mutatevirtualmachines.kubemacpool.io=ignore 标签。

注意

早期版本的 OpenShift Virtualization 使用标签 mutatevirtualmachines.kubemacpool.io=allocate 为命名空间启用 KubeMacPool。这仍然被支持,但是冗余的,因为 KubeMacPool 现在被默认启用。

流程

  • 从命名空间中删除 KubeMacPool 标签。以下示例为 <namespace1><namespace2> 这两个命名空间重新启用 KubeMacPool:

    $ oc label namespace <namespace1> <namespace2> mutatevirtualmachines.kubemacpool.io-