Περιγράφει τον τρόπο εγκατάστασης του Πύλη SD-WAN qcow στο KVM.

Σημείωση: Αυτή η ανάπτυξη δοκιμάζεται στο KVM Ubuntu, εκδόσεις 16.04 και 18.04.

Ζητήματα προεγκατάστασης

Το KVM παρέχει πολλούς τρόπους παροχής δυνατοτήτων δικτύου σε εικονικές μηχανές. Η δικτύωση στο libvirt θα πρέπει να παρέχεται πριν από τη διαμόρφωση της VM. Υπάρχουν πολλοί τρόποι για να διαμορφώσετε τη δικτύωση στο KVM. Για μια πλήρη διαμόρφωση των επιλογών σχετικά με τον τρόπο διαμόρφωσης δικτύων στο libvirt, ανατρέξτε στην ακόλουθη σύνδεση:

https://libvirt.org/formatnetwork.html

Από την πλήρη λίστα επιλογών, η VMware συνιστά τις ακόλουθες λειτουργίες:

  • SR-IOV (Αυτή η λειτουργία απαιτείται για να παρέχει η Πύλη SD-WAN τη μέγιστη ταχύτητα μετάδοσης που καθορίζεται από το VMware)
  • Γέφυρα OpenVSwitch

Εάν αποφασίσετε να χρησιμοποιήσετε τη λειτουργία SR-IOV, ενεργοποιήστε το SR-IOV στο KVM. Για να ενεργοποιήσετε το SR-IOV στο KVM, ανατρέξτε στην ενότητα Ενεργοποίηση SR-IOV σε KVM.

Βήματα εγκατάστασης της Πύλη SD-WAN στο KVM

  1. Αντιγράψτε τα αρχεία QCOW και Cloud-init που δημιουργήθηκαν στην ενότητα «Δημιουργία Cloud-Init» σε έναν νέο κενό κατάλογο.
  2. Δημιουργήστε τις διασυνδέσεις δικτύου που πρόκειται να χρησιμοποιήσετε για τη συσκευή.

    Χρήση SR-IOV: Ακολουθεί ένα δείγμα προτύπου διασύνδεσης δικτύου ειδικά για κάρτες Intel X710/XL710 NIC που χρησιμοποιούν 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>
    
    Χρήση 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, τότε πρέπει να επαληθεύσετε εάν τα βασικά δίκτυα έχουν δημιουργηθεί και είναι ενεργά πριν εκκινήσετε τη VM.
    Σημείωση: Αυτό το βήμα επικύρωσης δεν ισχύει για τη λειτουργία SR-IOV, καθώς δεν δημιουργείτε κανένα δίκτυο πριν από την εκκίνηση της VM.

    vcg-κώδικας-επαλήθευση-το-βασικό

  3. Επεξεργαστείτε το αρχείο VM XML. Υπάρχουν πολλοί τρόποι για να δημιουργήσετε μια εικονική μηχανή στο KVM. Μπορείτε να ορίσετε την VM σε ένα αρχείο XML και να τη δημιουργήσετε χρησιμοποιώντας το libvirt, χρησιμοποιώντας το δείγμα προτύπου VM XML ειδικά για τη λειτουργία OpenVSwitch και τη λειτουργία SR-IOV.
    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-κώδικας-δίκτυα-δημιουργία-ενεργά

    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. Απενεργοποιήστε τον έλεγχο πλαστογράφησης.
      ip link set eth1 vf 0 spoofchk off
    2. Ενεργοποιήστε τη λειτουργία αξιοπιστίας.
      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
  • Απενεργοποιήστε τις καταστάσεις C της CPU (οι καταστάσεις ισχύος επηρεάζουν την απόδοση σε πραγματικό χρόνο). Τυπικά, αυτό μπορείτε να το κάνετε ως μέρος των επιλογών εκκίνησης πυρήνα, προσαρτώντας το processor.max_cstate=1. Εναλλακτικά, απενεργοποιήστε το απλώς στο BIOS.
  • Για ανάπτυξη παραγωγής, οι vCPU πρέπει να καρφιτσωθούν στην παρουσία. Δεν θα πρέπει να επιτρέπονται υπερβολικές εγγραφές στους πυρήνες.