En esta sección se describe cómo instalar el archivo QCOW de SD-WAN Gateway en KVM.

Nota: Esta implementación se ha probado en KVM Ubuntu 16.04 y 18.04.

Consideraciones previas a la instalación

KVM permite proporcionar redes a máquinas virtuales de varias formas. Las redes de libvirt deben proporcionarse antes de configurar la máquina virtual. Puede configurar redes en KVM de varias formas. Para obtener información sobre cómo establecer todas las opciones relacionadas con la configuración de redes en libvirt, haga clic en el siguiente vínculo:

https://libvirt.org/formatnetwork.html

De la lista completa de opciones, VMware recomienda los siguientes modos:

  • SR-IOV: se precisa este modo para que SD-WAN Gateway alcance el máximo rendimiento especificado en VMware.
  • Puente OpenvSwitch

Si decide utilizar el modo SR-IOV, habilítelo en KVM. Para ello, consulte Activar SR-IOV en KVM.

Pasos de instalación de SD-WAN Gateway en KVM

  1. Copie los archivos QCOW y de cloud-init creados en la sección Creación de cloud-init (cloud-Init Creation) en un nuevo directorio vacío.
  2. Cree las interfaces de red que necesite utilizar con el dispositivo.

    Uso de SR-IOV (Using SR-IOV): a continuación se muestra una plantilla de interfaz de red de ejemplo específica de las tarjetas NIC Intel X710/XL710 que usan SR-IOV.

        <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>
    
    Uso de OpenVSwitch (Using OpenVSwitch): a continuación se muestran plantillas de ejemplo de una interfaz de red con 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> 

    Crear una red para 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>  
    Si utiliza el modo OpenvSwitch, compruebe que las redes básicas se creen y activen antes de iniciar la máquina virtual.
    Nota: Este paso de validación no se aplica al modo SR-IOV, ya que no se crea ninguna red antes de que se inicie la máquina virtual.

    vcg-code-verify-the-basic

  3. Edite el archivo XML de la máquina virtual. Puede crear una máquina virtual en KVM de varias formas. Asimismo, puede definir la máquina virtual en un archivo XML y crearla con libvirt, utilizando la plantilla XML de la máquina virtual de ejemplo, específica para los modos OpenvSwitch y SR-IOV.
    vi my_vm.xml
    A continuación se muestra una plantilla de ejemplo de una máquina virtual que utiliza interfaces de OpenvSwitch. Con esta plantilla puede realizar modificaciones (cuando proceda).
    <?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>
    A continuación se muestra una plantilla de ejemplo de una máquina virtual que utiliza interfaces de SR-IOV. Con esta plantilla puede realizar modificaciones (cuando proceda).
    <?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. Para iniciar la máquina virtual, siga estos pasos:
    1. Asegúrese de tener los tres archivos siguientes en el directorio, tal como se muestra en la siguiente captura de pantalla de ejemplo:
      • Archivo QCOW: vcg-root.
      • Archivo de cloud-init: vcg-test.iso.
      • Archivo XML de dominio que define la máquina virtual: test_vcg.xml (donde test_vcg es el nombre de dominio).

      vcg-code-networks-created-active

    2. Defina la máquina virtual.
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh define test_vcg.xml
      Domain test_vcg defined from test_vcg.xml
    3. Establezca el inicio automático en la máquina virtual.
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh autostart test_vcg
    4. Inicie la máquina virtual.
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh start test_vcg
  5. Si utiliza el modo SR-IOV, después de iniciar la máquina virtual, establezca lo siguiente en las funciones virtuales (VF) que se utilizan:
    1. Desactive la comprobación de suplantación.
      ip link set eth1 vf 0 spoofchk off
    2. Active el modo de confianza.
      ip link set dev eth1 vf 0 trust on
    3. Establezca la VLAN, si es necesario.
      ip link set eth1 vf 0 vlan 3500
    Nota: El paso de configuración de funciones virtuales no se aplica al modo OpenVSwitch (OVS).
  6. Inicie sesión en la máquina virtual.
    virsh list
    Id Name State
    ----------------------------------------------------
    25 test_vcg running
    velocloud@KVMperf2$ virsh console 25
    Connected to domain test_vcg
    Escape character is ^]          

Consideraciones especiales para el host de KVM

  • Desactive la descarga de recepción genérica (Generic Receive Offload, GRO) en las interfaces físicas para evitar una refragmentación innecesaria en SD-WAN Gateway.
    ethtool –K <interface> gro off tx off
  • Desactive los estados C en las CPU (los estados de energía afectan al rendimiento en tiempo real). Por lo general, esta acción se puede realizar a través de las opciones de arranque del kernel anexando processor.max_cstate=1. También puede desactivar simplemente los estados C en el BIOS.
  • En las implementaciones de producción, las vCPU deben estar ancladas a la instancia. No se debe permitir la sobresuscripción en los núcleos.