Explique comment installer le format qcow SD-WAN Gateway sur KVM.

Note : Ce déploiement est testé sur KVM Ubuntu 16.04 et 18.04.

Considérations relatives à la préinstallation

KVM offre plusieurs méthodes pour la mise en réseau des machines virtuelles. La mise en réseau dans libvirt doit être provisionnée avant la configuration de la machine virtuelle. Plusieurs méthodes de configuration de la mise en réseau sont disponibles dans KVM. Pour la configuration complète des options de configuration des réseaux sur libvirt, reportez-vous au lien suivant :

https://libvirt.org/formatnetwork.html

Dans la liste complète des options, VMware recommande les modes suivants :

  • SR-IOV (ce mode est requis pour le composant SD-WAN Gateway pour garantir le débit maximal spécifié par VMware).
  • Pont OpenVSwitch

Si vous décidez d'utiliser le mode SR-IOV, activez SR-IOV sur KVM. Pour activer le mode SR-IOV sur KVM, reportez-vous à la section Activer SR-IOV sur KVM.

Procédure d'installation de SD-WAN Gateway sur KVM

  1. Copiez les fichiers QCOW et cloud-init créés dans la section Création cloud-init (Cloud-Init Creation) dans un nouveau répertoire vide.
  2. Créez les interfaces réseau que vous allez utiliser pour le dispositif.

    Utilisation de SR-IOV (Using SR-IOV) : voici un exemple de modèle d'interface réseau spécifique des cartes réseau Intel X710/XL710 utilisant 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>
    
    Utilisation d'OpenVSwitch (Using OpenVSwitch) : voici les exemples de modèle d'interface réseau utilisant 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> 

    Créez un réseau pour 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 vous utilisez le mode OpenVSwitch, vous devez vérifier si les réseaux de base sont créés et actifs avant de lancer la machine virtuelle.
    Note : Cette étape de validation ne s'applique pas au mode SR-IOV, car vous ne créez pas de réseau avant le lancement de la machine virtuelle.

    vcg-code-verify-the-basic

  3. Modifiez le fichier XML de la machine virtuelle. Plusieurs méthodes de création d'une machine virtuelle sont disponibles dans KVM. Vous pouvez définir la machine virtuelle dans un fichier XML et la créer à l'aide de libvirt, en utilisant l'exemple de modèle XML de machine virtuelle spécifique du mode OpenVSwitch et du mode SR-IOV.
    vi my_vm.xml
    Voici un exemple de modèle de machine virtuelle qui utilise des interfaces OpenVSwitch. Utilisez ce modèle après avoir apporté quelques modifications, si nécessaire.
    <?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>
    Voici un exemple de modèle de machine virtuelle qui utilise des interfaces SR-IOV. Utilisez ce modèle après avoir apporté quelques modifications, si nécessaire.
    <?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. Lancez la machine virtuelle en procédant comme suit :
    1. Assurez-vous que vous disposez des trois fichiers suivants dans votre répertoire, comme illustré dans la capture d'écran suivante :
      • qcow file - vcg-root
      • cloud-init - vcg-test.iso
      • Fichier XML de domaine qui définit la machine virtuelle test_vcg.xml, où test_vcg est le nom de domaine.

      vcg-code-networks-created-active

    2. Définissez la machine virtuelle.
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh define test_vcg.xml
      Domain test_vcg defined from test_vcg.xml
    3. Définissez la machine virtuelle au démarrage automatique.
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh autostart test_vcg
    4. Démarrez la machine virtuelle.
      velocloud@KVMperf2:/tmp/VeloCloudGateway$ virsh start test_vcg
  5. Si vous utilisez le mode SR-IOV, après le lancement de la machine virtuelle, définissez les éléments suivants sur les fonctions virtuelles utilisées :
    1. Désactivez la vérification de l'usurpation d'identité.
      ip link set eth1 vf 0 spoofchk off
    2. Activez le mode Approuvé (Trusted).
      ip link set dev eth1 vf 0 trust on
    3. Définissez le VLAN, si nécessaire.
      ip link set eth1 vf 0 vlan 3500
    Note : L'étape de configuration des fonctions virtuelles ne s'applique pas au mode OpenVSwitch (OVS).
  6. Accédez à la machine virtuelle.
    virsh list
    Id Name State
    ----------------------------------------------------
    25 test_vcg running
    velocloud@KVMperf2$ virsh console 25
    Connected to domain test_vcg
    Escape character is ^]          

Considération particulière relative l'hôte KVM

  • Désactivez GRO (Generic Receive Offload, déchargement de réception générique) sur les interfaces physiques (pour éviter une nouvelle fragmentation inutile dans SD-WAN Gateway).
    ethtool –K <interface> gro off tx off
  • Désactivez les états C du CPU (les états d'alimentation affectent les performances en temps réel). En général, vous pouvez effectuer cette opération à partir des options de démarrage du noyau en ajoutant processor.max_cstate=1 ou simplement en procédant à la désactivation dans le BIOS.
  • Pour le déploiement de production, les vCPU doivent être épinglées à l'instance. Aucun surabonnement sur les cœurs ne doit être autorisé.