Hyper-V ワークグループクラスター構築

Microsoft

2024.05.09

今回は、Hyper-V ワークグループクラスター検証を受けての構築編をお届けいたします。

システム構成

都合良く空いている機材がありませんでしたので、手元のAzure Stack HCI上にNested Hyper-Vを有効化した仮想マシンで構築を行っています。

システム構成

  • 3ノードのハイパーコンバージドインフラ構成
  • ディスク:ノードあたりOS用×1と記憶域プール用×4
  • NIC:ノードあたりサービスネットワーク用×2(チーミング構成)とストレージネットワーク用×2
  • ストレージネットワークは直結3セグメント構成

    ストレージネットワーク

  • クォーラム用のストレージアカウントはプライベートエンドポイントを付けてVPNにて接続
  • 名前解決はhostsにて実施

事前準備

作業ユーザーの準備

全ノードに同一ユーザー名&同一パスワード&管理者権限のローカルユーザーを作成します。
作業はすべてこのユーザーにて実施します。

クォーラムの準備

本コラムではクォーラムにクラウド監視を使用していますので、Azureストレージアカウントを作成してアカウント名とアカウントキーを控えておきます。
[フェールオーバー クラスターのクラウド監視を展開する]
https://learn.microsoft.com/ja-jp/windows-server/failover-clustering/deploy-cloud-witness?tabs=windows

名前解決の準備

DNSもしくはhostsにてノード×3およびクラスターおよび↑のストレージアカウントのエンドポイントの名前解決を行えるようにします。

[hostsの例]

172.16.0.101winhost01.wgcluster.local
172.16.0.101winhost01
172.16.0.102winhost02.wgcluster.local
172.16.0.102winhost02
172.16.0.103winhost03.wgcluster.local
172.16.0.103winhost03
172.16.0.104wincluster.wgcluster.local
172.17.0.1winclustercloudwitness.blob.core.windows.net

Step1:初期設定~リモートデスクトップできるまで(対象:全ノード)

Step1はOSインストール直後の状態から始まります。まだリモートデスクトップができませんのでコンソール等からコマンドを投入します。
パラメーターはノード別に作成してください。

パラメーター:

パラメーター
$ComputerName コンピューター名 WinHost01
$DnsSuffix DNSサフィックス(ドメイン名) wgcluster.local
$DefaultGateway デフォルトゲートウェイ 172.16.0.254
$DNSServer DNSサーバー 172.16.0.1
NIC1:サービス用
$NIC1OldName NIC1の変更前の名前 イーサネット
$NIC1Name NIC1の変更後の名前 Service1
$NIC1IPAddress NIC1のIPアドレス 172.16.0.101
$NIC1PrefixLength NIC1のサブネットマスク 24
NIC2:サービス用 ※チーミング用のためIPアドレスの割り当て不要
$NIC2OldName NIC2の変更前の名前 イーサネット 2
$NIC2Name NIC2の変更後の名前 Service2
NIC3:ストレージ用
$NIC3OldName NIC3の変更前の名前 イーサネット 3
$NIC3Name NIC3の変更後の名前 Storage1
$NIC3IPAddress NIC3のIPアドレス 192.168.0.1
$NIC3PrefixLength NIC3のサブネットマスク 30
NIC4:ストレージ用
$NIC4OldName NIC4の変更前の名前 イーサネット 4
$NIC4Name NIC4の変更後の名前 Storage3
$NIC4IPAddress NIC4のIPアドレス 192.168.0.10
$NIC4PrefixLength NIC4のサブネットマスク 30

コマンド:

# コンピューター名の変更
Rename-Computer -NewName $ComputerName

# プライマリ DNS サフィックスの設定
Set-ItemProperty registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters -Name "NV Domain" -Value $DNSSuffix

# ネットワークの設定
Rename-NetAdapter -Name $NIC1OldName -NewName $NIC1Name
Get-NetAdapter -Name $NIC1Name | New-NetIPAddress -AddressFamily IPv4 -IPAddress $NIC1IPAddress -PrefixLength $NIC1PrefixLength -DefaultGateway $DefaultGateway
Set-DnsClientServerAddress -InterfaceAlias $NIC1Name -ServerAddress $DNSServer

Rename-NetAdapter -Name $NIC2OldName -NewName $NIC2Name
#Get-NetAdapter -Name $NIC2Name | New-NetIPAddress -AddressFamily IPv4 -IPAddress $NIC2IPAddress -PrefixLength $NIC2PrefixLength

Rename-NetAdapter -Name $NIC3OldName -NewName $NIC3Name
Get-NetAdapter -Name $NIC3Name | New-NetIPAddress -AddressFamily IPv4 -IPAddress $NIC3IPAddress -PrefixLength $NIC3PrefixLength

Rename-NetAdapter -Name $NIC4OldName -NewName $NIC4Name
Get-NetAdapter -Name $NIC4Name | New-NetIPAddress -AddressFamily IPv4 -IPAddress $NIC4IPAddress -PrefixLength $NIC4PrefixLength

# Storage Network の Jumbo Packets の設定
Set-NetAdapterAdvancedProperty -Name $NIC3Name -RegistryKeyword "*JumboPacket" -RegistryValue 9014
Set-NetAdapterAdvancedProperty -Name $NIC4Name -RegistryKeyword "*JumboPacket" -RegistryValue 9014

# Storage Network の ファイアウォール設定
New-NetFirewallRule -DisplayName "Allow Inbound Storage" -Direction Inbound -LocalAddress $NIC3IPAddress,$NIC4IPAddress -Action Allow

# NTP の設定
W32tm /config /manualpeerlist:"$NTPServers" /syncfromflags:manual /update
Restart-Service w32time
W32tm /resync

# リモートデスクトップの有効化
Set-ItemProperty 'registry::HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server' -Name "fDenyTSConnections" -Value 0
Enable-NetFirewallRule -Group "@FirewallAPI.dll,-28752"

Restart-Computer

再起動が完了しましたら、リモートデスクトップおよびストレージネットワークの疎通確認を行ってください。

リモートデスクトップおよびストレージネットワークの疎通確認

Step2:各種設定~役割と機能の有効化まで(対象:全ノード)

ここから各ノードにリモートデスクトップにして作業を進めます。

コマンド:

# WinRM の設定
Enable-WsManCredSSP -Role Client -DelegateComputer * -Force
Set-Item WSMan:\localhost\Client\TrustedHosts -Value * -Force

# 電源プランを高パフォーマンスに変更
powercfg /setactive "8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c"

# 電源ボタンの設定を変更 (電源ボタンを押しても何もしない に設定)
powercfg /SETACVALUEINDEX 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c SUB_BUTTONS PBUTTONACTION 0

# 記憶域スペースの I/O タイムアウトの調整
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\spaceport\Parameters -Name HwTimeout -Value 0x00002710 -Verbose

# ページングファイルの設定
$blockCacheMB = 1024
$pageFilePath = "C:\pagefile.sys"
$initialSize = [Math]::Round(51200 + $blockCacheMB)
$maximumSize = [Math]::Round(51200 + $blockCacheMB)
$system = Get-WmiObject -Class Win32_ComputerSystem -EnableAllPrivileges
if ($system.AutomaticManagedPagefile) {
	$system.AutomaticManagedPagefile = $false
	$system.Put()
}
$currentPageFile = Get-WmiObject -Class Win32_PageFileSetting
if ($currentPageFile.Name -eq $pageFilePath)
{
	$currentPageFile.InitialSize = $InitialSize
	$currentPageFile.MaximumSize = $MaximumSize
	$currentPageFile.Put()
}else{
	$currentPageFile.Delete()
	Set-WmiInstance -Class Win32_PageFileSetting -Arguments @{Name=$pageFilePath;
	InitialSize = $initialSize; MaximumSize = $maximumSize}
}

# 必要な機能のインストール と再起動
Install-WindowsFeature -Name "Failover-Clustering", "Hyper-V", "Data-Center-Bridging", "FS-FileServer" -IncludeManagementTools -Restart

Step1とStep2はまとめて実行すると再起動回数を減らせますので適宜カスタマイズしてください。

Step3:Hyper-Vの設定(対象:全ノード)

パラメーターの$NICPrefixにはStep1で設定したNIC1・NIC2の名前との依存関係がありますので留意してください。

パラメーター:

パラメーター
$SwitchName Hyper-V 仮想スイッチの名前 SET_Service
$NICPrefix チーミングするNIC名のプレフィックス Service

コマンド:

# Hyper-V インストール後に SET で仮想スイッチを作成
$NetAdapterNames = (Get-NetAdapter -Name "${NicPrefix}*").Name
New-VMSwitch -Name $SwitchName -NetAdapterName $NetAdapterNames -EnableEmbeddedTeaming $true -AllowManagementOS $true

# Hyper-V の拡張セッションモードを有効化
Set-VMHost -EnableEnhancedSessionMode $true

Step4:フェールオーバークラスターの設定(対象:任意のノード)

Step4は任意のノード1台で実施してください。
途中目視確認の項目がありますので、コマンドを3つに分けて記載しています。

パラメーター:

パラメーター
$ClusterNode ノードを配列で指定 @("winhost01.wgcluster.local", "winhost02.wgcluster.local", "winhost03.wgcluster.local")
$ClusterName クラスター名 wincluster
$ClusterAddress クラスターIPアドレス 172.16.0.104/24
$StorageAccountName クラウド監視用ストレージアカウント名 winclustercloudwitness
$StorageAccessKey ストレージアカウントキー **********
$CN1OldName クラスターネットワーク1の変更前の名前 クラスター ネットワーク 1
$CN1Name クラスターネットワーク1の変更後の名前 Service
$CN2OldName クラスターネットワーク2の変更前の名前 クラスター ネットワーク 2
$CN2Name クラスターネットワーク2の変更後の名前 Storage1
$CN3OldName クラスターネットワーク3の変更前の名前 クラスター ネットワーク 3
$CN3Name クラスターネットワーク3の変更後の名前 Storage2
$CN4OldName クラスターネットワーク4の変更前の名前 クラスター ネットワーク 4
$CN4Name クラスターネットワーク4の変更後の名前 Storage3

コマンド:

# WSFC の構築
New-Cluster -Node $ClusterNode -Name $ClusterName -StaticAddress $ClusterAddress -AdministrativeAccessPoint Dns -NoStorage

# クラスタークォーラムの設定
Set-ClusterQuorum -CloudWitness -AccountName $StorageAccountName -AccessKey $StorageAccessKey

# ノード障害発生時の VM のフェールオーバー待機の調整
(Get-Cluster).ResiliencyDefaultPeriod=0

Get-ClusterNetworkInterfaceにてクラスターネットワークの名前を確認。

Get-ClusterNetworkInterfaceにてクラスターネットワークの名前を確認

コマンド:

# クラスターネットワーク名の設定(パラメーターは Get-ClusterNetworkInterface の結果を見て修正)
(Get-ClusterNetwork -Name "${CN1OldName}").Name = $CN1Name
(Get-ClusterNetwork -Name "${CN2OldName}").Name = $CN2Name
(Get-ClusterNetwork -Name "${CN3OldName}").Name = $CN3Name
(Get-ClusterNetwork -Name "${CN4OldName}").Name = $CN4Name

# ライブマイグレーションネットワークの除外設定
$clusterResourceType = Get-ClusterResourceType -Name "Virtual Machine"
$serviceNetworkID = Get-ClusterNetwork -Name $CN1Name | Select -ExpandProperty ID
Set-ClusterParameter -InputObject $clusterResourceType -Name MigrationExcludeNetworks -Value $serviceNetworkID

Step5:記憶域スペースダイレクトの設定(対象:任意のノード)

Step5も任意のノード1台で実施してください。

パラメーター:

パラメーター
$PoolName ボリュームを作成する記憶域プール
ワイルドカードをつけて前方一致検索でヒットさせる
S2D*
$VolumeName ボリューム名 Volume01
$Size ボリュームサイズ 1TB
$Directory 仮想マシンの保存ディレクトリ Hyper-V

コマンド:

# 記憶域スペースダイレクトの有効化
Enable-ClusterStorageSpacesDirect -Confirm:$false

# ボリュームの作成
New-Volume -StoragePoolFriendlyName $PoolName -FriendlyName $VolumeName -FileSystem CSVFS_ReFS -Size $Size

# 仮想マシン保存ディレクトリの作成
New-Item -Path "C:\ClusterStorage\${VolumeName}" -Name $Directory -ItemType "directory"

Step6:その他の設定(対象:全ノード)

最後にその他のこまごました設定を投入します。

パラメーター:

パラメーター
$VirtualMachinePath 仮想マシンの既定の保存場所 C:¥ClusterStorage¥Volume01¥Hyper-V
$VirtualHardDiskPath 仮想ディスクの既定の保存場所 C:¥ClusterStorage¥Volume01¥Hyper-V

コマンド:

# 仮想マシン作成時の既定の保存場所の変更
Get-ClusterSharedVolume | Move-ClusterSharedVolume -Node $env:COMPUTERNAME
Set-VMHost -VirtualMachinePath $VirtualMachinePath -VirtualHardDiskPath $VirtualHardDiskPath

出来上がり

これでひと通りの構築が完了しましたので出来上がりを確認してみましょう。
ワークグループクラスターの場合、同じユーザー/パスワードのローカルユーザーを作成→サインインを行った環境からリモートサーバー管理ツールにて管理することができます。

クラスターノード:

クラスターノード

クラスター記憶域:

クラスター記憶域

クラスターネットワーク:

クラスターネットワーク

Hyper-V:

Hyper-V

ライブマイグレーションはできない:

ライブマイグレーションはできない

クイックマイグレーションは可能(WinHost01→WinHost03へ移動):

クイックマイグレーションは可能(WinHost01→WinHost03へ移動)

障害発生時のフェールオーバー(WinHost03停止でWinHost03→WinHost01へ移動):

障害発生時のフェールオーバー(WinHost03停止でWinHost03→WinHost01へ移動)

おわりに

Hyper-V ワークグループクラスター構築いかがでしたでしょうか?
今回は最低限の構成までですがコマンド化してしまうことでかなりサクサク進めることができました。Active Directoryがないのでドメイン参加などの手間が省けるとこにも工数削減効果を感じますね。
hostsだけで構築可能(インターネット向けの名前解決除く)なところも発見でした。

  • 文中の商品名、会社名、団体名は、一般に各社の商標または登録商標です。

Hyper-V ワークグループクラスター構築