Azure Stack HCI is a hyperconverged infrastructure (HCI) cluster solution consists of windows servers (Hyper-V), Storage Spaces Direct, and Azure-inspired SDN. All clustered servers share common configurations and resources by leveraging the Windows Server Failover Clustering feature. A Windows Failover Cluster consists of multiple windows servers running in a cluster to provide high availability i.e. If one server node goes down, then another node takes over. We can create multiple windows/Linux VMs on the failover cluster. In this blog, we have provided steps to attach a new network interface to an existing VM running on the failover cluster with static MAC and valid static IP address (from the given VNet/subnet pool). For this we will be performing following steps:
Install-WindowsFeature -Name NetworkController -IncludeManagementTools
Disclaimer:
(Note: Before running below commands, ensure that the values of assigned variables are updated based on your environment configurations)
$vm_name = "myvm"
$adapter_name = "nic2"
$mac = "9E-4C-0B-03-78-21" # static mac, should be unique
$switch_name = "sdnswitch"
# stopping vm
stop-vm -Name $vm_name
# creating new adapter for vm with nic2 name
Add-VMNetworkAdapter -VMName $vm_name -SwitchName $switch_name -Name $adapter_name
# Assign static mac to created new nic
Set-VMNetworkAdapter -VMName $vm_name -Name $adapter_name -StaticMacAddress $mac
Start-Sleep -Seconds 5
# add your network controller service url
$uri = "https://<network-controller-service-uri>"
# mention virtual network name where vm/new nic to be attached
$vnet_name = "vnet01"
# mention subnet name where vm/nic to be attached
$subnet_name = "subnet01"
# use free ip address to be assigned to new nic/vm
$ip_address = "10.0.0.6"
# plz change it as per your network dns
$dns_server = @("192.168.1.254", "8.8.8.8")
$vmnicproperties = New-Object Microsoft.Windows.NetworkController.NetworkInterfaceProperties
# give same mac address below as created before..
$mac = -join($mac.split("-")).toupper()
$vmnicproperties.PrivateMacAddress = $mac
Write-host $mac
$vmnicproperties.PrivateMacAllocationMethod = "Static"
$vmnicproperties.IsPrimary = $true
$vmnicproperties.DnsSettings = New-Object Microsoft.Windows.NetworkController.NetworkInterfaceDnsSettings
$vmnicproperties.DnsSettings.DnsServers = $dns_server
$ipconfiguration = New-Object Microsoft.Windows.NetworkController.NetworkInterfaceIpConfiguration
$ipconfiguration.resourceid = $vm_name + "_IP2"
$ipconfiguration.properties = New-Object Microsoft.Windows.NetworkController.NetworkInterfaceIpConfigurationProperties
$ipconfiguration.properties.PrivateIPAddress = $ip_address
$ipconfiguration.properties.PrivateIPAllocationMethod = "Static"
$ipconfiguration.properties.Subnet = New-Object Microsoft.Windows.NetworkController.Subnet
# do: programatically decide subnet full ref, or form path directly
# $ipconfiguration.properties.subnet.ResourceRef = $vnet.Properties.Subnets[0].ResourceRef
$ipconfiguration.properties.subnet.ResourceRef = "/virtualNetworks/" + $vnet_name + "/subnets/" + $subnet_name
$vmnicproperties.IpConfigurations = @($ipconfiguration)
$NIC_name = $vm_name + "_Eth2"
New-NetworkControllerNetworkInterface -ResourceID $NIC_name -Properties $vmnicproperties -ConnectionUri $uri -Confirm:$false -force
Write-host 'NIC config created..'
Start-Sleep -Seconds 8
$nic = Get-NetworkControllerNetworkInterface -ConnectionUri $uri -ResourceId $NIC_name
# following snippet is borrowed as is from : https://learn.microsoft.com/en-us/windows-server/networking/sdn/manage/create-a-tenant-vm#create-a-vm-and-connect-to-a-virtual-network-by-using-the-windows-powershell-network-controller-cmdlets
#Do not change the hardcoded IDs in this section, because they are fixed values and must not change.
$FeatureId = "9940cd46-8b06-43bb-b9d5-93d50381fd56"
$vmNics = Get-VMNetworkAdapter -VMName $vm_name -Name $adapter_name
$CurrentFeature = Get-VMSwitchExtensionPortFeature -FeatureId $FeatureId -VMNetworkAdapter $vmNics
if ($CurrentFeature -eq $null)
{
$Feature = Get-VMSystemSwitchExtensionPortFeature -FeatureId $FeatureId
$Feature.SettingData.ProfileId = "{$( $nic.InstanceId )}"
$Feature.SettingData.NetCfgInstanceId = "{56785678-a0e5-4a26-bc9b-c0cba27311a3}"
$Feature.SettingData.CdnLabelString = "TestCdn"
$Feature.SettingData.CdnLabelId = 1111
$Feature.SettingData.ProfileName = "Testprofile"
$Feature.SettingData.VendorId = "{1FA41B39-B444-4E43-B35A-E1F7985FD548}"
$Feature.SettingData.VendorName = "NetworkController"
$Feature.SettingData.ProfileData = 1
Add-VMSwitchExtensionPortFeature -VMSwitchExtensionFeature $Feature -VMNetworkAdapter $vmNics
}
else
{
$CurrentFeature.SettingData.ProfileId = "{$( $nic.InstanceId )}"
$CurrentFeature.SettingData.ProfileData = 1
Set-VMSwitchExtensionPortFeature -VMSwitchExtensionFeature $CurrentFeature -VMNetworkAdapter $vmNics
}
Write-host 'finally applyed setting..'
Start-Sleep -Seconds 5
Get-VM -Name $vm_name | Start-VM
Below is an example of a VM, showing two adapters- "Ethernet 10" is attached as new using the steps as mentioned above and "Ethernet 7" was already present with VM. Both are showing assigned IPs from NetworkController nic level.
Same can be seen in Hyper-v manager:
In this article, we saw that how we can attach a new network interface connected to virtual network/subnet along with the fixed MAC/IP address, so even if VM is migrating to another node in the cluster, VM will preserve it’s same NIC since we are providing static MAC/IP address to it.
Reference Links:
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.