In questa sezione viene descritto come installare il file qcow di SD-WAN Gateway in KVM.

Nota: Questa distribuzione è testata in KVM Ubuntu 16.04 e 18.04.

Considerazioni preliminari all'installazione

KVM offre diversi modi per fornire la rete alle macchine virtuali. La rete in libvirt deve essere sottoposta a provisioning prima della configurazione della macchina virtuale. Esistono diversi modi per configurare la rete in KVM. Informazioni complete sulle opzioni di configurazione delle reti in libvirt sono disponibili al seguente link:

https://libvirt.org/formatnetwork.html

Dall'elenco completo delle opzioni, VMware consiglia le seguenti modalità:

  • SR-IOV (questa modalità è necessaria affinché SD-WAN Gateway fornisca la velocità effettiva massima specificata da VMware)
  • Bridge OpenVSwitch

Se si decide di utilizzare la modalità SR-IOV, abilitare SR-IOV in KVM. Per abilitare SR-IOV in KVM, vedere Attivazione di SR-IOV in KVM.

Procedura di installazione di SD-WAN Gateway in KVM

  1. Copiare i file qcow e cloud-init creati nella sezione Creazione di cloud-init in una nuova directory vuota.
  2. Creare le interfacce di rete che si intende utilizzare per il dispositivo.

    Utilizzo di SR-IOV (Using SR-IOV): di seguito è disponibile un modello di interfaccia di rete di esempio specifico per le schede NIC Intel X710/XL710 che utilizza 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>
    
    Utilizzo di OpenVSwitch (Using OpenVSwitch): di seguito sono disponibili i modelli di esempio di un'interfaccia di rete che utilizzano 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> 

    Creare una rete per 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>  
    Se si utilizza la modalità OpenVSwitch, è necessario verificare che le reti di base siano create e attive prima di avviare la macchina virtuale.
    Nota: Questo passaggio di convalida non è applicabile per la modalità SR-IOV poiché non si crea alcuna rete prima che la macchina virtuale venga avviata.

    vcg-code-verify-the-basic

  3. Modificare il file XML della macchina virtuale. Esistono diversi modi per creare una macchina virtuale in KVM. È possibile definire la macchina virtuale in un file XML e crearla utilizzando libvirt, utilizzando il modello XML della macchina virtuale di esempio specifico per la modalità OpenVSwitch e la modalità SR-IOV.
    vi my_vm.xml
    Di seguito è riportato un modello di esempio di una macchina virtuale che utilizza le interfacce OpenVSwitch. Utilizzare questo modello effettuando, ove applicabile, le modifiche richieste.
    <?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>
    Di seguito è riportato un modello di esempio di una macchina virtuale che utilizza le interfacce SR-IOV. Utilizzare questo modello effettuando, ove applicabile, le modifiche richieste.
    <?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. Avviare la macchina virtuale effettuando i seguenti passaggi:
    1. Assicurarsi di disporre dei seguenti tre file nella directory, come mostrato nella seguente schermata di esempio:
      • qcow file - vcg-root
      • cloud-init - vcg-test.iso
      • File XML del dominio che definisce la macchina virtuale test_vcg.xml, dove test_vcg è il nome del dominio).

      vcg-code-networks-created-active

    2. Definire la macchina virtuale.
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh define test_vcg.xml
      Domain test_vcg defined from test_vcg.xml
    3. Impostare l'avvio automatico della macchina virtuale.
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh autostart test_vcg
    4. Avviare la macchina virtuale.
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh start test_vcg
  5. Se si utilizza la modalità SR-IOV, dopo aver avviato la macchina virtuale, impostare quanto segue sulle funzioni virtuali utilizzate:
    1. Impostare la verifica dello spoofing su off.
      ip link set eth1 vf 0 spoofchk off
    2. Impostare la modalità attendibile su on.
      ip link set dev eth1 vf 0 trust on
    3. Impostare la VLAN, se richiesto.
      ip link set eth1 vf 0 vlan 3500
    Nota: Il passaggio di configurazione delle funzioni virtuali non è applicabile per la modalità OpenVSwitch (OVS).
  6. Accedere alla macchina virtuale tramite la console.
    virsh list
    Id Name State
    ----------------------------------------------------
    25 test_vcg running
    velocloud@KVMperf2$ virsh console 25
    Connected to domain test_vcg
    Escape character is ^]          

Considerazioni speciali per l'host KVM (Special Consideration for KVM Host)

  • Disattivare GRO (Generic Receive Offload) nelle interfacce fisiche (per evitare una nuova frammentazione non necessaria in SD-WAN Gateway).
    ethtool –K <interface> gro off tx off
  • Disattivare gli stati C della CPU (gli stati di alimentazione influiscono sulle prestazioni in tempo reale). Questa operazione può in genere essere eseguita come parte delle opzioni di avvio del kernel aggiungendo processor.max_cstate=1 o semplicemente eseguendo la disattivazione nel BIOS.
  • Per la distribuzione di produzione, le vCPU devono essere aggiunte all'istanza. Non deve essere consentita alcuna oversubscription nei core.