8 Replies Latest reply on Aug 12, 2019 8:52 AM by VitalyBal

    Create VMK with vmotion TCP Stack

    nicholas1982 Hot Shot

      Hey all,

       

      Trying to create a vmkernal interface with TCP stack vmotion but doesn't seem to be an option. Also is it possible to choose the vmk id rather than it just incre

       

      New-VMHostNetworkAdapter -VMHost $h -VirtualSwitch DSwitch -PortGroup DPortGroupVMK3 -IP 1.1.1.1 -SubnetMask 255.255.255.0 -Mtu 9000 -VMotionEnabled $true

        • 1. Re: Create VMK with vmotion TCP Stack
          LucD Guru
          Community WarriorsUser ModeratorsvExpert

          No, no TCP stack parameter on that cmdlet yet.

          And no, no way to define that vmk number, the system assigns those sequentially.

           

          And there is a problem in the Get-EsxCli -V2 cmdlet to add a vmk as well.

          See Error adding vm kernel port to distributed switch with ESXCLI V2.

          which also contains a bypass solution.

          • 2. Re: Create VMK with vmotion TCP Stack
            LucD Guru
            User ModeratorsCommunity WarriorsvExpert

            Did some further testing, and it does seem to be possible after all.

            Looks like the stackname is case-sensitive and needs to be in lowercase.
            And yes, you can assign the vmk number out of sequence.

             

             

            $esxName = 'esx1.local.lab'

            $vssName = 'vSwitch2'

            $pgName = 'NewPG'

            $stackName = 'vmotion'

            $vmkName = 'vmk7'

            $vmkIp = '192.168.1.111'

            $vmkMask = '255.255.255.0'

            $vmkGW = '192.168.1.254'

             

            $esx = Get-VMHost -Name $esxName

            $esxcli = Get-EsxCli -VMHost $esx

            $vss = $esxcli.network.vswitch.standard.list() | where{$_.Name -eq $vssName}

            if(!($esxcli.network.vswitch.standard.portgroup.list() | where{$_.Name -eq $pgName})){

                $esxcli.network.vswitch.standard.portgroup.add($pgName,$vss.Name)

            }

            $esxcli.network.ip.interface.add($null,$null,$vmkName,$null,1500,$stackName,$pgName)

            $esxcli.network.ip.interface.ipv4.set($vmkGW,$vmkName,$vmkIp,$vmkMask,$null,'static')

             

            • 3. Re: Create VMK with vmotion TCP Stack
              nicholas1982 Hot Shot

              Thanks Luc, that’s awesome. woukd this work on distribted switch and is esxcli v2 not an option?

              • 4. Re: Create VMK with vmotion TCP Stack
                LucD Guru
                User ModeratorsCommunity WarriorsvExpert

                No, not for VDS.
                The esxcli command doesn't have a number of functions for working with VDS.

                 

                I did some tests with V2, but I encounter issues.

                Not sure yet if these issues are my poor coding or actual "features" in Get-EsxCli -V2

                 

                Update: for a VDS you can do it trough calling the API methods (similar to the method in my first reply)

                • 5. Re: Create VMK with vmotion TCP Stack
                  nicholas1982 Hot Shot

                  Hi Luc,

                   

                  Do you have the complete script with Variables handy from this script, Re: Error adding vm kernel port to distributed switch with ESXCLI V2. 

                   

                  Also what do you think of the approach of creating the vmkernel on VSS first then migrating to VDS similar to this blog post https://wesleygeelhoed.nl/2017/10/10/configure-vmkernel-adapters-in-a-specific-netstack-via-powercli/

                   

                   

                   

                  $esxcli.network.ip.netstack.add.invoke(@{netstack = "vmotion"})

                   

                  $portgoup = Get-VirtualPortGroup -virtualswitch $SysSwitch | ?{$_.Name -ilike "*vmotion*"}

                   

                  $nic = New-Object VMware.Vim.HostVirtualNicSpec

                   

                  $distributedVirtualPort = New-Object VMware.Vim.DistributedVirtualSwitchPortConnection

                  $nic.distributedVirtualPort = $distributedVirtualPort

                  $nic.distributedVirtualPort.portgroupKey = $portgoup.key

                  $nic.distributedVirtualPort.switchUuid = $portgoup.VirtualSwitch.key

                  $nic.netStackInstanceKey = 'vmotion'

                  $nic.mtu = $mtu

                  $ip = New-Object VMware.Vim.HostIpConfig

                  $ip.subnetMask = $mask

                  $ip.ipAddress = $vmotionip

                  $ip.dhcp = $false

                  $ip.ipV6Config = New-Object VMware.Vim.HostIpConfigIpV6AddressConfiguration

                  $ip.ipV6Config.dhcpV6Enabled = $false

                  $ip.ipV6Config.autoConfigurationEnabled = $false

                  #$ip.IpV6Config = $ipV6Config

                  $nic.Ip = $ip

                   

                  $networkSystem = $vmHost.ExtensionData.configManager.NetworkSystem

                  $_this = Get-view -Id ($networkSystem.Type + "-" + $networkSystem.Value)

                  $_this.AddVirtualNic('', $nic)

                   

                  $cArgs = $null

                  $cArgs = $esxcli.network.ip.route.ipv4.add.CreateArgs()

                  $cArgs.gateway = $gateway

                  $cArgs.netstack = "vmotion"

                  $cArgs.network = "default"

                  $esxcli.network.ip.route.ipv4.add.invoke($cArgs)

                   

                  $cArgs = $null

                  $cArgs = $esxcli.network.ip.dns.server.add.CreateArgs()

                  $cArgs.server = $dns

                  $cArgs.netstack = "vmotion"

                  $esxcli.network.ip.dns.server.add.invoke($cArgs)

                  • 6. Re: Create VMK with vmotion TCP Stack
                    LucD Guru
                    User ModeratorsvExpertCommunity Warriors

                    That first link is in fact a bypass for the lack of VDS functions on the esxcli command.

                    And no,I don't have that complete script handy I'm afraid, but it shouldn't be too hard to reverse engineer I guess.

                     

                    Yes, that 2nd link seems like a good idea.
                    The drawback is that you will need to create a VSS, even though you could be in a VDS only environment.

                    But it avoids the lack of esxcli functionality for VDS (if you don't want to call the vSphere API methods at least).

                    • 7. Re:Create VMK with vmotion TCP Stack
                      WickedMaster Lurker
                      I was wondering if you've got a working script already. I want to do exactly the same thing on a VDS.
                      • 8. Re:Create VMK with vmotion TCP Stack
                        VitalyBal Lurker

                        Finally got it working under V2. Possibly can be useful for someone. Thanks Jared Gudnason for workaround (https://communities.vmware.com/thread/601409)

                        $ESXiName = "test"

                        $PGName = "vMotion"

                        $DVSName = "TEST"

                        $VMKMTU = "1500"

                        $VMKNetStack = "vmotion"

                         

                        $esx = Get-VMHost -Name $ESXiName

                        $esxcli = Get-EsxCli -VMHost $esx -V2

                         

                        #Create temporary VMK

                        New-VMHostNetworkAdapter -VMhost $ESXiName -PortGroup $PGName -VirtualSwitch $DVSName

                         

                        #Get PG ID and VMK name

                        $DVSPG = Get-VDSwitch -VMHost $ESXiName -name $DVSName | Get-VDPortgroup -Name $PGName | get-vdPort | where-object { $_.ProxyHost.Name -match $ESXiName } | Select-Object id, ConnectedEntity

                         

                        #Remove temporary VMK

                        $arguments  = $esxcli.network.ip.interface.remove.CreateArgs()

                        $arguments.dvportid = $DVSPG.Id

                        $arguments.dvsname = $DVSName

                        $esxcli.network.ip.interface.remove.Invoke($arguments)

                         

                        #Add VMK with proper stack

                        $arguments  = $esxcli.network.ip.interface.add.CreateArgs()

                        $arguments.mtu = $VMKMTU

                        $arguments.dvsname = $DVSName

                        $arguments.netstack = $VMKNetStack

                        $arguments.interfacename = $DVSPG.ConnectedEntity.Name

                        $arguments.dvportid = $DVSPG.Id

                         

                        $esxcli.network.ip.interface.add.Invoke($arguments)

                         
                        $ESXiName = "test"
                        $PGName = "vMotion"
                        $DVSName = "TEST"
                        $VMKMTU = "1500"
                        $VMKNetStack = "vmotion"
                         
                        $esx = Get-VMHost -Name $ESXiName
                        $esxcli = Get-EsxCli -VMHost $esx -V2
                         
                        #Create temporary VMK
                        New-VMHostNetworkAdapter -VMhost $ESXiName -PortGroup $PGName -VirtualSwitch $DVSName
                         
                        #Get PG ID and VMK name
                        $DVSPG = Get-VDSwitch -VMHost $ESXiName -name $DVSName | Get-VDPortgroup -Name $PGName | get-vdPort | where-object { $_.ProxyHost.Name -match $ESXiName } | Select-Object id, ConnectedEntity
                         
                        #Remove temporary portgroup
                        $arguments  = $esxcli.network.ip.interface.remove.CreateArgs()
                        $arguments.dvportid = $DVSPG.Id
                        $arguments.dvsname = $DVSName
                        $esxcli.network.ip.interface.remove.Invoke($arguments)
                         
                        #Add VMK with proper stack
                        $arguments  = $esxcli.network.ip.interface.add.CreateArgs()
                        $arguments.mtu = $VMKMTU
                        $arguments.dvsname = $DVSName
                        $arguments.netstack = $VMKNetStack
                        $arguments.interfacename = $DVSPG.ConnectedEntity.Name
                        $arguments.dvportid = $DVSPG.Id
                         
                        $esxcli.network.ip.interface.add.Invoke($arguments)