本ブログでは、Azure Stack HCI 23H2 プレビュー (25398.584) を展開する際のメモ などの検証を行う際には、NUC9VXQNX を使用して物理環境でシングルノードの Azure Stack HCI を構築していました。
以前は問題なく展開できていたのですが、直近で展開しようとすると以前は問題にならなかった箇所で、エラーとなるケースがありましたので、その際の情報をまとめておきたいと思います。
Contents
使用しているハードウェア
前述のとおり、ハードウェアのベースとしては、NUC9VXQNX を使用しています。
この NUC に次のハードウェアを増設して使っているのが今回の環境となります。
- センチュリー PCI Express ×4接続 M.2 NVMe SSD ×1枚増設用インターフェイスカード CIF-M2NV_FP
- Samsung 980 1TB PCIe Gen 3.0 ×4 NVMe M.2 × 4
後述の作業をする必要がありますが、2024-08 時点ではこの環境でシングルノードの Azure Stack HCI を組むことができています。
RDMA プロトコルの無効化
HCI の展開時には各ネットワークアダプターの「ネットワーク設定のカスタマイズ」から、RDMA プロトコルの設定を行うことができ、デフォルトでは「RoCEv2」が選択されています。
NUC9VXQNX に標準搭載されている NIC は、Intel I219-LM / I210 となりますが、この NIC では RDMA はサポートされていないため、ネットワーク設定の標準で進めていくと、展開前の検証の「Check network requirements」で次のエラーが発生します。
Type ‘ValidateNetwork’ of Role ‘EnvironmentValidator’ raised an exception: Network requirements not met. Review output and remediate: Rule: HealthCheckSource : Deployment\Network\317ef9f5 Name : AzStackHci_Network_Test_NetAdapter_Symmetry_Bandwidth DisplayName : Test if network adapters used in one intent is symmetry and if bandwidth meets minimum requirement Tags : {} Title : Test NetAdapter symmetry and bandwidth requirement Status : FAILURE Severity : CRITICAL Description : Checking network adapters and bandwidth Status on 10.101.0.4 Remediation : Make sure adapters used in intent are symmetry and mininum bandwidth to use for RDMA is 10G. Use Get-NetAdapter cmdlet on the system to check the adapter information. TargetResourceID : 10.101.0.4 TargetResourceName : NetAdapter TargetResourceType : Network Adapter Symmetry and Bandwidth Timestamp : 8/8/2024 2:13:23 AM AdditionalData: Key : Detail Value : ERROR: Network adapter(s) are not symmetric or do not meet bandwidth requirement on NUC-104 –> Adapter Symmetry Check: Link speed and Component ID should be same for all adapters in the intent — NUC-104 (Management Ethernet, 1 Gbps, PCI\VEN_8086&DEV_15BB&SUBSYS_00008086) –> Adapter Symmetry Check: Link speed and Component ID should be same for all adapters in the intent — NUC-104 (Ethernet, 1 Gbps, PCI\VEN_8086&DEV_1533) –> Adapter Bandwidth Check for storage adapters when RDMA enabled: Need to be 10Gbps or higher — NUC-104 (Ethernet, 1 Gbps) Key : Status Value : FAILURE Key : TimeStamp Value : 08/08/2024 02:13:23 Key : Resource Value : Network Adapter Symmetry and Bandwidth Key : Source Value : 10.101.0.4 at ParseResult, C:\NugetStore\AzStackHci.EnvironmentChecker.Deploy.1.2100.2671.426\content\Classes\EnvironmentValidator\EnvironmentValidator.psm1: line 1040 at Test-AzStackHciNetwork, C:\Program Files\WindowsPowerShell\Modules\AzStackHci.EnvironmentChecker\AzStackHciNetwork\AzStackHciNetwork.psm1: line 143 at <ScriptBlock>, <No file>: line 1 at RunSingleValidator, C:\NugetStore\AzStackHci.EnvironmentChecker.Deploy.1.2100.2671.426\content\Classes\EnvironmentValidator\EnvironmentValidator.psm1: line 612 at ValidateNetwork, C:\NugetStore\AzStackHci.EnvironmentChecker.Deploy.1.2100.2671.426\content\Classes\EnvironmentValidator\EnvironmentValidator.psm1: line 356 at <ScriptBlock>, C:\NugetStore\Microsoft.AzureStack.Solution.LCMControllerWinService.10.2405.0.512\content\LCMControllerWinService\InvokeInterfaceInternal.psm1: line 134 at Invoke-EceInterfaceInternal, C:\NugetStore\Microsoft.AzureStack.Solution.LCMControllerWinService.10.2405.0.512\content\LCMControllerWinService\InvokeInterfaceInternal.psm1: line 130
RDMA をサポートしていない NIC を使用する場合は、明示的に RDMA プロトコルを Disabled に設定する必要があります。
RSS をサポートする NIC を使用する
※SR で確認をしたところ 2024-09 時点ではドキュメントに記載はないですが RSS は必須ということでした。そのため、RSS を有効にできない Intel のコンシューマー向けの NIC のみで構成されている環境では今後は Nested Hyper-V 等で構築する必要があるかと。
今までは意識していなかったのですが、Netowkr ATC を使用してネットワーク設定を実施する場合、SET を使用する場合の NIC の対称性 の他に、RSS のサポートについても意識する必要があったようです。
RSS をサポートしていない NIC で Network ATC による Network Intent が設定されようとすると、次のように「Configure networking」でエラーが発生します。
エラーの詳細は以下となります。
Type ‘ConfigureAzureStackHostNetworkingPhase2’ of Role ‘HostNetwork’ raised an exception: Stopping execution after failing to apply intent "compute_management" on host "NUC-104". at TestNetworkAtcIntentStatus, C:\NugetStore\Microsoft.AS.Network.Deploy.HostNetwork.1.2405.0.72\content\Powershell\Roles\HostNetwork\HostNetwork.psm1: line 1549 at ConfigureHostAdaptersWithNetworkAtcForHosts, C:\NugetStore\Microsoft.AS.Network.Deploy.HostNetwork.1.2405.0.72\content\Powershell\Roles\HostNetwork\HostNetwork.psm1: line 2069 at Set-HostAdaptersWithNetworkAtc, C:\NugetStore\Microsoft.AS.Network.Deploy.HostNetwork.1.2405.0.72\content\Powershell\Roles\HostNetwork\HostNetwork.psm1: line 2198 at Invoke-ConfigureHostAdaptersWithNetworkAtc<Process>, C:\NugetStore\Microsoft.AS.Network.Deploy.HostNetwork.1.2405.0.72\content\Powershell\Roles\HostNetwork\HostNetwork.psm1: line 2579 at Invoke-ConfigureAzureStackHostNetworkingPhase2, C:\NugetStore\Microsoft.AS.Network.Deploy.HostNetwork.1.2405.0.72\content\Powershell\Roles\HostNetwork\HostNetwork.psm1: line 3621 at ConfigureAzureStackHostNetworkingPhase2, C:\NugetStore\Microsoft.AS.Network.Deploy.HostNetwork.1.2405.0.72\content\Powershell\Classes\HostNetwork\HostNetwork.psm1: line 17 at <ScriptBlock>, C:\CloudDeployment\ECEngine\InvokeInterfaceInternal.psm1: line 134 at Invoke-EceInterfaceInternal, C:\CloudDeployment\ECEngine\InvokeInterfaceInternal.psm1: line 130
NUC9VXQNX の Intel I219-LM で RSS を有効にする方法
NUC9VXQNX だけでなく、I219-LM を使用している環境共通の事象の可能性がありますが、 Windows Server 2022* 用インテルR ネットワーク・アダプター・ドライバー から 2024-08 の最新バージョンのドライバーである「29.1」 をインストールしただけでは、上述のエラーが発生し、展開をすることができませんでした。
このエラーは Network ATC に起因しており、「Get-NetIntentStatus」で確認してみると、設定の状況が「Failed」「ProvisioningFailed」となっていました。
Network ATC のログについてはイベントログの「Microsoft-Windows-Networking-NetworkAtc/Admin」から確認することができますが、、今回のケースでは次のようなエラーが発生していました。
Network ATC failed while applying the intent (compute_management). Please refer to the service traces for details on the failure. Exception : (System.NullReferenceException: Object reference not set to an instance of an object.
at FabricManager.FabricManagerLibrary.PsWrap_SetOrCheckNetAdapterRssSettings(String displayName, Nullable`1 enabled, Nullable`1 baseProcessorGroup, Nullable`1 baseProcessorNumber, Nullable`1 maxProcessorGroup, Nullable`1 maxProcessorNumber, Nullable`1 maxProcessors, String profile, Boolean noRestart)
at FabricManager.FabricHelperFacade.EnableRssOrCheckSettings(String netadapterName, RssConfiguration rssConfigExpected)
at FabricManager.HostNetworkAdapterResource.ProvisionForHostNic(Boolean isCompute, Int32 vlan, Boolean isStorage, NetAdapterSymmetry symmetryInfo)
at FabricManager.SwitchConfig.Provision()
at FabricManager.IntentService.OntimerCallback(Object state))
NUC9VXQNX では、オンボードの NIC として、「Intel I210」 と「Intel I219-LM」 の 2 ポートが搭載されています。
「Get-NetAdapterRSS | Select Name, Enabled」で RSS の情報を確認すると、「Intel I219-LM 」の NIC (Management Ethernet) については、最新のドライバーを適用しただけでは、次のように「Enabled」がブランクの情報となってしまっており、これに起因してエラーが発生しているように見えます。
イレギュラーな設定方法となってしまうのですが、、「Intel I219-LM 」で RSS を 「True」 の状態にするには、26.3 → 29.1 の順番でインストールすることで、Enabled が True の状態にすることができます。
26.3 をインストールしたタイミングで「True 」となり、その状態で最新化 (29.1 をインストール) すると「True」は継続されます。
- 26.3: https://www.intel.co.jp/content/www/jp/ja/download/19372/30650/intel-network-adapter-driver-for-windows-server-2019.html
- 29.1: https://www.intel.co.jp/content/www/jp/ja/download/19372/intel-network-adapter-driver-for-windows-server-2019.html
この状態であれば、「Configure networking」で RSS の状態の確認についての Exception は発生せずに後続の処理を実行することができます。
以前、Minisforum MS-01 についてのメモ という投稿を書いたときに参考にした、My Azure Stack HCI Home Lab – Part 2 で Intel I226 の RSS 有効化の問題について触れられていたのですが、これが私の環境でも顕在化した形でしょうか。
以前はなぜ RSS の問題に遭遇していなかったのか?
NUC9VXQNX は本ブログの Azure Stack HCI の検証で以前から使用しているものとなるのですが、これまでの検証では RSS の問題には遭遇していませんでした。
以前 (2024-02 付近) は、次のようなネットワークの構成を使用していました。
- Intel I219-LM
- RDP の接続用に使用するプライマリの NIC としており、Network ATC では使用しない
- 28.2 のドライバーを使用していたため、RSS の Enabled はブランク (NULL) となっている
- IP: 10.101.0.4/8 / DNS: 10.1.0.1 / GW: 10.255.255.254
- Intel I210
- Network ATC で Management / Compute / Storage の全ての Intent で使用する NIC
- 28.2 のドライバーを使用している状態でも RSS は Tue となっている
- IP: 10.101.104.20/8 / DNS: 10.1.0.1 / GW: なし
この構成の場合、I219-LM は Network ATC で操作されない NIC となり、RSS が True となっている I210 のみが Network ATC で操作されていました。そのため RSS の問題には遭遇していなかったようです。
以前は、デフォルトゲートウェイが設定されていない NIC に対しても管理用ネットワークを展開することができていたのですが、現在はそのような展開はできなくなっているようで、2024-08 時点では次のような構成で展開を行っていました。
- Intel I219-LM
- Network ATC で Management / Compute の Intent で使用する NIC
- 29.1 のドライバーを使用していたため、RSS の Enabled はブランク (NULL) となっている
- IP: 10.101.0.4/8 / DNS: 10.1.0.1 / GW: 10.255.255.254
- Intel I210
- Network ATC で Storage の Intent で使用する NIC
- 29.1 のドライバーを使用している状態でも RSS は Tue となっている
- IP: DHCP
このような構成とした場合、Network ATC で Intel I219-LM が操作対象となるため、2024-08 時点の展開では、RSS の問題が顕在化したのではと考えています。
ついでなので Netowrk ATC による RSS のチェックの実装も確認しておく
ついでなので、以前 (2024-02 時点) から、Network ATC による RSS のチェックが実行されているのかも確認してみました。
結論を先に書いておくと、以前から RSS のチェックは実行されており、前述のとおり、以前設定可能だった構成では、RSS がブランクの NIC は Network ATC の操作対象外であったため、エラーが顕在化していなかったのだと思います。
エラー内容の確認方法
RSS が無効な NIC を使用しようとすると、前述のとおり、次の内容からエラーを確認することができます。
- Azure のデプロイの「Configure Network」のエラーの詳細
- HCI を展開した OS の 「Microsoft-Windows-Networking-NetworkAtc/Admin」のイベントログ
他にも、「c:\Observability\HostNetwork\NetworkAtcTracing」内にも Network ATC についての ETL のトレースが取得されており、この情報からどのような状態になっているのかを確認することもできるようです。
実装の確認方法
Azure のデプロイから確認できるエラーは展開で使用しているスクリプトで例外が発生した個所となり、今回の事象であれば、「C:\NugetStore\Microsoft.AS.Network.Deploy.HostNetwork.xxx\content\Powershell\Roles\HostNetwork\HostNetwork.psm1」となるかと思います。
最新の Nuget パッケージであれば、このモジュール内の「TestNetworkAtcIntentStatus」で Network Intent のステータスの確認が行われています。(以前の Nuget パッケージでは「Test-NetworkAtcIntentStatus」で Network Intent のステータスの確認が行われており、このコマンドレットは CloudCommon のモジュールに含まれていました)
デプロイ時には、これらの PowerShell が利用されていますが、Netowrk ATC のステータスのチェックの実装については「c:\Windows\System32\NetworkAtc.Driver.dll」で確認することができます。
この DLL には、FabricManager の Namespace が実装されており、イベントログの「Microsoft-Windows-Networking-NetworkAtc」に出力されていた Exception のメソッドの実装を確認することができます。
サブネットマスクによっては展開時にエラーとなる
※本事象は開発部による対応が行われており、2024-08 の修正に組み込まれる予定となっているとのことです。
HCI の展開時には次の画面で IP とサブネットの指定を行いますが、2024-08-08 時点では、ここでサブネットに /8 (255.0.0.0) を使用していました。
このサブネットの場合「Deploy Arc infrastructure components」でエラーが発生しました。
Type ‘DeployArb’ of Role ‘MocArb’ raised an exception: [DeployArb:Fetching vmSwitch from networkhelpers, ManagementIP, DNS Server] 8 is not a valid IPv4 subnet prefix-length. at at NormalizeIPv4Subnet, C:\NugetStore\Microsoft.AzureStack.MocArb.LifeCycle.1.2405.0.10\content\Scripts\Common\NetworkHelpers.psm1: line 684 at Get-MgmtAdapterSubnetCIDRGatewayDnsServersForArbDeployment, C:\NugetStore\Microsoft.AzureStack.MocArb.LifeCycle.1.2405.0.10\content\Scripts\Common\NetworkHelpers.psm1: line 1487 at DeployArbInternal, C:\NugetStore\Microsoft.AzureStack.MocArb.LifeCycle.1.2405.0.10\content\Scripts\MocArbHelper.psm1: line 801 at DeployArb, C:\NugetStore\Microsoft.AzureStack.MocArb.LifeCycle.1.2405.0.10\content\Scripts\MocArbLifeCycleManager.psm1: line 131 at <ScriptBlock>, C:\CloudDeployment\ECEngine\InvokeInterfaceInternal.psm1: line 134 at Invoke-EceInterfaceInternal, C:\CloudDeployment\ECEngine\InvokeInterfaceInternal.psm1: line 130 Command Arguments ——- ——— DeployArbInternal {Parameters=CloudEngine.Configurations.EceInterfaceParameters} {} <ScriptBlock> {CloudEngine.Configurations.EceInterfaceParameters, MocArb, DeployArb, C:\NugetStore\Micr… Invoke-EceInterfaceInternal {CloudDeploymentModulePath=C:\NugetStore\Microsoft.AzureStack.Solution.Deploy.CloudDeploy… at Trace-Error, C:\NugetStore\Microsoft.AzureStack.MocArb.LifeCycle.1.2405.0.10\content\Scripts\Common\Tracer.psm1: line 63 at DeployArbInternal, C:\NugetStore\Microsoft.AzureStack.MocArb.LifeCycle.1.2405.0.10\content\Scripts\MocArbHelper.psm1: line 1118 at DeployArb, C:\NugetStore\Microsoft.AzureStack.MocArb.LifeCycle.1.2405.0.10\content\Scripts\MocArbLifeCycleManager.psm1: line 131 at <ScriptBlock>, C:\CloudDeployment\ECEngine\InvokeInterfaceInternal.psm1: line 134 at Invoke-EceInterfaceInternal, C:\CloudDeployment\ECEngine\InvokeInterfaceInternal.psm1: line 130
「8 is not a valid IPv4 subnet prefix-length. at at NormalizeIPv4Subnet,」と出力されているように /8 が有効なサブネットとして認識されていません。
「C:\NugetStore\Microsoft.AzureStack.MocArb.LifeCycle.1.2405.0.10\content\Scripts\Common\NetworkHelpers.psm1」で次のような比較が行われているのですが、8 が文字列として比較されているようで「"8" -gt 32」が「true」となってしまっているようです。
if ($prefixLength -lt 0 -or $prefixLength -gt 32) { throw "$prefixLength is not a valid IPv4 subnet prefix-length." }
明示的に [int] にキャストするようにすればエラーは回避できるかと思います。
if ([int]$prefixLength -lt 0 -or [int]$prefixLength -gt 32) { throw "$prefixLength is not a valid IPv4 subnet prefix-length." }
まとめ
RSS を有効として認識させるために、少しトリッキーなことをしなくてはいけませんが、2024-08 時点では、NUC9VXQNX に Azure Stack HCI を 直接インストールをして Azure Stack HCI の検証環境を物理環境上にを展開することは可能となっていました。
コンシューマー向けの Intel の NIC については最新のドライバーでは RSS のサポートが無くなっているようですので、NUC の物理筐体に直接インストールして Azure Stack HCI を構築するのは難しくなってくるかもしれませんね。
今後、自宅の資材を使用して、HCI の構築をする場合は、Nested Hyper-V の利用も検討したいと思います。
今回は以前展開したときと比較して、展開時のネットワーク関連の挙動が変わったことで影響を受ける箇所が多く、ネットワークの確認に厳密性を求められるようなチェックが増えているように思えました。
展開については、既存の Key Vault を使用した展開もできるようになっており、展開方法の改善も行われているようでした。
Azure Stack HCI は、定期的に新規展開を行い、変更箇所は把握したほうがよさそうですね。