×

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

在实时迁移期间,通过网络接口到默认 Pod 网络的流量会被中断。

从命令行配置伪装模式

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

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

先决条件
  • 必须将虚拟机配置为使用 DHCP 获取 IPv4 地址。

步骤
  1. 编辑虚拟机配置文件的interfaces规范

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: example-vm
    spec:
      template:
        spec:
          domain:
            devices:
              interfaces:
                - name: default
                  masquerade: {} (1)
                  ports: (2)
                    - port: 80
    # ...
          networks:
          - name: default
            pod: {}
    1 使用伪装模式连接。
    2 可选:列出您要从虚拟机公开的端口,每个端口都由port字段指定。port值必须是 0 到 65536 之间的数字。当不使用ports数组时,有效范围内的所有端口都允许传入流量。在此示例中,允许端口80上的传入流量。

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

  2. 创建虚拟机

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

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

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

虚拟机实例配置中的Network.pod.vmIPv6NetworkCIDR字段确定虚拟机的静态 IPv6 地址和网关 IP 地址。这些由 virt-launcher Pod 用于将 IPv6 流量路由到虚拟机,并且不会在外部使用。Network.pod.vmIPv6NetworkCIDR字段以无类域间路由 (CIDR) 表示法指定 IPv6 地址块。默认值为fd10:0:2::2/120。您可以根据网络需求编辑此值。

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

先决条件
  • AWS 上的 Red Hat OpenShift 服务集群必须使用为双栈配置的 OVN-Kubernetes 容器网络接口 (CNI) 网络插件。

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

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: example-vm-ipv6
    spec:
      template:
        spec:
          domain:
            devices:
              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 虚拟机实例配置中Network.pod.vmIPv6NetworkCIDR字段确定的网关 IP 地址。默认值为fd10:0:2::1
  2. 在命名空间中创建虚拟机

    $ oc create -f example-vm-ipv6.yaml
验证
  • 要验证是否已配置 IPv6,请启动虚拟机并查看虚拟机实例的接口状态,以确保它具有 IPv6 地址

$ oc get vmi <vmi-name> -o jsonpath="{.status.interfaces[*].ipAddresses}"

关于巨型帧支持

使用 OVN-Kubernetes CNI 插件时,您可以在默认 Pod 网络上连接的两个虚拟机 (VM) 之间发送未分段的巨型帧数据包。巨型帧的最大传输单元 (MTU) 值大于 1500 字节。

虚拟机通过以下方式之一自动获取集群管理员设置的集群网络的 MTU 值:

  • libvirt:如果客户机操作系统具有最新版本的 VirtIO 驱动程序,该驱动程序可以通过模拟设备中的外围组件互连 (PCI) 配置寄存器解释传入数据。

  • DHCP:如果客户机 DHCP 客户端可以从 DHCP 服务器响应中读取 MTU 值。

对于没有 VirtIO 驱动程序的 Windows 虚拟机,您必须使用netsh或类似工具手动设置 MTU。这是因为 Windows DHCP 客户端不读取 MTU 值。