Skip to content

Latest commit

 

History

History

12-ClustertoClusterLiveMigration

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
#Live Migration cluster to cluster
    #Configure kerberos constrained delegation to move from Firstcluster to SecondCluster and back
    # https://technet.microsoft.com/en-us/windows-server-docs/compute/hyper-v/deploy/set-up-hosts-for-live-migration-without-failover-clustering

    #region configure cluster authentication protocol to Kerberos
        #define cluster names.
        $Clusters="AXClus02","MCClus02"

        #make sure Failover Clustering and Hyper-V PowerShell is installed
        Install-WindowsFeature -Name RSAT-Clustering-PowerShell,Hyper-V-PowerShell

        #configure kerberos constrained delegation for cifs and Microsoft Virtual System Migration Service, both name and FQDN
        foreach ($Cluster in $Clusters){
            $SourceNodes=(Get-ClusterNode -Cluster $Cluster).Name
            $DestinationNodes=$clusters | ForEach-Object {if ($_ -ne $cluster){(Get-ClusterNode -Cluster $_).Name}}

            Foreach ($DestinationNode in $DestinationNodes){
                $HostName = $DestinationNode 
                $HostFQDN = (Resolve-DnsName $HostName).name | Select-Object -First 1
                Foreach ($SourceNode in $SourceNodes){
                    Get-ADComputer $SourceNode | Set-ADObject -Add @{"msDS-AllowedToDelegateTo"="Microsoft Virtual System Migration Service/$HostFQDN", "Microsoft Virtual System Migration Service/$HostName", "cifs/$HostFQDN", "cifs/$HostName"}
                }
            }
        }

        #Switch to any authentication protocol https://blogs.technet.microsoft.com/virtualization/2017/02/01/live-migration-via-constrained-delegation-with-kerberos-in-windows-server-2016/
        foreach ($Cluster in $clusters){
            $ClusterNodes=(Get-ClusterNode -Cluster $Cluster).Name
            Foreach ($ClusterNode in $ClusterNodes){
                $GUID=(Get-ADComputer $clusternode).ObjectGUID
                $comp=Get-ADObject -identity $Guid -Properties "userAccountControl"
                #Flip the ADS_UF_TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION bit using powershell bitwise OR operation (-bor)
                $Comp.userAccountControl = $Comp.userAccountControl -bor 16777216
                Set-ADObject -Instance $Comp
            }
        }

        #Switch to kerberos authentication for live migration
        foreach ($Cluster in $Clusters){
            $ClusterNodes=(Get-ClusterNode -Cluster $Cluster).Name
            Set-VMHost -CimSession $ClusterNodes -VirtualMachineMigrationAuthenticationType Kerberos
        }

    #endregion

    #region Live Migrate one or more VMs
        $SourceClusterName="AXClus02"
        $DestinationClusterName="MCClus02"
        $SourceStoragePath="C:\ClusterStorage\UserStorage_1"
        $DestinationStoragePath="C:\ClusterStorage\UserStorage_1"
        $VMNames=(Get-VM -cimsession (get-clusternode -cluster $SourceClusterName).Name | Where-Object Path -Like "$SourceStoragePath*" | Out-GridView -OutputMode Multiple).Name 
        #remove VMs from HA Resources
        foreach ($VMName in $VMNames){
            Get-ClusterResource -Cluster $SourceClusterName -name "Virtual Machine $VMName" | Remove-ClusterResource -force
            Get-ClusterGroup -Cluster $SourceClusterName -Name $VMName | Remove-ClusterGroup -force
        }

        #Live migrate to different cluster
        foreach ($VMName in $VMNames){
            #Grab random node in cluster $DestinationClusterName
            $DestinationHost=(get-clusternode -cluster $DestinationClusterName | get-random).Name
            $VM=Get-VM -Cimsession (get-clusternode -cluster $SourceClusterName).Name -Name $VMName
            #assuming there's same vswitch name
            $VM | Move-VM -DestinationHost $DestinationHost -DestinationStoragePath  "$DestinationStoragePath\$($VM.Name)" -IncludeStorage -Passthru
        }

        #import VM(s) as HA resources in new cluster
        foreach ($VMName in $VMNames){
            Add-ClusterVirtualMachineRole -VMName $VMName -Cluster $DestinationClusterName
        }
    #endregion