介绍了如何在 KVM 上安装 SD-WAN 网关 qcow。

注: 此部署已在 KVM Ubuntu 16.04 和 18.04 上测试。

安装前注意事项

KVM 可通过多种方式向虚拟机提供网络连接。应在配置虚拟机之前置备 libvirt 中的网络连接。可通过多种方法在 KVM 中配置网络连接。有关如何在 libvirt 上配置网络的选项的完整配置,请参阅以下链接:

https://libvirt.org/formatnetwork.html

从完整选项列表中,VMware 建议使用以下模式:

  • SR-IOV(SD-WAN 网关 需要使用该模式以提供 VMware 指定的最大吞吐量)
  • OpenVSwitch 网桥

如果您决定使用 SR-IOV 模式,请在 KVM 上启用 SR-IOV。要在 KVM 上启用 SR-IOV,请参阅在 KVM 上激活 SR-IOV

在 KVM 上安装 SD-WAN 网关 的步骤

  1. 将 QCOW 和在“创建 cloud-init”一节中创建的 cloud-init 文件复制到一个新的空目录中。
  2. 创建要用于设备的网络接口。

    使用 SR-IOV:以下是使用 SR-IOV 的 Intel X710/XL710 网卡特定的示例网络接口模板。

        <interface type='hostdev' managed='yes'>
            <mac address='52:54:00:79:19:3d'/>
            <driver name='vfio'/>
            <source>
                <address type='pci' domain='0x0000' bus='0x83' slot='0x0a' function='0x0'/>
            </source>
            <model type='virtio'/>
        </interface>
    
    使用 OpenVSwitch:以下是使用 OpenVSwitch 的网络接口的示例模板。
    git ./vcg/templates/KVM_NETWORKING_SAMPLES/template_outside_openvswitch.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <network>
       <name>public_interface</name>
       <!--This is the network name-->
       <model type="virtio" />
       <forward mode="bridge" />
       <bridge name="publicinterface" />
       <virtualport type="openvswitch" />
       <vlan trunk="yes">
          <tag id="50" />
          <!--Define all the VLANS for this Bridge -->
          <tag id="51" />
          <!--Define all the VLANS for this Bridge -->
       </vlan>
    </network> 

    inside_interface 创建网络:

    git ./vcg/templates/KVM_NETWORKING_SAMPLES/template_inside_openvswitch.xml
    <network>
      <name>inside_interface</name> <!--This is the network name-->
      <model type='virtio'/>
      <forward mode="bridge"/>
      <bridge name="insideinterface"/>
      <virtualport type='openvswitch'></virtualport>
      <vlan trunk='yes'></vlan>
      <tag id='200'/> <!—Define all the VLANS for this Bridge -->
      <tag id='201'/> <!—Define all the VLANS for this Bridge -->
      <tag id='202'/> <!—Define all the VLANS for this Bridge -->
    </network>  
    如果您使用 OpenVSwitch 模式,在启动虚拟机之前,必须验证是否创建了基本网络并且这些网络处于活动状态。
    注: 该验证步骤不适用于 SR-IOV 模式,因为您在启动虚拟机之前未创建任何网络。

    vcg-code-verify-the-basic

  3. 编辑虚拟机 XML 文件。在 KVM 中创建虚拟机有多种方法。您可以在一个 XML 文件中定义虚拟机;可以使用 libvirt 通过 OpenVSwitch 模式和 SR-IOV 模式特定的示例虚拟机 XML 模板创建该文件。
    vi my_vm.xml
    以下是使用 OpenVSwitch 接口的虚拟机的示例模板。进行编辑以使用该模板(如果适用)。
    <?xml version="1.0" encoding="UTF-8"?>
    <domain type="kvm">
       <name>#domain_name#</name>
       <memory unit="KiB">8388608</memory>
       <currentMemory unit="KiB">8388608</currentMemory>
       <vcpu>8</vcpu>
       <cputune>
          <vcpupin vcpu="0" cpuset="0" />
          <vcpupin vcpu="1" cpuset="1" />
          <vcpupin vcpu="2" cpuset="2" />
          <vcpupin vcpu="3" cpuset="3" />
          <vcpupin vcpu="4" cpuset="4" />
          <vcpupin vcpu="5" cpuset="5" />
          <vcpupin vcpu="6" cpuset="6" />
          <vcpupin vcpu="7" cpuset="7" />
       </cputune>
       <resource>
          <partition>/machine</partition>
       </resource>
       <os>
          <type>hvm</type>
       </os>
       <features>
          <acpi />
          <apic />
          <pae />
       </features>
       <cpu mode="host-passthrough" />
       <clock offset="utc" />
       <on_poweroff>destroy</on_poweroff>
       <on_reboot>restart</on_reboot>
       <on_crash>restart</on_crash>
       <devices>
          <emulator>/usr/bin/kvm-spice</emulator>
          <disk type="file" device="disk">
             <driver name="qemu" type="qcow2" />
             <source file="#folder#/#qcow_root#" />
             <target dev="hda" bus="ide" />
             <alias name="ide0-0-0" />
             <address type="drive" controller="0" bus="0" target="0" unit="0" />
          </disk>
          <disk type="file" device="cdrom">
             <driver name="qemu" type="raw" />
             <source file="#folder#/#Cloud_ INIT_ ISO#" />
             <target dev="sdb" bus="sata" />
             <readonly />
             <alias name="sata1-0-0" />
             <address type="drive" controller="1" bus="0" target="0" unit="0" />
          </disk>
          <controller type="usb" index="0">
             <alias name="usb0" />
             <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x2" />
          </controller>
          <controller type="pci" index="0" model="pci-root">
             <alias name="pci.0" />
          </controller>
          <controller type="ide" index="0">
             <alias name="ide0" />
             <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x1" />
          </controller>
          <interface type="network">
             <source network="public_interface" />
             <vlan>
                <tag id="#public_vlan#" />
             </vlan>
             <alias name="hostdev1" />
             <address type="pci" domain="0x0000" bus="0x00" slot="0x11" function="0x0" />
          </interface>
          <interface type="network">
             <source network="inside_interface" />
             <alias name="hostdev2" />
             <address type="pci" domain="0x0000" bus="0x00" slot="0x12" function="0x0" />
          </interface>
          <serial type="pty">
             <source path="/dev/pts/3" />
             <target port="0" />
             <alias name="serial0" />
          </serial>
          <console type="pty" tty="/dev/pts/3">
             <source path="/dev/pts/3" />
             <target type="serial" port="0" />
             <alias name="serial0" />
          </console>
          <memballoon model="none" />
       </devices>
       <seclabel type="none" />
    </domain>
    以下是使用 SR-IOV 接口的虚拟机的示例模板。进行编辑以使用该模板(如果适用)。
    <?xml version="1.0" encoding="UTF-8"?>
    <domain type="kvm">
       <name>#domain_name#</name>
       <memory unit="KiB">8388608</memory>
       <currentMemory unit="KiB">8388608</currentMemory>
       <vcpu>8</vcpu>
       <cputune>
          <vcpupin vcpu="0" cpuset="0" />
          <vcpupin vcpu="1" cpuset="1" />
          <vcpupin vcpu="2" cpuset="2" />
          <vcpupin vcpu="3" cpuset="3" />
          <vcpupin vcpu="4" cpuset="4" />
          <vcpupin vcpu="5" cpuset="5" />
          <vcpupin vcpu="6" cpuset="6" />
          <vcpupin vcpu="7" cpuset="7" />
       </cputune>
       <resource>
          <partition>/machine</partition>
       </resource>
       <os>
          <type>hvm</type>
       </os>
       <features>
          <acpi />
          <apic />
          <pae />
       </features>
       <cpu mode="host-passthrough" />
       <clock offset="utc" />
       <on_poweroff>destroy</on_poweroff>
       <on_reboot>restart</on_reboot>
       <on_crash>restart</on_crash>
       <devices>
          <emulator>/usr/bin/kvm-spice</emulator>
          <disk type="file" device="disk">
             <driver name="qemu" type="qcow2" />
             <source file="#folder#/#qcow_root#" />
             <target dev="hda" bus="ide" />
             <alias name="ide0-0-0" />
             <address type="drive" controller="0" bus="0" target="0" unit="0" />
          </disk>
          <disk type="file" device="cdrom">
             <driver name="qemu" type="raw" />
             <source file="#folder#/#Cloud_ INIT_ ISO#" />
             <target dev="sdb" bus="sata" />
             <readonly />
             <alias name="sata1-0-0" />
             <address type="drive" controller="1" bus="0" target="0" unit="0" />
          </disk>
          <controller type="usb" index="0">
             <alias name="usb0" />
             <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x2" />
          </controller>
          <controller type="pci" index="0" model="pci-root">
             <alias name="pci.0" />
          </controller>
          <controller type="ide" index="0">
             <alias name="ide0" />
             <address type="pci" domain="0x0000" bus="0x00" slot="0x01" function="0x1" />
          </controller>
          <interface type='hostdev' managed='yes'>
     	  <mac address='52:54:00:79:19:3d'/>
      	 <driver name='vfio'/>
      	 <source>
                  <address type='pci' domain='0x0000' bus='0x83' slot='0x0a' function='0x0'/>
     	  </source>
      	 <model type='virtio'/>
          </interface>
          <interface type='hostdev' managed='yes'>
     	  <mac address='52:54:00:74:69:4d'/>
      	 <driver name='vfio'/>
      	 <source>
                  <address type='pci' domain='0x0000' bus='0x83' slot='0x0a' function='0x1'/>
     	  </source>
      	 <model type='virtio'/>
          </interface>
          <serial type="pty">
             <source path="/dev/pts/3" />
             <target port="0" />
             <alias name="serial0" />
          </serial>
          <console type="pty" tty="/dev/pts/3">
             <source path="/dev/pts/3" />
             <target type="serial" port="0" />
             <alias name="serial0" />
          </console>
          <memballoon model="none" />
       </devices>
       <seclabel type="none" />
    </domain>
  4. 执行以下步骤以启动虚拟机:
    1. 确保在您的目录中具有以下三个文件,如以下示例屏幕截图中所示:
      • qcow 文件 - vcg-root
      • cloud-init - vcg-test.iso
      • 定义虚拟机的域 XML 文件 - test_vcg.xml,其中 test_vcg 是域名。

      vcg-code-networks-created-active

    2. 定义虚拟机。
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh define test_vcg.xml
      Domain test_vcg defined from test_vcg.xml
    3. 将虚拟机设置为自动启动。
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh autostart test_vcg
    4. 启动虚拟机。
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh start test_vcg
  5. 如果您使用 SR-IOV 模式,在启动虚拟机后,请在使用的虚拟功能 (VF) 上设置以下内容:
    1. 将 spoofcheck 设置为 off。
      ip link set eth1 vf 0 spoofchk off
    2. 将 Trusted 模式设置为 on。
      ip link set dev eth1 vf 0 trust on
    3. 设置 VLAN(如果需要)。
      ip link set eth1 vf 0 vlan 3500
    注: 虚拟功能配置步骤不适用于 OpenVSwitch (OVS) 模式。
  6. 从控制台登录到虚拟机。
    virsh list
    Id Name State
    ----------------------------------------------------
    25 test_vcg running
    velocloud@KVMperf2$ virsh console 25
    Connected to domain test_vcg
    Escape character is ^]          

关于 KVM 主机的特殊注意事项

  • 在物理接口上停用 GRO(通用接收卸载)(以避免在 SD-WAN 网关 中进行不必要的重新分段)。
    ethtool –K <interface> gro off tx off
  • 停用 CPU C 状态(电源状态会影响实时性能)。通常,可通过在 BIOS 中附加 processor.max_cstate=1 或停用此选项,在内核引导选项中完成此操作。
  • 对于生产部署,必须将 vCPU 固定到实例。不应允许对内核进行超额预定。