Beschreibt, wie Sie SD-WAN Gateway im QCOW-Format in KVM installieren.

Hinweis: Diese Bereitstellung wurde auf KVM Ubuntu 16.04 und 18.04 getestet.

Überlegungen vor der Installation

KVM bietet mehrere Möglichkeiten, Netzwerke für virtuelle Maschinen zur Verfügung zu stellen. Das Netzwerk in libvirt sollte vor der Konfiguration der VM bereitgestellt werden. Es gibt mehrere Möglichkeiten, Netzwerke in KVM zu konfigurieren. Eine vollständige Erläuterung der Optionen zur Konfiguration von Netzwerken in libvirt finden Sie unter folgendem Link:

https://libvirt.org/formatnetwork.html

Aus der vollständigen Liste der Optionen empfiehlt VMware die folgenden Modi:

  • SR-IOV (Dieser Modus ist erforderlich, damit das SD-WAN Gateway den von VMware angegebenen maximalen Durchsatz liefern kann.)
  • OpenVSwitch Bridge

Wenn Sie den SR-IOV-Modus verwenden, aktivieren Sie SR-IOV in KVM. Informationen zum Aktivieren von SR-IOV in KVM finden Sie unter Aktivieren von SR-IOV auf KVM.

Schritte für die SD-WAN Gateway-Installation in KVM

  1. Kopieren Sie die QCOW- und Cloud-init-Datei, die im Abschnitt zur Cloud-init-Erstellung erstellt wurden, in ein neues leeres Verzeichnis.
  2. Erstellen Sie die Netzwerkschnittstellen, die Sie für das Gerät verwenden möchten.

    Verwenden von SR-IOV (Using SR-IOV): Nachfolgend finden Sie ein Beispiel für eine Netzwerkschnittstellen-Vorlage, die speziell für Netzwerkkarten vom Typ Intel X710/XL710 mit SR-IOV verwendet wird.

        <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>
    
    Verwenden von OpenVSwitch (Using OpenvSwitch): Nachfolgend finden Sie die Beispielvorlagen einer Netzwerkschnittstelle mit 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> 

    Erstellen Sie ein Netzwerk für 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>  
    Wenn Sie den OpenvSwitch-Modus verwenden, müssen Sie überprüfen, ob die grundlegenden Netzwerke erstellt wurden und aktiv sind, bevor Sie die VM starten.
    Hinweis: Dieser Validierungsschritt gilt nicht für den SR IOV-Modus, da Sie kein Netzwerk erstellen, bevor die VM gestartet wird.

    vcg-code-verify-the-basic

  3. Bearbeiten Sie die XML-Datei der VM. Es gibt mehrere Möglichkeiten, eine virtuelle Maschine in KVM zu erstellen. Sie können die VM in einer XML-Datei definieren und mithilfe von libvirt erstellen. Dabei wird die XML-Beispielvorlage für die virtuelle Maschine verwendet, die spezifisch für den OpenVSwitch-Modus und den SR-IOV-Modus ist.
    vi my_vm.xml
    Nachfolgend finden Sie eine Beispielvorlage einer VM, die OpenvSwitch-Schnittstellen verwendet. Verwenden Sie diese Vorlage, indem Sie gegebenenfalls Änderungen vornehmen.
    <?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>
    Nachfolgend finden Sie eine Beispielvorlage einer VM, die SR-IOV-Schnittstellen verwendet. Verwenden Sie diese Vorlage, indem Sie gegebenenfalls Änderungen vornehmen.
    <?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. Starten Sie die VM, indem Sie die folgenden Schritte ausführen:
    1. Vergewissern Sie sich, dass Ihr Verzeichnis die folgenden drei Dateien enthält, wie im folgenden Beispiel-Screenshot gezeigt:
      • QCOW-Datei: vcg-root
      • Cloud-init: vcg-test.iso
      • Die XML-Datei der Domäne, die die VM definiert: test_vcg.xml, dabei ist „test_vcg“ der Domänenname.

      vcg-code-networks-created-active

    2. Definieren Sie die VM.
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh define test_vcg.xml
      Domain test_vcg defined from test_vcg.xml
    3. Setzen Sie die VM auf AutoStart.
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh autostart test_vcg
    4. Starten Sie die VM.
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh start test_vcg
  5. Wenn Sie den SR-IOV-Modus verwenden, legen Sie nach dem Starten der VM Folgendes für die verwendeten virtuellen Funktionen (VFs) fest:
    1. Deaktivieren Sie den Spoofcheck.
      ip link set eth1 vf 0 spoofchk off
    2. Aktivieren Sie den vertrauenswürdigen Modus.
      ip link set dev eth1 vf 0 trust on
    3. Richten Sie bei Bedarf das VLAN ein.
      ip link set eth1 vf 0 vlan 3500
    Hinweis: Der Schritt für die Konfiguration der virtuellen Funktionen gilt nicht für den OpenvSwitch (OVS)-Modus.
  6. Beziehen Sie die Konsole in die VM ein.
    virsh list
    Id Name State
    ----------------------------------------------------
    25 test_vcg running
    velocloud@KVMperf2$ virsh console 25
    Connected to domain test_vcg
    Escape character is ^]          

Besondere Überlegungen für KVM-Host

  • Deaktivieren Sie GRO (Generic Receive Offload) für physische Schnittstellen (um unnötige erneute Fragmentierung in SD-WAN Gateway zu vermeiden).
    ethtool –K <interface> gro off tx off
  • Deaktivieren Sie CPU-C-Status (Betriebsstatus beeinflussen die Echtzeitleistung). Normalerweise kann dies als Teil der Kernel-Startoptionen erfolgen, indem processor.max_cstate=1 angehängt oder einfach im BIOS deaktiviert wird.
  • Für die Bereitstellung in einer Produktionsumgebung müssen vCPUs an die Instanz angeheftet werden. Es darf keine Überbuchung auf den Kernen stattfinden.