Merged Storage Cluster Networks block Update

May 11, 2026 ยท View on GitHub

Component Cluster Networks
Severity Medium
Applicable Scenarios Update, Day to Day
Affected Versions All Versions

Overview

This issue only applies to Clusters with more than one Storage VLAN. In some cases the Storage Cluster Networks will be combined into one. This is an unexpected configuration and will block updates.

When the Storage Networks are combined the Cluster will see only one network available to it for Live Migration. Note that this does not reduce redundancy as there are still two VLANs available for migration. However, it may reduce the overall bandwidth available to migration since the two networks cannot be used in parallel.

Symptoms

You may identify this issue in three ways:

Update Failure: Update will fail with the following error.

CloudEngine.Actions.InterfaceInvocationFailedException: Type 'ValidateAndTuneNetworkATCAndClusterConfigurationPostUpdate' of Role 'HostNetwork' raised an exception:

Cluster storage network for storage network intent [ storage ] not ready after 10 minutes.

CSS Tools Insight: The 1.2605.5.1611 release of CSSTools adds a Host Network insight to detect and flag this issue.

Manual Detection: From a cluster node, run the following.

[azlocal-node1]: PS C:\> Get-ClusterNetwork | Format-Table Name, Address, IPv4Addresses, AddressMask, State

Name              Address      Ipv4Addresses          AddressMask   State
----              -------      -------------          -----------   -----
Cluster Network 1 x.x.x.x      {x.x.x.x}              255.255.255.0    Up
Cluster Network 2 10.71.1.0    {10.71.1.0, 10.71.2.0} 255.255.255.0    Up

In this example output Cluster Network 2 is configured with both Storage subnets 10.71.1.0/24 and 10.71.2.0/24.

From the Network Intent, we can see that 10.71.1.0/24 is VLAN 711 and 10.71.2.0/24 is VLAN 712. In the expected configuration, these should be in TWO Cluster Networks.

[azlocal-node1]: PS C:\> Get-NetIntent | Select-Object IntentName, IsComputeIntentSet, IsStorageIntentSet, IsManagementIntentSet, StorageVLANs, NetAdapterNamesAsList


IntentName            : managementcomputestorage
IsComputeIntentSet    : True
IsStorageIntentSet    : True
IsManagementIntentSet : True
StorageVLANs          : {711, 712}
NetAdapterNamesAsList : {ethernet, ethernet 2}

Failover Cluster Manager: From Failover Cluster manager, identify the storage Cluster Network. It should not have more than one subnet configured.

Cluster Network 2 has two networks configured

Root Cause

When the Cluster detects that the adapters are on the same subnet it will merge them. If the Storage Adapter's IPs are configured to be all on the same subnet the Cluster Networks will merge.

If you have assigned Storage IPs manually, they must be a part of different subnets.

Resolution

Prerequisites

Warning

This mitigation will temporarily reduce Storage redundancy down to one VLAN. A maintenance window is reccomended.

Steps

  1. Identify the set of adapters that need to be split

In this example, the adapters that should be in the 10.71.2.0/24 subnet are in the Cluster Network 2 with address 10.71.1.0. Therefore, the 10.71.2.0/24 adapters need to be split.

Name              Address      Ipv4Addresses          AddressMask   State
----              -------      -------------          -----------   -----
Cluster Network 1 x.x.x.x      {x.x.x.x}              255.255.255.0    Up
Cluster Network 2 10.71.1.0    {10.71.1.0, 10.71.2.0} 255.255.255.0    Up

Looking at the Network Intent, 10.71.2.0/24 maps to VLAN 712

[azlocal-node1]: PS C:\> Get-NetIntent | Select-Object IntentName, IsComputeIntentSet, IsStorageIntentSet, IsManagementIntentSet, StorageVLANs, NetAdapterNamesAsList


IntentName            : managementcomputestorage
IsComputeIntentSet    : True
IsStorageIntentSet    : True
IsManagementIntentSet : True
StorageVLANs          : {711, 712}
NetAdapterNamesAsList : {ethernet, ethernet 2}

This means that the vSMB(managementcomputestorage#ethernet 2) on each node are the ones that have merged. The format of the Virtual Network Adapter Name is vSMB(storage_intent_name#storage_adapter).

  1. Disable the split adapters on each node, at the same time

From step 1, we have identified vSMB(managementcomputestorage#ethernet 2) as the adapters that have merged with Cluster Network 2.

Open a PS Session to all Cluster Nodes and disable the Network Adapter. You must disable the adapter on all nodes before proceeding with Step 3.

Warning

At this time, Storage redundancy is temporarily reduced to one VLAN.

$storageAdapter = Get-VMNetworkAdapter -Name "vSMB(managementcomputestorage#ethernet 2)" -ManagementOs
Disable-NetAdapter $storageAdapter.Name -Confirm:$false
  1. Re-enable the NetAdapters on each node

Only proceed with this step after Step 2. The Storage adapter must have been disabled on each node in the cluster.

$storageAdapter = Get-VMNetworkAdapter -Name "vSMB(managementcomputestorage#ethernet 2)" -ManagementOs
Enable-NetAdapter $storageAdapter.Name -Confirm:$false
  1. Confirm that the Networks have split

In Failover Cluster Manager and CLI you should now see a new Cluster Network with the 10.71.2.0 address space.

[azlocal-node01]: PS C:\> Get-ClusterNetwork | Format-Table Name, Address, AddressMask, State

Name              Address      AddressMask   State
----              -------      -----------   -----
Cluster Network 1 x.x.x.x      255.255.255.0    Up
Cluster Network 2 10.71.1.0    255.255.255.0    Up
Cluster Network 4 10.71.2.0    255.255.255.0    Up
  1. Reconfigure MigrationNetworkOrder

Run the following script to update the Migration Network Order with the new Storage Network.

This step can be run on any one node.

$ErrorActionPreference = "Stop"

$storageIntentName = (Get-NetIntent  | Where-Object {$_.IsStorageIntentSet}).IntentName
$storageAdapters = Get-NetAdapter -Name "vSMB($storageIntentName*"
$storageAdapterGuids = $storageAdapters | ForEach-Object { $_.InterfaceGuid.ToString().ToLowerInvariant() }
Write-Host "Storage adapter GUIDs: $($storageAdapterGuids -join ', ')"

[String[]] $storageClusterNetworkNames = Get-ClusterNetworkInterface -Node $env:COMPUTERNAME |
    Where-Object { "{$($_.AdapterId)}" -in $storageAdapterGuids } |
    ForEach-Object { $_.Network }
Write-Host "Storage cluster network names: $($storageClusterNetworkNames -join ', ')"

[String[]] $storageNetworkIds = (Get-ClusterNetwork -Name $storageClusterNetworkNames).Id | Select-Object -Unique
Write-Host "Storage network IDs: $($storageNetworkIds -join ', ')"

# Remove storage networks from MigrationExcludeNetworks (case-insensitive)
$currentExclude = (Get-ClusterResourceType "Virtual Machine" |
    Get-ClusterParameter -Name "MigrationExcludeNetworks").Value -Split ";" | Where-Object { $_ -ne "" }
Write-Host "Current MigrationExcludeNetworks: $($currentExclude -join '; ')"

$storageNetworkIdsLower = $storageNetworkIds | ForEach-Object { $_.ToLower() }
$newExclude = $currentExclude | Where-Object { $_.ToLower() -notin $storageNetworkIdsLower }
Write-Host "New MigrationExcludeNetworks: $($newExclude -join '; ')"

Get-ClusterResourceType "Virtual Machine" |
    Set-ClusterParameter -Name "MigrationExcludeNetworks" -Value ""
Get-ClusterResourceType "Virtual Machine" |
    Set-ClusterParameter -Name "MigrationExcludeNetworks" -Value ($newExclude -join ";")
Write-Host "Done setting MigrationExcludeNetworks."

# Prepend storage networks to existing MigrationNetworkOrder (case-insensitive dedup)
$currentOrder = (Get-ClusterResourceType "Virtual Machine" |
    Get-ClusterParameter -Name "MigrationNetworkOrder").Value -Split ";" | Where-Object { $_ -ne "" }
Write-Host "Current MigrationNetworkOrder: $($currentOrder -join '; ')"

$newOrder = ($storageNetworkIds + $currentOrder) | ForEach-Object { $_.ToLower() } | Select-Object -Unique
Write-Host "New MigrationNetworkOrder: $($newOrder -join '; ')"

Get-ClusterResourceType "Virtual Machine" |
    Set-ClusterParameter -Name "MigrationNetworkOrder" -Value ""
Get-ClusterResourceType "Virtual Machine" |
    Set-ClusterParameter -Name "MigrationNetworkOrder" -Value ($newOrder -join ";")
Write-Host "Done setting MigrationNetworkOrder."