In this topology, each cluster node will be configured to separate SET switches for management and storage traffic. All these commands must be run on the VMM Server.
#Variables to populate
$hostGroupName = 'S2DHosts'
$runAsAccountName = 'Administrator'
$runAsCredential = Get-Credential
$storageUplinkPortProfileName = 'S2D_Storage_UPP'
$managementUplinkPortProfileName = 'S2D_Management_UPP'
$storageLogicalSwitchName = 'StorageSwitch'
$managementLogicalSwitchName = 'ManagementSwitch'
#logicalNetworks hash
#Do not update IsManagement and InheritsAddressFromPhysicalNetworkAdapter key values
$logicalNetworks = @(
#Management Network
@{
Name = 'Management'
Subnet = '172.16.102.0/24'
VLANID = 102
IsManagement = $true
InheritsAddressFromPhysicalNetworkAdapter = $false
#Used for IP Pool
StartIP = '172.16.102.121'
EndIP = '172.16.102.130'
DNSServer = '172.16.102.2'
DNSSuffix = 'HCI.lab'
GatewayAddress = '172.16.102.1'
IPPoolName = 'Management-IPPool'
},
#Storage 1 Network
@{
Name = 'Storage1'
Subnet = '172.16.103.0/24'
VLANID = 103
IsManagement = $false
InheritsAddressFromPhysicalNetworkAdapter = $false
#Used for IP Pool
StartIP = '172.16.103.121'
EndIP = '172.16.103.130'
IPPoolName = 'Storage1-IPPool'
},
#Storage 2 Network
@{
Name = 'Storage2'
Subnet = "172.16.104.0/24"
VLANID = 104
IsManagement = $false
InheritsAddressFromPhysicalNetworkAdapter = $false
#Used for IP Pool
StartIP = '172.16.104.121'
EndIP = '172.16.104.130'
IPPoolName = 'Storage2-IPPool'
}
)
#New SC Host group
New-SCVMHostGroup -Name $hostGroupName
#Create RunAs Account
New-SCRunAsAccount -Name $runAsAccountName -Credential $runAsCredential
#Create management logical network
$hostGroup = Get-SCVMHostGroup -Name $hostGroupName
foreach ($logicalNet in $logicalNetworks)
{
#VLAN-based independent logical network
$logicalNetwork = New-SCLogicalNetwork -Name $logicalNet.Name -LogicalNetworkDefinitionIsolation $true -EnableNetworkVirtualization $false -UseGRE $false -IsPVLAN $false
$subnetVlan = New-SCSubnetVLan -Subnet $logicalNet.Subnet -VLanID $logicalNet.VLANID
$logicalNetDefinition = New-SCLogicalNetworkDefinition -Name "$($logicalNet.Name)_0" -LogicalNetwork $logicalNetwork -VMHostGroup $hostGroup -SubnetVLan $subnetVlan -RunAsynchronously
#Create VM Network
$vmNetwork = New-SCVMNetwork -Name $logicalNet.Name -LogicalNetwork $logicalNetwork -IsolationType "VLANNetwork"
$vmSubnet = New-SCVMSubnet -Name "$($logicalNet.Name)_0" -LogicalNetworkDefinition $logicalNetDefinition -SubnetVLan $subnetVlan -VMNetwork $vmNetwork
}
#Create IP Pool
foreach ($logicalNet in $logicalNetworks)
{
# Get Logical Network
$logicalNetwork = Get-SCLogicalNetwork -Name $logicalNet.Name
# Get Logical Network Definition
$logicalNetworkDefinition = Get-SCLogicalNetworkDefinition -Name "$($logicalNet.Name)_0"
$gateway = @()
if ($logicalNet.GatewayAddress)
{
$gateway += New-SCDefaultGateway -IPAddress $logicalNet.GatewayAddress -Automatic
}
New-SCStaticIPAddressPool -Name $logicalNet.IPPoolName -LogicalNetworkDefinition $logicalNetworkDefinition `
-Subnet $logicalNet.Subnet -IPAddressRangeStart $logicalNet.StartIP `
-IPAddressRangeEnd $logicalNet.EndIP -DefaultGateway $gateway `
-DNSServer $logicalNet.DNSServer -DNSSuffix "" -DNSSearchSuffix $logicalNet.DNSSuffix -RunAsynchronously
}
#Create Storage UPP
$storageNetworkDefinition = @()
foreach ($logicalNet in $logicalNetworks)
{
if (!$logicalNet.IsManagement)
{
$storageNetworkDefinition += Get-SCLogicalNetworkDefinition -Name "$($logicalNet.Name)_0"
}
}
New-SCNativeUplinkPortProfile -Name $storageUplinkPortProfileName -Description "Storage Uplink Port profile" -LogicalNetworkDefinition $storageNetworkDefinition -EnableNetworkVirtualization $false -LBFOLoadBalancingAlgorithm "HostDefault" -LBFOTeamMode "SwitchIndependent" -RunAsynchronously
#Create Management UPP
$managementNetworkDefinition = @()
foreach ($logicalNet in $logicalNetworks)
{
if ($logicalNet.IsManagement)
{
$managementNetworkDefinition += Get-SCLogicalNetworkDefinition -Name "$($logicalNet.Name)_0"
}
}
New-SCNativeUplinkPortProfile -Name $managementUplinkPortProfileName -Description "Management Uplink Port profile" -LogicalNetworkDefinition $managementNetworkDefinition -EnableNetworkVirtualization $false -LBFOLoadBalancingAlgorithm "HostDefault" -LBFOTeamMode "SwitchIndependent" -RunAsynchronously
#Logical Switches - both management and storage
$managementLogicalSwitch = New-SCLogicalSwitch -Name $managementLogicalSwitchName -Description 'Management Logical Switch' -EnableSriov $false -SwitchUplinkMode 'EmbeddedTeam' -MinimumBandwidthMode 'Weight'
$storageLogicalSwitch = New-SCLogicalSwitch -Name $storageLogicalSwitchName -Description 'Storage Logical Switch' -EnableSriov $false -SwitchUplinkMode 'EmbeddedTeam'
# Get Native Uplink Port Profile - Management
$managementNativeUppVar = Get-SCNativeUplinkPortProfile -Name $managementUplinkPortProfileName
$managementUppSetVar = New-SCUplinkPortProfileSet -Name $managementUplinkPortProfileName -LogicalSwitch $managementLogicalSwitch -NativeUplinkPortProfile $managementNativeUppVar -RunAsynchronously
# Get Native Uplink Port Profile - Storage
$storageNativeUppVar = Get-SCNativeUplinkPortProfile -Name $storageUplinkPortProfileName
$storageUppSetVar = New-SCUplinkPortProfileSet -Name $storageUplinkPortProfileName -LogicalSwitch $storageLogicalSwitch -NativeUplinkPortProfile $storageNativeUppVar -RunAsynchronously
foreach ($logicalNet in $logicalNetworks)
{
# Get VM Network
$vmNetwork = Get-SCVMNetwork -Name $logicalNet.Name
# Get VMSubnet
$vmSubnet = Get-SCVMSubnet -Name "$($logicalNet.Name)_0"
if (-not ($logicalNet.IsManagement))
{
# Get Static IP Address Pool
$ipV4Pool = Get-SCStaticIPAddressPool -Name $logicalNet.IPPoolName
New-SCLogicalSwitchVirtualNetworkAdapter -Name $logicalNet.Name -UplinkPortProfileSet $storageUppSetVar -RunAsynchronously -VMNetwork $vmNetwork -VMSubnet $vmSubnet -IsUsedForHostManagement $logicalNet.IsManagement -InheritsAddressFromPhysicalNetworkAdapter $logicalNet.InheritsAddressFromPhysicalNetworkAdapter -IPv4AddressType "Static" -IPv6AddressType "Dynamic" -IPv4AddressPool $ipV4Pool
}
else
{
$ipV4Pool = Get-SCStaticIPAddressPool -Name $logicalNet.IPPoolName
New-SCLogicalSwitchVirtualNetworkAdapter -Name $logicalNet.Name -UplinkPortProfileSet $managementUppSetVar -RunAsynchronously -VMNetwork $vmNetwork -VMSubnet $vmSubnet -IsUsedForHostManagement $logicalNet.IsManagement -InheritsAddressFromPhysicalNetworkAdapter $logicalNet.InheritsAddressFromPhysicalNetworkAdapter -IPv4AddressType "Static" -IPv6AddressType "Dynamic" -IPv4AddressPool $ipV4Pool -Verbose
}
}
once the VMM preparation is complete, the domain-joined nodes can be added to the VMM for management and then a Azure Stack HCI cluster can be created.
$runAsAccountName = 'Administrator'
$runAsAccount = Get-SCRunAsAccount -Name $runAsAccountName
$hostGroupName = 'S2DHosts'
$hostGroup = Get-SCVMHostGroup -Name $hostGroupName
#Update the value of -ComputerName parameter in the below commands and add the same command for any other hosts that need to be added to VMM
Add-SCVMHost -ComputerName "s2d2n01.hci.lab" -RunAsynchronously -VMHostGroup $hostGroup -Credential $runAsAccount
Add-SCVMHost -ComputerName "s2d2n02.hci.lab" -RunAsynchronously -VMHostGroup $hostGroup -Credential $runAsAccount
#the following commands need to br run for each node on the VMM Server
#update $nodeName and network adapter identifiers
#Job Group GUID
$jobGroup = (New-Guid).Guid
#Change the name of the host before each run
$nodeName = 's2d2n01.hci.lab'
# Get Host
$vmHost = Get-SCVMHost | Where-Object { $_.Name -eq $NodeName }
# Get Host Network Adapter 'Intel(R) Ethernet 10G 4P X710/I350 rNDC'
$mgmtUplinkPortProfileSet = Get-SCUplinkPortProfileSet -Name 'S2D_Management_UPP'
$mgmtNetworkAdapter1 = Get-SCVMHostNetworkAdapter -VMHost $vmHost | Where-Object { $_.ConnectionName -eq 'NIC1' }
Set-SCVMHostNetworkAdapter -VMHostNetworkAdapter $mgmtNetworkAdapter1 -UplinkPortProfileSet $mgmtUplinkPortProfileSet -JobGroup $jobGroup
# Get Host Network Adapter 'Intel(R) Ethernet 10G X710 rNDC'
$mgmtNetworkAdapter2 = Get-SCVMHostNetworkAdapter -VMHost $vmHost | Where-Object { $_.ConnectionName -eq 'NIC2' }
Set-SCVMHostNetworkAdapter -VMHostNetworkAdapter $mgmtNetworkAdapter2 -UplinkPortProfileSet $mgmtUplinkPortProfileSet -JobGroup $jobGroup
$mgmtNetworkAdapter = @()
$mgmtNetworkAdapter += Get-SCVMHostNetworkAdapter -VMHost $vmHost | Where-Object { $_.ConnectionName -eq 'NIC1' }
$mgmtNetworkAdapter += Get-SCVMHostNetworkAdapter -VMHost $vmHost | Where-Object { $_.ConnectionName -eq 'NIC2' }
$MgmtlogicalSwitch = Get-SCLogicalSwitch -Name ManagementSwitch
New-SCVirtualNetwork -VMHost $vmHost -VMHostNetworkAdapters $mgmtNetworkAdapter -LogicalSwitch $MgmtlogicalSwitch -DeployVirtualNetworkAdapters -JobGroup $jobGroup
# Get Host Network Adapter 'Mellanox ConnectX-4 Lx Ethernet Adapter'
$storageUplinkPortProfileSet = Get-SCUplinkPortProfileSet -Name 'S2D_Storage_UPP'
$storage1Adapter = Get-SCVMHostNetworkAdapter -VMHost $vmHost | Where-Object { $_.ConnectionName -eq 'SLOT 1 Port 1' }
Set-SCVMHostNetworkAdapter -VMHostNetworkAdapter $storage1Adapter -UplinkPortProfileSet $storageUplinkPortProfileSet -JobGroup $jobGroup
# Get Host Network Adapter 'Mellanox ConnectX-4 Lx Ethernet Adapter #2'
$storage2Adapter = Get-SCVMHostNetworkAdapter -VMHost $vmHost | Where-Object { $_.ConnectionName -eq 'SLOT 1 Port 2' }
Set-SCVMHostNetworkAdapter -VMHostNetworkAdapter $storage2Adapter -UplinkPortProfileSet $storageUplinkPortProfileSet -JobGroup $jobGroup
$storageAdapter = @()
$storageAdapter += Get-SCVMHostNetworkAdapter -VMHost $vmHost | Where-Object { $_.ConnectionName -eq 'SLOT 1 Port 1' }
$storageAdapter += Get-SCVMHostNetworkAdapter -VMHost $vmHost | Where-Object { $_.ConnectionName -eq 'SLOT 1 Port 2' }
$storageSwitch = Get-SCLogicalSwitch -Name StorageSwitch
New-SCVirtualNetwork -VMHost $vmHost -VMHostNetworkAdapters $storageAdapter -LogicalSwitch $storageSwitch -DeployVirtualNetworkAdapters -JobGroup $jobGroup
Set-SCVMHost -VMHost $vmHost -JobGroup $jobGroup -RunAsynchronously
#Create Cluster
$HostGroup = Get-SCVMHostGroup -Name 'S2DHosts'
$AdminRunAsAccount = Get-SCRunAsAccount -Name 'Administrator'
$jobGroup = (New-Guid).Guid
# Get Host 's2dnode001.hci.lab, s2dnode002.hci.lab
$VMHosts = @()
$VMHosts += Get-SCVMHost | Where-Object { $_.Name -eq 's2d2n01.hci.lab' }
$VMHosts += Get-SCVMHost | Where-Object { $_.Name -eq 's2d2n02.hci.lab' }
$StaticIPAddress = @("172.16.102.123")
Install-SCVMHostCluster -ClusterName "S2D2NCluster" -JobGroup $jobGroup -RunAsynchronously -EnableS2D -Credential $AdminRunAsAccount -VMHost $VMHosts -ClusterIPAddress $StaticIPAddress
Once the configuring Azure Stack HCI cluster using VMM is complete, you can proceed to configuring QoS and other node specific network adapter configuration not done by VMM commands. These steps are described in the deployment guides for Dell EMC Solutions for Microsoft Azure Stack HCI.