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.
Az alábbi összetevők beállításával nem foglalkozik ez a blog bejegyzés.
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:
Á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
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>
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.
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 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
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' ...
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.
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
Fedeztesd fel az új hypervisor-t a vezérlőn.
su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
Á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)" }