OpenStack Ussuri Hyper-V 2019-el

Ebben a blogbejegyzésben leírom azokat a szükséges lépeseket, melyek OpenStack Ussuri és egy egyedülálló Hyper-V compute node összekapcsolásához szükségesek Open vSwitch-el, provider+VXLAN hálózattal. Open vSwitch elengedhetetlen, ha VXLAN hálózattal tervezel.

Labor környezet

Az alábbi összetevők beállításával nem foglalkozik ez a blog bejegyzés.

  • Két hálózati kártyás kiszolgáló. Az egyik menedzsment, a másik Open vSwitch célokra elő van készítve.
  • Működő OpenStack vezérlő, provider és self-service hálózat.
  • Létező Windows domain infrastruktúra.

Windows Server telepítése

Windows Server verzió

Ez a blog bejegyzés angol verziójú Windows Server Core 2019 Datacenter Evaluation-al készült.

Windows Server Core 2019 vagy Hyper-V Server 2019 verziót javaslok. Telepíthetsz Windows Server 2019 Desktop Experience verziót is, ha jobban kiismered magad a teljes Windows asztallal inkább. Az alapértelmezett telepítés Server Core parancssori grafikus interfésszel.

Különböző kiszolgáló szoftver kiadások, költségek, virtualizációs megkötések és vendég licenszelés összefoglalása látható a következő táblázatban. Az összehasonlítás a Comparison of Standard and Datacenter editions of Windows Server 2019 oldal alapján készült.

Windows verzió Licenszelés Maximum VM VM licenszelés
Windows Server 2019 Standard fizetős 2 per licensz nincs
Windows Server 2019 Datacenter fizetős korlátlan van (AVMA)
Hyper-V Server 2019 ingyenes korlátlan nincs

Honosított Windows Server (vagy Hyper-V Server) verziók érintett lehetnek különféle inkompatibilitási problémákban, így finoman az angol verziót javaslom.

Alapbeállítások

Jelentkezz be a frissen telepített kiszolgálóba, állítsd be a jelszót és megkezdhető a parancssori beállítás.

A pnputil-al telepíthetsz meghajtóprogramot, ha szükséges.

Server Core és Hyper-V Server az sconfig paranccsal állítható be.

Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.

Inspecting system...


===============================================================================
                         Server Configuration
===============================================================================

1) Domain/Workgroup:                    Domain:  example.net
2) Computer Name:                       OSHV2K19
3) Add Local Administrator
4) Configure Remote Management          Enabled

5) Windows Update Settings:             DownloadOnly
6) Download and Install Updates
7) Remote Desktop:                      Enabled (all clients)

8) Network Settings
9) Date and Time
10) Telemetry settings                  Unknown
11) Windows Activation

12) Log Off User
13) Restart Server
14) Shut Down Server
15) Exit to Command Line

Enter number to select an option:
  1. Adj meg IP címet a menedzsment hálózati eszköznek: 8) Network Settings
  2. Engedélyezd a távoli asztalt: 7) Remote Desktop
  3. Telepítsd a Windows frissítéseket: 6) Download and Install Updates
  4. Léptesd be a gépek egy Windows tartományba a könnyebb kezelhetőség érdekében: 1) Domain/Workgroup

Állíts be NTP kiszolgálót, ha nem tartományi gépet használsz.

net stop w32time
w32tm /config "/manualpeerlist:pool.ntp.org,0x8" /syncfromflags:MANUAL
net start w32time

Labor környezetben a tűzfalat kikapcsolhatod.

netsh advfirewall set allprofiles state off

Indíts PowerShell-t új ablakban.

start powershell

A Hyper-V szerepkört Windows Server 2019-en fel kell telepíteni. Hyper-V Server 2019-ben benne van ez a szerepkör.

PS > Add-WindowsFeature Hyper-V
PS > Add-WindowsFeature Hyper-V-PowerShell

Engedélyezd a távoli PowerShell a távoli Hyper-V kezelés miatt.

PS > Enable-PSRemoting

Open vSwitch

Cloudbase aláírt Open vSwitch builds for Windows csomagot biztosít, de az utolsó letölthető stabil verzió 2.10.0 a bejegyzés készültekor. Ez egy régi verzió és jelentős csomagvesztést tapasztaltam vele.

Végül fordítottam egy saját Open vSwitch MSI csomagot forrásból és azt telepítettem. Szerencsére nem kellett egy teljes Windows build környezetet építeni, hanem az AppVeyor autobuild service használható erre. Elegendő fork-olni az ovs repository-t a saját GitHub fiókodba, összekötni a fork-olt repót az AppVeyor fiókoddal, új build-et indítani és letölteni az elkészült MSI telepítőt. Az utolsó commit a f0e4a73 volt a repóban, amikor az MSI telepítőm készült.

A Hyper-V-re telepítendő szükséges függőségek kinézhetők az appveyor.yml állományból.

Telepítsd a Visual Studio 2013/2019 runtime-ot.

vcredist_x64.exe

Telepítsd az OpenSSL 1.0.2u-t.

Win64OpenSSL-1_0_2u.exe

Az AppVeyor Open vSwitch build-ek nincsenek aláírva, így a Windows-t be kell állítani, hogy az aláíratlan Open vSwitch meghajtókat is fogadja el. Futtasd a következő parancsokat parancssorban és indítsd újra a Windows-t.

bcdedit /set LOADOPTIONS DISABLE_INTEGRITY_CHECKS
bcdedit /set TESTSIGNING ON
bcdedit /set nointegritychecks ON
shutdown /r

Telepítsd fel az Open vSwitch-et. A telepítés naplózás engedélyezése (/l*v ovs-install-log.txt) nem kötelező, de később jól jöhet.

msiexec /i OpenvSwitch-Release.msi /qr /l*v ovs-install-log.txt

Engedélyezd az Open vSwitch TCP/6640 port-ot.

PS > sc.exe config ovsdb-server binPath= --% "\"C:\Program Files\Open vSwitch\bin\ovsdb-server.exe\" --log-file=\"C:\Program Files\Open vSwitch\logs\ovsdb-server.log\" --pidfile --service --service-monitor --unixctl=\"C:\ProgramData\openvswitch\ovsdb-server.ctl\" --remote=punix:\"C:\ProgramData\openvswitch\db.sock\" --remote=ptcp:6640 \"C:\Program Files\Open vSwitch\conf\conf.db\""
PS > sc.exe stop ovs-vswitchd
PS > sc.exe stop ovsdb-server
PS > sc.exe start ovsdb-server
PS > sc.exe start ovs-vswitchd

Jelentkezz ki, jelentkezz újra be, hogy a %PATH% változó új értéke érvényre jusson.

Hozd létre a VMswitch-et. Az Open vSwitch-nek van egy Hyper-V virtuális kapcsoló kiegészítője.

Get-NetAdapter | select "Name"

Name
----
management
Ethernet

New-VMSwitch -Name vSwitchOVS -NetAdapterName "Ethernet" -AllowManagementOS $true
Get-VMSwitchExtension -VMSwitchName vSwitchOVS -Name "Open vSwitch Extension"
Enable-VMSwitchExtension -VMSwitchName vSwitchOVS -Name "Open vSwitch Extension"

Végezd el az Open vSwitch alapbeállítását.

ovs-vsctl.exe add-br br-ext
ovs-vsctl.exe add-port br-ext Ethernet

Rendelj a VXLAN végponthoz IP címet a br-ext-re.

Enable-NetAdapter br-ext
New-NetIPAddress -IPAddress <VXLAN_IPaddr> -InterfaceAlias br-ext -PrefixLength <example: 24>

OpenStack Nova compute telepítő

Telepítsd a OpenStack Nova compute Hyper-V ügynököt. A telepítő ( installer ) a Neutron OVS ügynököt is tartalmazza. A telepítés naplózás engedélyezése (/l*v nova-compute-install-log.txt) nem kötelező, de később jól jöhet.

msiexec /i HyperVNovaCompute_Ussuri_21_0_0.msi /l*v nova-compute-install-log.txt

Haladj végig a telepítő varázslóban.

  1. Custom Setup: Kapcsold ki a Neutron Hyper-V Agent-et. Válaszd ki az OpenStack Nova Compute, Neutron OVS Agent, FreeRDP for Hyper-V összetevőket.
  2. Virtual Switch (Neutron OVS Agent): Choose existing existing virtual switch: vSwitchOVS
  3. Basic Configuration: Az RDP console URL maga a hypervisor különálló node-os telepítsében, AMQP Transport URL a RabbitMQ kiszogálóra mutat.
  4. Placement API: Az OpenStack telepítésednek megfelelően töltsd ki.
  5. Neutron: Az OpenStack telepítésednek megfelelően töltsd ki.
  6. Neutron Agents Configuration: OVS Network Type: vxlan, Tunneling local IP: <VXLAN_IPaddr>.

Alternatívaként automata ( silent or unattended install ) telepítés is elérhető. A kézi telepítési folyamat az OpenStack Hyper-V virtualization platform dokumentumban található.

A nova compute hyperv ügynök foltozása

A VM virtuális hálózati interfész csatlakoztatása nem működött rendesen a labor környezetemben. Nem volt hálózati kapcsolata miután a VM elindult és az ovs-vsctl show hibát mutatott.

ovs-vsctl show
...
Port "932cb602-8ec0-43be-bed5-b690a8b1d99a"
    Interface "932cb602-8ec0-43be-bed5-b690a8b1d99a"
        error: "could not open network device 932cb602-8ec0-43be-bed5-b690a8b1d99a (No such device)"
...

Vonatkozó kód a C:\Program Files\Cloudbase Solutions\OpenStack\Nova\Python\Lib\site-packages\compute_hyperv\nova\vmops.py állományban található. Két függvény, a spawn() és a power_on() kezdeményez a vif csatlakoztatást. A kód szerint a virtuális hálózati eszköz azelőtt kerül bele az OVS hídba, mielőtt a Hyper-V létrehozná azt a VM indításakor. Azonban a helyes működés az, hogy a nova compute ügynök vár a VM indításáig (nem csak a VM létrehozásáig) mielőtt csatlakoztatja a virtuális hálózati eszközt az OVS hídhoz.

Írtam egy kis foltot, ami először elindítja a VM-et, majd hozzáadja a virtuális hálózati eszközt az OVS hídhoz. Alkalmazd a foltot a vmops.py állományon és indítsd újra a nova-compute szolgáltatást.

--- orig/vmops.py    2020-10-06 02:15:08.000000000 +0200
+++ updated/vmops.py 2021-11-08 08:46:11.044979827 +0100
@@ -312,13 +312,10 @@
         self._create_ephemerals(instance, block_device_info['ephemerals'])

         try:
-            with self.wait_vif_plug_events(instance, network_info):
-                # waiting will occur after the instance is created.
-                self.create_instance(context, instance, network_info,
-                                     block_device_info, vm_gen, image_meta)
-                # This is supported starting from OVS version 2.5
-                self.plug_vifs(instance, network_info)
-
+            LOG.debug("Creating instance")
+            self.create_instance(context, instance, network_info,
+                                 block_device_info, vm_gen, image_meta)
+            LOG.debug("Updating device metadata")
             self.update_device_metadata(context, instance)

             if configdrive.required_by(instance):
@@ -337,6 +334,11 @@
                 self.power_on(instance,
                               network_info=network_info,
                               should_plug_vifs=False)
+                self.pause(instance)
+                with self.wait_vif_plug_events(instance, network_info):
+                    LOG.debug("Plugging vifs")
+                    self.plug_vifs(instance, network_info)
+                self.unpause(instance)
         except Exception:
             with excutils.save_and_reraise_exception():
                 self.destroy(instance, network_info, block_device_info)
@@ -1018,9 +1020,18 @@
             self._volumeops.fix_instance_volume_disk_paths(instance.name,
                                                            block_device_info)

+        self._set_vm_state(instance, os_win_const.HYPERV_VM_STATE_ENABLED)
         if should_plug_vifs:
+            LOG.debug("Pause instance", instance=instance)
+            self._set_vm_state(instance,
+                               os_win_const.HYPERV_VM_STATE_PAUSED)
+            LOG.debug("Unplug instance vif(s)", instance=instance)
+            self.unplug_vifs(instance, network_info)
+            LOG.debug("Plug instance vif(s)", instance=instance)
             self.plug_vifs(instance, network_info)
-        self._set_vm_state(instance, os_win_const.HYPERV_VM_STATE_ENABLED)
+            LOG.debug("Unpause instance", instance=instance)
+            self._set_vm_state(instance,
+                               os_win_const.HYPERV_VM_STATE_ENABLED)

     def _set_vm_state(self, instance, req_state):
         instance_name = instance.name

Provider hálózat beállítása a neutron ügynökben

Az MSI telepítő nem állítja be a provider hálózatot. Szerkeszd a C:\Program Files\Cloudbase Solutions\OpenStack\Nova\etc\neutron_ovs_agent.conf állományt a következők szerint.

[ovs]
...
bridge_mappings = 'provider:br-ext'
...

FreeRDP WebConnect beállítása

Telepítsd a FreeRDP WebConnect-et, ami egy RDP-HTML5 proxy, és ez biztosítja a virtuális gépek konzolához a hozzáférést böngészőből.

Haladj végig a telepítő varázslóban.

  1. FreeRDP-WebConnect configuration: Engedélyezheted a Redirect HTTP connections to HTTPS pontot ha van megfelelő HTTPS tanúsítványod és felülírod a C:\Program Files\Cloudbase Solutions\FreeRDP-WebConnect\etc\server.cer állományt.
  2. OpenStack configuration: Állítsd be az OpenStack integrációt.

A generált konfigurációs állomány a C:\Program Files\Cloudbase Solutions\FreeRDP-WebConnect\etc\wsgate.ini helyen található.

A VM konzol URL az OpenStack parancssorból érhető el.

nova get-rdp-console <VM instance> rdp-html5

OpenStack vezérlő beállítások

Fedeztesd fel az új hypervisor-t a vezérlőn.

su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova

OVS híd takarítása

Árva, hibás állapotú virtuális hálózati eszközök eltávolíthatók az OVS hídból rendszer újraindítás vagy neutron ügynök újraindítást követően az alábbi PowerShell kódrészlettel.

$interfaces = ovs-vsctl --format=csv find interface ofport="-1" | ConvertFrom-Csv | Select "name"
Foreach($i in $interfaces)
{
  ovs-vsctl del-port br-int "$($i.name)"
}

Lehetséges folytatás

  • Open vSwitch kód aláírás.
  • Több hálózati eszköz: teaming or bonding.
  • Windows fürtözés kialakítása.
  • VM élő migráció beállítása.
  • Cinder telepítése.