In this topology, each cluster node will be configured to use a single SET switch for management, storage 1, storage 2 traffic. All these commands must be run on the VMM Server.
#Variables to populate
$hostGroupName = 'S2DHosts'
$runAsAccountName = 'Administrator'
$runAsCredential = Get-Credential
$uplinkPortProfileName = 'S2D_UPP'
$logicalSwitchName = 'S2DSwitch'
#LogicalNetwork 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 = $true
#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 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 UPP
$definition = @()
foreach ($logicalNet in $logicalNetworks)
{
$definition += Get-SCLogicalNetworkDefinition -Name "$($logicalNet.Name)_0"
}
New-SCNativeUplinkPortProfile -Name $uplinkPortProfileName -Description "Uplink Port profile" -LogicalNetworkDefinition $definition -EnableNetworkVirtualization $false -LBFOLoadBalancingAlgorithm "HostDefault" -LBFOTeamMode "SwitchIndependent" -RunAsynchronously
#Logical Switch
$logicalSwitch = New-SCLogicalSwitch -Name $logicalSwitchName -Description "" -EnableSriov $false -SwitchUplinkMode "EmbeddedTeam" -MinimumBandwidthMode "Weight"
# Get Native Uplink Port Profile
$nativeUppVar = Get-SCNativeUplinkPortProfile -Name $uplinkPortProfileName
$uppSetVar = New-SCUplinkPortProfileSet -Name $uplinkPortProfileName -LogicalSwitch $logicalSwitch -NativeUplinkPortProfile $nativeUppVar -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 $uppSetVar -RunAsynchronously -VMNetwork $vmNetwork -VMSubnet $vmSubnet -IsUsedForHostManagement $logicalNet.IsManagement -InheritsAddressFromPhysicalNetworkAdapter $logicalNet.InheritsAddressFromPhysicalNetworkAdapter -IPv4AddressType "Static" -IPv6AddressType "Dynamic" -IPv4AddressPool $ipV4Pool
}
else
{
New-SCLogicalSwitchVirtualNetworkAdapter -Name $logicalNet.Name -UplinkPortProfileSet $uppSetVar -RunAsynchronously -VMNetwork $vmNetwork -VMSubnet $vmSubnet -IsUsedForHostManagement $logicalNet.IsManagement -InheritsAddressFromPhysicalNetworkAdapter $logicalNet.InheritsAddressFromPhysicalNetworkAdapter -IPv4AddressType "Dynamic" -IPv6AddressType "Dynamic" -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 "s2dnode001.hci.lab" -RunAsynchronously -VMHostGroup $hostGroup -Credential $runAsAccount
Add-SCVMHost -ComputerName "s2dnode002.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
$nodeName = 's2dnode001.hci.lab'
# Get Host 's2dnode001.hci.lab'
$vmHost = Get-SCVMHost | Where-Object { $_.Name -eq $NodeName }
# Get Host Network Adapter 'Mellanox ConnectX-4 LX Ethernet Adapter'
$networkAdapter = Get-SCVMHostNetworkAdapter -VMHost $vmHost | Where-Object { $_.ConnectionName -eq 'SLOT 1 Port 1' }
$uplinkPortProfileSet = Get-SCUplinkPortProfileSet -Name 'S2D_UPP'
Set-SCVMHostNetworkAdapter -VMHostNetworkAdapter $networkAdapter -UplinkPortProfileSet $uplinkPortProfileSet -JobGroup $jobGroup
# Get Host Network Adapter 'Mellanox ConnectX-4 LX Ethernet Adapter #2'
$networkAdapter = Get-SCVMHostNetworkAdapter -VMHost $vmHost | Where-Object { $_.ConnectionName -eq 'SLOT 1 Port 2' }
Set-SCVMHostNetworkAdapter -VMHostNetworkAdapter $networkAdapter -UplinkPortProfileSet $uplinkPortProfileSet -JobGroup $jobGroup
$networkAdapter = @()
$networkAdapter += Get-SCVMHostNetworkAdapter -VMHost $vmHost | Where-Object { $_.ConnectionName -eq 'SLOT 1 Port 1' }
$networkAdapter += Get-SCVMHostNetworkAdapter -VMHost $vmHost | Where-Object { $_.ConnectionName -eq 'SLOT 1 Port 2' }
$logicalSwitch = Get-SCLogicalSwitch -Name S2dSwitch
#Management
$vmNetwork = Get-SCVMNetwork -Name 'Management'
$vmSubnet = Get-SCVMSubnet -Name 'Management_0'
New-SCVirtualNetwork -VMHost $vmHost -VMHostNetworkAdapters $networkAdapter -LogicalSwitch $logicalSwitch -JobGroup $jobGroup -CreateManagementAdapter -ManagementAdapterName "Management" -ManagementAdapterVMNetwork $vmNetwork -ManagementAdapterVMSubnet $vmSubnet
#Storage1
$vmNetwork = Get-SCVMNetwork -Name 'Storage1'
$vmSubnet = Get-SCVMSubnet -Name 'Storage1_0'
$ipV4Pool = Get-SCStaticIPAddressPool -Name 'Storage1-IPPool'
New-SCVirtualNetworkAdapter -VMHost $vmHost -Name "Storage1" -VMNetwork $vmNetwork -LogicalSwitch $logicalSwitch -JobGroup $jobGroup -VMSubnet $vmSubnet -IPv4AddressType "Static" -IPv4AddressPool $ipV4Pool -MACAddressType "Static" -MACAddress "00:00:00:00:00:00"
#Storage2
$vmNetwork = Get-SCVMNetwork -Name 'Storage2'
$vmSubnet = Get-SCVMSubnet -Name 'Storage2_0'
$ipV4Pool = Get-SCStaticIPAddressPool -Name 'Storage2-IPPool'
New-SCVirtualNetworkAdapter -VMHost $vmHost -Name "Storage2" -VMNetwork $vmNetwork -LogicalSwitch $logicalSwitch -JobGroup $jobGroup -VMSubnet $vmSubnet -IPv4AddressType "Static" -IPv4AddressPool $ipV4Pool -MACAddressType "Static" -MACAddress "00:00:00:00:00:00"
#Set the host properties
Set-SCVMHost -VMHost $vmHost -JobGroup $jobGroup -RunAsynchronously
#Run this on the node and not on VMM server
Set-NetAdapterAdvancedProperty -Name 'SLOT 1 PORT 1' -DisplayName 'VLAN ID' -DisplayValue 0
#Create Cluster.
#following commands need to run on the VMM Server only once
$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 's2dnode001.hci.lab' }
$VMHosts += Get-SCVMHost | Where-Object { $_.Name -eq 's2dnode002.hci.lab' }
$StaticIPAddress = @("172.16.102.123")
Install-SCVMHostCluster -ClusterName "S2D2NCluster" -JobGroup $jobGroup -RunAsynchronously -EnableS2D -Credential $AdminRunAsAccount -VMHost $VMHosts -ClusterIPAddress $StaticIPAddress