Hyper-V Cluster mit Server 2022

7 Minuten zum lesen

Hyper-V Cluster mit Server 2022

Übersicht

Was soll erreicht werden?

Ziel ist es, ein Failovercluster mit Hyper-V Hosts als Knoten zu demonstrieren. Der Server 2022 bzw. Windows 11 beherrscht Nested Virtualization, d.h. man kann in einer VM nochmals die Hyper-V Rolle installieren. Außerdem steht uns Powershell-Direct zur Verfügung. Das machen wir uns zu Nutze.

Ausgangslage und Voraussetzungen

Vorhanden ist bereits ein Domaincontroller mit Server 2022 (DC04) der Domäne corp.howilab.local, sowie ein Mitgliedsserver (App04), ebenfalls Server 2022. Dieser wird als iSCSI-Zielserver für den Failovercluster dienen. Außerdem gibt es die die Server NHV01 und NHV02. Diese sind noch nicht in der Domäne und haben keine weiteren Rollen oder Feature installiert. Alle Server haben eine Netzwerkkarte, die dem Hyper-V Switch “Corpnet” zugewiesen sind.

Was ist zu tun?

  1. Vorbereiten des Hyper-V Hosts: Einrichtung neuer virtueller Switche für den iSCSI Storage (nvstor1, nvstor2) und den Cluster (nvcluster)
  2. Hinzufügen und Konfigurieren der Netzwerkkarten zu nhv01, nhv02 und App04
  3. NHV01 und NHV02 für Nested Virtualization vorbereiten, beide Server in die Domäne aufnehmen und die notwendigen Rollen und Feature installieren
  4. App04 als iSCSI-Ziel mit zwei Disks einrichten
  5. Clustervorbereitung - Speicheranbindung

    Redundante Anbindung der zukünftigen Clusterknoten an den gemeinsamen Speicher

  6. Clustervalidierung und Einrichtung

1. Hyper-V Host Vorbereiten

Im ersten Schritt werden auf dem Hyper-V Host neue Switche erstellt. Hierzu dient folgende Powershell Funktion:

# Vorbereitung für ein Cluster aus 2 Hyper-V VMs mit Namen nhv01 und nHV02

# Virtuelle Switche erstellen
function SwitchTest ($SwitchName = "StandadrdSwitch") {

# Prüfen, ob ein Privater Switch namens "$SwitchName" schon vorhanden ist und der Variablen den Wert True oder False geben
$VirtualSwitchExists = ((Get-VMSwitch | where {$_.name -eq $SwitchName -and $_.SwitchType -eq "Private"}).count -ne 0)

# Falls kein Switch vorhanden ist wird er angelegt
if ($VirtualSwitchExists -like "False")
  {
   New-VMSwitch -SwitchName $SwitchName -SwitchType Private
   write-host "Privater Switch $SwitchName wurde erstellt"
  }
else
  {
    write-host "Privater Switch $SwitchName ist schon vorhanden"
  }

}

SwitchTest nvstor1
SwitchTest nvstor2
SwitchTest nvCluster

2. Zusätzliche NICs erstellen

Nun werden den VMs nhv01, nhv02 und App04 zusätzliche Netzwerkarten hinzugefügt. Für diesen Schritt sollten die VMs ausgeschaltet sein.

# zusatzliche NICs an die VMs hängen
Add-VMNetworkAdapter -VMName nhv01 -SwitchName "nvstor1"
Add-VMNetworkAdapter -VMName nhv01 -SwitchName "nvstor2"
Add-VMNetworkAdapter -VMName nhv01 -SwitchName "nvcluster"
Add-VMNetworkAdapter -VMName nhv02 -SwitchName "nvstor1"
Add-VMNetworkAdapter -VMName nhv02 -SwitchName "nvstor2"
Add-VMNetworkAdapter -VMName nhv02 -SwitchName "nvcluster"
Add-VMNetworkAdapter -VMName App04 -SwitchName "nvstor1"
Add-VMNetworkAdapter -VMName App04 -SwitchName "nvstor2"

Das Ergebnis für die VM nhv01 sieht so aus:

Hardware NHV01

3. NHV Maschinen vorbereiten

Zum Verwenden der Nested Virtualization müssen einige Voraussetzungen erfüllt sein:

  • Auf den Netzwerkkarten muss MacAdressspoofing eingeschaltet werden
  • der virtuelle Prozessor muss für die Virtualisierung vorbereitet werden
  • die VMs benötigen mindestens 4GB statischen Arbeitsspeicher.
# MacAddressSpoofing einschalten
Set-VMNetworkAdapter -VMName nhv01 -MacAddressSpoofing on
Set-VMNetworkAdapter -VMName nhv02 -MacAddressSpoofing on

# Virtualisierung für VM konfigurieren
Set-VMProcessor -VMName nhv01 -ExposeVirtualizationExtensions $true -Count 2
Set-VMProcessor -VMName nhv02 -ExposeVirtualizationExtensions $true -Count 2

# 4GB statischen Arbeitsspeicher vergeben
Set-VMMemory -VMName nhv01 -DynamicMemoryEnabled $false -StartupBytes 4GB
Set-VMMemory -VMName nhv02 -DynamicMemoryEnabled $false -StartupBytes 4GB

Das Ergebnis im Hyper-V Manager:

Voraussetzungen Nested Virtualization

Jetzt können die VMs gestartet werden.

#VMs starten
Start-VM -Name nhv01
Start-VM -Name nhv02

Server Manager vorher

Noch sind Maschinen NHV01 und NHV02 in der Arbeitsgruppe “Workgroup”, haben nicht den korrekten Computernamen, keine statischen IP-Adressen und es ist nicht zu erkennen an welchem Switch die Netzwerkkarten hängen. Kümmern wir uns zunächst um die Netzwerkkarten:

# Zuordnung der Switche zu den NICs in der VM $vmName prüfen und umbennen
function NicSwitch ($vmName) {
  $netnames = (Get-VMNetworkAdapter -VMName $vmName).SwitchName
  foreach ($netname in $netnames) {
  $adapterID =(Get-VMNetworkAdapter -VMName $vmName | where SwitchName -EQ $netname).AdapterId
  Get-VMNetworkAdapter -VMName $vmName | where Switchname -EQ $netname | Disconnect-VMNetworkAdapter
  Invoke-Command -VMName $vmName -Credential $credential {get-netadapter | where status -EQ Disconnected | Rename-NetAdapter -NewName $Using:netname}
  Get-VMNetworkAdapter -VMName $vmName | where AdapterId -eq $adapterID | Connect-VMNetworkAdapter -SwitchName $netname
  }
}

Die Funktion ermittelt als Erstes die Namen der virtuellen Switche (corpnet, nvcluster, nvstor1 und nvstor2). Jeder Netzwerkadapter besitzt eine eindeutige AdapterId, die wir zur korrekten Zuordnung später benötigen. Es wird erst der Switch von der Netzwerkarte getrennt, dann in der VM der getrennte Adapter in den Switchnamen umbenannt und anschließend wieder verbunden. Damit der invoke-command Befehl funktioniert müssen die Zugangsdaten in der Variablen $credential übergeben werden.

# Zugagngsdaten für NHV01 und NHV02 als Workgroup Mitglieder
$username = "Administrator" 
$password = 'Pa$$w0rd' | ConvertTo-SecureString -asPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($username,$password)

# Zuordnung der Switche zu den NICs in der VM nhv01 prüfen und umbennen
NicSwitch -vmName nhv01

Der nächste Block setzt nun die korrekten IP-Adressen, nimmt den Rechner in die Domäne auf und benennt ihn um. Hier ist darauf zu achten Zeile für Zeile die Kommandos auszuführen, da zunächst die Powershell Session in die VM aufgebaut werden muss, bevor man die übrigen Kommandos ausführt!

Enter-PSSession -VMName nhv01 -Credential $credential
# Per Powershell Direct die IP-Adressen auf NHV01 setzen und Domäne hinzufügen
$Netnames = @("corpnet","nvstor1","nvstor2","nvcluster")
foreach ($Netname in $Netnames) {
Set-NetIPInterface -InterfaceAlias $Netname -Dhcp Disabled
}
New-NetIPAddress -InterfaceAlias corpnet -IPAddress 172.16.0.31 -DefaultGateway 172.16.0.1 -PrefixLength 24
Set-DNSClientServerAddress -InterfaceAlias corpnet -ServerAddresses 172.16.0.13
New-NetIPAddress -InterfaceAlias nvcluster -IPAddress 10.10.0.31 -PrefixLength 24
New-NetIPAddress -InterfaceAlias nvstor1 -IPAddress 10.10.1.31 -PrefixLength 24
New-NetIPAddress -InterfaceAlias nvstor2 -IPAddress 10.10.2.31 -PrefixLength 24

$domain = "corp.howilab.local"
$username = "$domain\Administrator"
$password = 'Pa$$w0rd' | ConvertTo-SecureString -asPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($username,$password)
Add-Computer -DomainName $domain -Credential $credential
Rename-computer nhv01
Exit-PSSession
Restart-VM -Name nhv01 -force

Das Ergebnis sieht so aus:

Servermanger der NHV01

Analog führt man die gleichen Schritte für die NHV02 VM aus.

Servermanger der NHV02

Nachdem nun beide Maschinen in der Domäne sind werden die benötigten Rollen und Feature installiert, natürlich per Powershell:

# Zugagngsdaten für NHV01 und NHV02 als Domain Member
$domain = "corp.howilab.local"
$username = "$domain\Administrator"
$password = 'Pa$$w0rd' | ConvertTo-SecureString -asPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential($username,$password)

Enter-PSSession -VMName nhv01 -Credential $credential
Install-WindowsFeature -Name Hyper-V,Failover-Clustering,Multipath-IO -IncludeAllSubFeature -IncludeManagementTools -Restart

Enter-PSSession -VMName nhv02 -Credential $credential
Install-WindowsFeature -Name Hyper-V,Failover-Clustering,Multipath-IO -IncludeAllSubFeature -IncludeManagementTools -Restart

4. App04 einrichten

Für den Failover Cluster benötigen wir gemeinsamen Speicher. Hierfür benutzen wir den App04 als iSCSI-Zielserver. Wie schon bei den anderen Servern wird zunächst die Zuordnung der Netzwerkkarten geprüft und statische Adressen vergeben. Danach wird der Rollendienst installiert. Schließlich bekommt der Server eine 5GB große Disk, die später als Quorumdisk im Cluster verwendet wird und eine 40GB große Disk für das CSV im Cluster. Zugriff auf diese Disks erhalten unsere NHV Rechner.

# Zuordnung der Switche zu den NICs in der VM App04 prüfen und umbennen
NicSwitch -vmName App04

# iscsi Target auf App04 installieren
Enter-PSSession -VMName App04 -Credential $credential

New-NetIPAddress -InterfaceAlias nvstor1 -IPAddress 10.10.1.22 -PrefixLength 24
New-NetIPAddress -InterfaceAlias nvstor2 -IPAddress 10.10.2.22 -PrefixLength 24
Install-WindowsFeature -Name FS-iSCSITarget-Server 
New-IscsiVirtualDisk -Path c:\iscsiVirtualDisks\Quorum.vhdx -SizeBytes 5GB
New-IscsiVirtualDisk -Path c:\iscsiVirtualDisks\CSVData.vhdx -SizeBytes 40GB
New-IscsiServerTarget -TargetName nhvHosts
Set-IscsiServerTarget -TargetName nhvHosts -InitiatorIds`
 IPAddress:10.10.1.31,`
 IPAddress:10.10.2.31,`
 IPAddress:10.10.1.32,`
 IPAddress:10.10.2.32
Add-IscsiVirtualDiskTargetMapping -Path c:\iscsiVirtualDisks\Quorum.vhdx -TargetName nhvHosts
Add-IscsiVirtualDiskTargetMapping -Path c:\iscsiVirtualDisks\CSVData.vhdx -TargetName nhvHosts
Exit-PSSession

Virtuelle iSCSI-Datenträger

iSCSI-Ziele

5. Clustervorbereitung - Speicheranbindung

Der Storage muss nun redundant mit den zukünftigen Clusterknoten verbunden werden. Hierzu nutzen wir MPIO und den iSCSI Initiator. Beginnen wir mit dem nhv01. Nachdem der Dienst des iSCSI Initiators für den automatschen Start konfiguriert und gestartet wurde, müssen ein paar Firewallregeln und in MPIO die Unterstützung für iSCSI-Geräte aktiviert werden. Danach können wir den Rechner mit den Geräten auf dem Zielserver über zwei unabhängige Wege verbinden.

# Konfigurieren des iSCSI Initiators mit MPIO auf NHV01
Enter-PSSession -VMName nhv01 -Credential $credential
Set-Service -Name msiscsi -StartupType Automatic
Start-Service msiscsi
Get-NetFirewallServiceFilter -Service msiscsi | Enable-NetFirewallRule
Enable-MSDSMAutomaticClaim -BusType iSCSI
New-IscsiTargetPortal TargetPortalAddress 10.10.1.22
New-IscsiTargetPortal -TargetPortalAddress 10.10.2.22
Get-IscsiTarget | Connect-IscsiTarget  -IsPersistent $True IsMultipathEnabled $True InitiatorPortalAddress 10.10.1.31
Get-IscsiTarget | Connect-IscsiTarget  -IsPersistent $True IsMultipathEnabled $True InitiatorPortalAddress 10.10.2.31

Eigenschaften von MPIO Eigenschaften von iSCSI-Initiator Geräte

Nachdem die Disks nun verbunden sind, werden sie noch initialisiert und formatiert

get-disk | where Size -EQ 5GB | Initialize-Disk -PartitionStyle MBR
get-disk | where Size -EQ 40GB | Initialize-Disk -PartitionStyle MBR
get-disk | where Size -EQ 5GB | New-Partition -UseMaximumSize -AssignDriveLetter | Format-Volume -FileSystem NTFS -NewFileSystemLabel "Quorum"
get-disk | where Size -EQ 40GB | New-Partition -UseMaximumSize -AssignDriveLetter | Format-Volume -FileSystem NTFS -NewFileSystemLabel "CSVData"

Exit-PSSession

Analog verfährt man auf dem nhv02, wobei hier die Disks nur noch Online geschaltet werden müssen.

# Konfigurieren desiSCSI Initiators mit MPIO auf NHV02
Enter-PSSession -VMName nhv02 -Credential $credential
Set-Service -Name msiscsi -StartupType Automatic
Start-Service msiscsi
Get-NetFirewallServiceFilter -Service msiscsi | Enable-NetFirewallRule
Enable-MSDSMAutomaticClaim -BusType iSCSI
New-IscsiTargetPortal TargetPortalAddress 10.10.1.22
New-IscsiTargetPortal -TargetPortalAddress 10.10.2.22
Get-IscsiTarget | Connect-IscsiTarget  -IsPersistent $True IsMultipathEnabled $True InitiatorPortalAddress 10.10.1.32
Get-IscsiTarget | Connect-IscsiTarget  -IsPersistent $True IsMultipathEnabled $True InitiatorPortalAddress 10.10.2.32

get-disk | where Size -EQ 5GB | set-disk -IsOffline:$false
get-disk | where Size -EQ 40GB | set-disk -IsOffline:$false

Exit-PSSession

6. Cluster validieren und erstellen

Jetzt sind es nur noch wenige Schritte bis zum fertigen Cluster. Auf dem NHV01 wird der Validierungstest ausgeführt und danach ein neuer Cluster erstellt.

Enter-PSSession -VMName nhv01 -Credential $credential
# Validierungstest 
Test-Cluster Node NHV01,NHV02
# Cluster erstellen
New-Cluster Name HVCluster Node NHV01,NHV02 StaticAddress 172.16.0.40

Failovercluster-Manager