Configurar vMotion MultiNIC en vDS

En este post, vamos a ver como crear y configurar la red de vMotion para multiples NICs en nuestro vDSwitch. Vamos a ver como realizarlo a través de instrucciones de PowerCLI, para así, poder crear un script que automatice el despliegue de redes, incluida la red de vMotion.

Para empezar debemos tener nuestro vDS creado. Como ya vimos en anteriores post, debemos crearlo utilizando el cmdlet “New-VDSwitch”


$vDS = New-VDSwitch -Name vDS-CloudVM -NumUplinkPorts 6 -Version 6.6.0 -Location $MyDatacenter

Ahora crearemos los dvPortgroup para la red de vMotion. Para ello:


$vDPG_vMotion1 = Get-vDSwitch $vDS | New-VDPortgroup -VDSwitch $VDS -Name "CloudVM_vMotion1"

$vDPG_vMotion2 = Get-vDSwitch $vDS | New-VDPortgroup -VDSwitch $VDS -Name "CloudVM_vMotion2"

Ahora configuraremos el Teaming de los vDPortgroup para obtener una red de vMotion con múltiples NICs. En la imagen podemos ver como sería el funcionamiento lógico:

vMotion1

Primero, recordemos que tenemos que asignar las vmnic de nuestro Host ESXi. Por ejemplo si quisiéramos configurar  varios ESXi, podríamos incluir todos los pasos siguientes en un bucle.

Primero agregaremos, sino existe el Host ESXi al vDSwitch.


$ESXi = Get-VMHost -Name "ESXi-CloudVM1"

Get-vDSwitch $VDS | Add-VDSwitchVMHost -VMHost $ESXi

Por último asignaremos los interfaces de red de nuestro ESXi a los dvUplinks. Vamos a suponer que las vmnic 2 y 3 se van a dedicar como interfaces para vMotion (doy por hecho que los interfaces 0 y 1 (dvUplink1 y 2) son para Management (En próximos Post os explicaré como migrar las redes de Management mediante PowerCLI 😉 )). Para ello asignaremos las vmnic a los dvUplinks de la siguiente manera:

$UPLINK3 = Get-VMHost $ESXi | Get-VMHostNetworkAdapter -Physical -Name vmnic2
$UPLINK4 = Get-VMHost $ESXi | Get-VMHostNetworkAdapter -Physical -Name vmnic3
$VDS | Add-VDSwitchPhysicalNetworkAdapter -VMHostNetworkAdapter $UPLINK3 -Confirm:$false
$VDS | Add-VDSwitchPhysicalNetworkAdapter -VMHostNetworkAdapter $UPLINK4 -Confirm:$false

Para configurar el Teaming de los dvPortgroups creados para vMotion, lo haremos de la siguiente manera:

Get-VDSwitch $VDS | Get-VDPortgroup -Name$vDPG_vMotion1 | Get-VDUplinkTeamingPolicy |Set-VDUplinkTeamingPolicy -ActiveUplinkPort 'dvUplink3' -StandbyUplinkPort 'dvUplink4' -UnusedUplinkPort 'dvUplink1','dvUplink2','dvUplink5','dvUplink6'
Get-VDSwitch $VDS | Get-VDPortgroup -Name $vDPG_vMotion2 | Get-VDUplinkTeamingPolicy |Set-VDUplinkTeamingPolicy -ActiveUplinkPort 'dvUplink3' -StandbyUplinkPort 'dvUplink4' -UnusedUplinkPort 'dvUplink1','dvUplink2','dvUplink5','dvUplink6' 

Ahora toca configurar los vmkernel de vMotion. Para añadir una configuración más completa, vamos a configurar el TCP-IP Stack para la red de vMotion. Recordemos que para realizar vMotion Cross vCenter es necesario configurar TCP-IP Stack para los vmk de vMotion, para poder enrutar correctamente el tráfico de vMotion. Para ello cree dos funciones:

La primera, crea vmkernel de vMotion en un vSwitch Standard temporal, el cuál será borrado una vez se realice la migración a vDSwitch. Para esta función le pasaremos el ESXi y las IP’s de vMotion.

function Migrate-vMotion ([string]$ESXi,[string]$ip_vm1,[string]$ip_vm2)
{
 $esxcli = Get-EsxCli -VMHost (Get-VMHost $ESXi) -V2

 # Add a Stack TCP IP for vmotion interfaces

 $esxcli.network.ip.netstack.add.Invoke(@{netstack = ‘vmotion’}) | Out-Null

 # Create VSS-Temporal

 $vss = New-VirtualSwitch -Name 'vss_temporal' -VMHost (Get-VMHost $ESXi) | Out-Null

 # Create Portgroups vMotion

 $esxcli.network.vswitch.standard.portgroup.add.Invoke(@{portgroupname = ‘vMotion1-Temp’; vswitchname = ‘vss_temporal’}) | Out-Null
 $esxcli.network.vswitch.standard.portgroup.add.Invoke(@{portgroupname = ‘vMotion2-Temp’; vswitchname = ‘vss_temporal’}) | Out-Null

 # Add the vmknics for vMotion1 y vMotion2

 $esxcli.network.ip.interface.add.Invoke(@{interfacename = 'vmk2'; portgroupname = 'vMotion1-Temp'; netstack = 'vmotion'}) | Out-Null
 $esxcli.network.ip.interface.add.Invoke(@{interfacename = 'vmk3'; portgroupname = 'vMotion2-Temp'; netstack = 'vmotion'}) | Out-Null

 # Config vmk IPv4
 $mask = '255.255.255.0'
 $esxcli.network.ip.interface.ipv4.set.Invoke(@{interfacename = 'vmk2';netmask= $mask ;ipv4= $ip_vm1; type = 'static'}) | Out-Null
 $esxcli.network.ip.interface.ipv4.set.Invoke(@{interfacename = 'vmk3';netmask= $mask ;ipv4= $ip_vm2; type = 'static'}) | Out-Null

 # Config netstack gateway.

 SetConfig-Netstack -esxname $ESXi -ipDevice 'vmk2'
 SetConfig-Netstack -esxname $ESXi -ipDevice 'vmk3'

}

La segunda función es usada en la función anterior. Su función es configurar el NetStack de vMotion, para ello deberemos especificar la IP de Gateway para red de vMotion, IP dns server y dominio. A esta función, debemos pasarle las variables ESXi y vmkernel.


function SetConfig-Netstack ([string]$esxname,[string]$ipDevice)
{
# Variables a configurar
$stackName = 'vmotion'
$ipGateway = 'My_Gateway_IP'
$dnsServers = 'My_DNS_Server'
$domainName = 'CloudVM.com'

$esx = Get-VMHost -Name $esxName
$netSys = Get-View -Id $esx.ExtensionData.ConfigManager.NetworkSystem
$stack = $esx.ExtensionData.Config.Network.NetStackInstance | where{$_.Key -eq $stackName}
$config = New-Object VMware.Vim.HostNetworkConfig
$spec = New-Object VMware.Vim.HostNetworkConfigNetStackSpec
$spec.Operation = [VMware.Vim.ConfigSpecOperation]::edit
$spec.NetStackInstance = $stack
$spec.NetStackInstance.RouteTableConfig = New-Object VMware.Vim.HostIpRouteTableConfig
$route = New-Object VMware.vim.HostIpRouteConfig
$route.defaultGateway = $ipGateway
$route.gatewayDevice = $ipDevice
$spec.NetStackInstance.ipRouteConfig = $route
$dns = New-Object VMware.Vim.HostDnsConfig
$dns.Address = $dnsServers
$dns.Dhcp = $false
$dns.HostName = ""
$dns.DomainName = ""
$dns.SearchDomain = $domainName
$spec.NetStackInstance.DnsConfig = $dns
$config.NetStackSpec += $spec
$netsys.UpdateNetworkConfig($config,[VMware.Vim.HostConfigChangeMode]::modify)
}

Por último, nos faltaría realizar la migración de los vmkernel de vSS a vDS. Lo haríamos de la siguiente manera:


Write-Host "Migrate vMotion MultiNIC VSS to" $VDS -fo Yellow

$DPG = Get-VDPortgroup -name "CloudVM_vMotion1" -VDSwitch $VDS
$VMK = Get-VMHostNetworkAdapter -Name vmk2 -VMHost $ESXi Set-VMHostNetworkAdapter -PortGroup $DPG -VirtualNic $VMK -confirm:$false | Out-Null 
$DPG = Get-VDPortgroup -name $pg_vm2_name -VDSwitch $VDS 
$VMK = Get-VMHostNetworkAdapter -Name vmk3 -VMHost $ESXi Set-VMHostNetworkAdapter -PortGroup $DPG -VirtualNic $VMK -confirm:$false | Out-Null 

Para terminar, borraremos el vSwitch Standard temporal.


$VSS = Get-VirtualSwitch -VMHost $ESXi -Name vss_temporal

Remove-VirtualSwitch -VirtualSwitch $VSS -confirm:$false

Espero que os haya gustado y os sea útil.

Muchas gracias por compartir 😉

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *