在第一版Azure的Azure当中,界面大概是这样的,俗称为老版的Portal,在这个门户下创建的虚拟机到了新门户下就变成了经典模式的虚拟机

新门户(如下图)下是采用了资源管理器的概念,因此强烈建议在老portal下创建的虚拟机能转换到资源管理器下来运行,而在新门户下新建虚拟机或者其他服务时,建议不要再使用带有“(经典)”字样的服务,例如“虚拟网络(经典)”等等。

那么如何在新门户下将原来在老门户下创建的虚拟机转换成资源管理器模式呢?也就是俗称把经典虚拟机转换成资源管理器模式下的虚拟机

首先需要了解哪些资源可以迁移:

  • 迁移过程中支持以下经典 IaaS 资源

虚拟机

可用性集

云服务

存储帐户

虚拟网络

*** 网关

快速路由网关(仅限在虚拟网络所在的同一订阅中)

网络安全组

路由表

保留 IP

  • 支持的迁移范围:可通过 4 种不同的方式完成计算、网络和存储资源的迁移。 这 4 种方式为:

迁移(不在虚拟网络中的)虚拟机

迁移(虚拟网络中的)虚拟机

存储帐户迁移

未附加的资源(网络安全组、路由表和保留 IP)

备注:迁移期间可能有一段时间不允许进行管理平面操作和数据平面操作,但虚拟机是持续运行不中断的。(对于大多数 VM 配置来说,在经典部署模型和 Resource Manager 部署模型之间迁移的只有元数据。 基础 VM 在相同硬件、相同网络上,使用相同的存储来运行。在迁移过程中,可能有一段时间不允许进行管理平面操作。 不过,数据平面可继续运行。 也就是说,在 VM(经典)之上运行的应用程序不会在迁移期间造成停机。)

  • 不支持以下情况迁移:

在单个云服务中有一个以上的可用性集。

在单个云服务中有一个或多个可用性集和不在可用性集中的 VM。

更为详细的限制可以参考:https://docs.microsoft.com/zh-cn/azure/virtual-machines/windows/migration-classic-resource-manager-overview

先决条件:

安装最新版的Azure Powershell以及确保您是Azure门户的订阅管理员

+++++++++++++++++++++++++++++++++++++++++++++

在这里我准备了一台虚拟机隶属在“虚拟网络(经典)”、“虚拟机(经典)”、“存储帐户(经典)”、“可用性集”、“云服务”里。

这台虚拟机运行这IIS服务器

接下来转换需要用到Azure Powershell,怎么安装登陆Azure Powershell,请参看我之前的文章《

PowerShell连接Azure(国内&国际)》

登录到 Resource Manager 模型的帐户

登陆上以后首先可以看看我们的资源组模式下的订阅ID

Get-AzureRmSubscription | Sort Name | Select Id

接着选择您需要操作的这个资源组模式下的订阅ID

Select-AzureRmSubscription -SubscriptionName "0f53c77e-a06b-4d80-8974-9d5fe127c280"

向迁移资源提供程序注册

Register-AzureRmResourceProvider -ProviderNamespace Microsoft.ClassicInfrastructureMigrate

请等五分钟让注册完成。可以使用以下命令来检查审批状态

Get-AzureRmResourceProvider -ProviderNamespace Microsoft.ClassicInfrastructureMigrate

在继续操作之前,RegistrationState 为 Registered

登录到经典模型的帐户

Add-AzureAccount -Environment AzureChinaCloud

获取可用经典模式下的订阅

Get-AzureSubscription | Sort SubscriptionName | Select SubscriptionName

设置当前会话为经典模式下Azure订阅

Select-AzureSubscription -SubscriptionName "Microsoft Azure Enterprise 试用版"

接下来确保在当前部署或虚拟网络的Azure区域中有足够的Azure 资源管理器虚拟机 vCPU,可以使用以下 PowerShell 命令检查 Azure 资源管理器中目前的 vCPU 数量,下面的命令会显示当前各个机型已使用的vCPU数量以及最大数量是多少,如果您的最大值不够那么需要联系21V后台给您进行扩大最大值

Get-AzureRmVMUsage -Location "China North"

接下来迁移Iaas资源,迁移Iaas资源分为迁移不在虚拟网络中的虚拟机迁移在虚拟网络中的虚拟机,因为我环境的问题,这里我没办法演示迁移不在虚拟网络中的虚拟机,如果您是这样的环境,请参考https://docs.microsoft.com/zh-cn/azure/virtual-machines/windows/migration-classic-resource-manager-ps

迁移不在虚拟网络中的虚拟机大致的步骤如下:

针对这种类型的迁移首先需要获取云服务列表(选取要迁移的云服务,如果云服务中的 VM 在虚拟网络中或者具有 Web 角色或辅助角色,该命令会返回错误消息):

Get-AzureService | ft Servicename

获取云服务的部署名称

$serviceName = "Classic2RM01"

$deployment = Get-AzureDeployment -ServiceName $serviceName

$deploymentName = $deployment.DeploymentName

接下来准备迁移云服务中的虚拟机,迁移有2种方式,一种是将VM迁移到资源管理器模式下创建新的虚拟网络;一种是迁移到资源管理器模式下现有的虚拟网络中

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  • 如果是执行迁移到资源管理器模式下创建新的虚拟网络那么可以先验证是否可以迁移

$validate = Move-AzureService -Validate -ServiceName $serviceName -DeploymentName $deploymentName -CreateNewVirtualNetwork

$validate.ValidationMessages

以上命令会显示任何阻止迁移的警告和错误。如果验证成功,可继续执行下列“准备”命令

Move-AzureService -Prepare -ServiceName $serviceName -DeploymentName $deploymentName -CreateNewVirtualNetwork

  • 如果是执行迁移到资源管理器模式下现有的虚拟网络中,先定义现有虚拟网络的变量参数

先建立好资源组名称、虚拟网络和子网

$existingVnetRGName = "ZJUNSENRG-North"

$vnetName = "ZJUNSEN-North-vNet"

$subnetName = "ZJUNSEN-Subnet-Srv"

接下来一样先验证迁移到现有的虚拟网络是否成功

$validate = Move-AzureService -Validate -ServiceName $serviceName -DeploymentName $deploymentName -UseExistingVirtualNetwork -VirtualNetworkResourceGroupName $existingVnetRGName -VirtualNetworkName $vnetName -SubnetName $subnetName

$validate.ValidationMessages

如果验证成功,则可继续执行以下“准备”命令

Move-AzureService -Prepare -ServiceName $serviceName -DeploymentName $deploymentName -UseExistingVirtualNetwork -VirtualNetworkResourceGroupName $existingVnetRGName -VirtualNetworkName $vnetName -SubnetName $subnetName

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

不管您上面采取的是哪一个想象的迁移方式,在执行玩准备命令后,即可查询VM的迁移状态,确保VM处于“Prepared”状态

$vmName = "Classic2RM"

$vm = Get-AzureVM -ServiceName $serviceName -Name $vmName

$vm.VM.MigrationState

接下来使用 Azure PowerShell 或 Azure 门户查看准备就绪的资源配置情况,如果尚未做好迁移准备,因此想要回到旧的状态,请使用以下命令

Move-AzureService -Abort -ServiceName $serviceName -DeploymentName $deploymentName

如果准备就绪,则可继续进行,使用以下命令提交资源请求

Move-AzureService -Commit -ServiceName $serviceName -DeploymentName $deploymentName

迁移在虚拟网络中的虚拟机大致的步骤如下:

如果要迁移虚拟网络中的虚拟机,可以先迁移虚拟网络。虚拟机随着虚拟网络自动迁移,选取要迁移的网络,首先查询实际的虚拟网络名称

Get-AzureVnetSite | Select -Property Name

设置资源管理器模式下目标虚拟机网络名称(如果虚拟网络包含的 Web 角色/辅助角色或 VM 的配置不受支持,则会出现验证错误消息)

$vnetName = "Group ZJUNSENRG-North Classic-vNet"

使用以下命令验证是否可以迁移到目标虚拟网络

Move-AzureVirtualNetwork -Validate -VirtualNetworkName $vnetName

如果验证成功,则可继续执行以下步骤

Move-AzureVirtualNetwork -Prepare -VirtualNetworkName $vnetName

会出现一个新的虚拟网络名称是Group-ZJUNSENRG-North-Classic-vNet

显示成功

接下来使用 Azure PowerShell 或 Azure 门户查看准备就绪的资源配置情况,如果尚未做好迁移准备,因此想要回到旧的状态,请使用以下命令

Move-AzureVirtualNetwork -Abort -VirtualNetworkName $vnetName

如果准备好的配置看起来没问题,则可继续进行,使用以下命令提交资源

Move-AzureVirtualNetwork -Commit -VirtualNetworkName $vnetName

提交后云服务、该经典虚拟机、经典虚拟网络就会消失

转而出现资源管理器模式下的虚拟机

命令也是执行成功

在这个转换期间我的虚拟机是一直没有中断持续提供服务的

在完成虚拟机迁移后,接下来就是迁移存储帐户

在迁移存储帐户之前,请执行以下先决条件检查

使用如下命令检查经典存储帐户下所有经典VM磁盘的RoleName和DiskName属性,RoleName是磁盘附加到虚拟机的名称。如果执行如下命令得到了返回的结果有其他磁盘,请先迁移这些磁盘所附加的虚拟机,再迁移存储帐户

$storageAccountName = 'zjunsennorthclassic01'

Get-AzureDisk | where-Object {$_.MediaLink.Host.Contains($storageAccountName)} | Select-Object -ExpandProperty AttachedTo -Property DiskName | Format-List -Property RoleName, DiskName

使用如下命令查找经典存储帐户中未附加的经典VM磁盘

$storageAccountName = 'zjunsennorthclassic01'

Get-AzureDisk | where-Object {$_.MediaLink.Host.Contains($storageAccountName)} | Where-Object -Property AttachedTo -EQ $null | Format-List -Property DiskName

如果返回的结果有磁盘,那么可以使用如下命令删除这些磁盘

Remove-AzureDisk -DiskName 'yourDiskName'

使用如下命令查看OS磁盘存储在经典存储帐户下的所有VM映像(自定义虚拟机映像)

Get-AzureVmImage | Where-Object { $_.OSDiskConfiguration.MediaLink -ne $null -and $_.OSDiskConfiguration.MediaLink.Host.Contains($storageAccountName) } | Select-Object -Property ImageName, ImageLabel

使用如下命令查看数据磁盘存储在经典存储帐户下的所有VM影响(自定义虚拟机映像)

Get-AzureVmImage | Where-Object {$_.DataDiskConfigurations -ne $null -and ($_.DataDiskConfigurations | Where-Object {$_.MediaLink -ne $null -and $_.MediaLink.Host.Contains($storageAccountName)}).Count -gt 0 } | Select-Object -Property ImageName, ImageLabel

如果返回的结果有VM影响,那么可以使用如下命令删除这些VM映像

Remove-AzureVMImage -ImageName 'yourImageName'

使用以下命令验证要迁移的每个存储帐户

$storageAccountName = "zjunsennorthclassic01"

Move-AzureStorageAccount -Validate -StorageAccountName $storageAccountName

验证通过

如果您之前有监视存储帐户,那么一样的检测一下

$storageAccountName = "zjunsennorthclassicdiag"

Move-AzureStorageAccount -Validate -StorageAccountName $storageAccountName

接下来准备迁移经典存储帐户

$storageAccountName = "zjunsennorthclassic01"

Move-AzureStorageAccount -Prepare -StorageAccountName $storageAccountName

$storageAccountName = "zjunsennorthclassicdiag"

Move-AzureStorageAccount -Prepare -StorageAccountName $storageAccountName

接下来使用 Azure PowerShell 或 Azure 门户查看准备就绪的资源配置情况,如果尚未做好迁移准备,因此想要回到旧的状态,请使用以下命令

$storageAccountName = "zjunsennorthclassic01"

Move-AzureStorageAccount -Abort -StorageAccountName $storageAccountName

$storageAccountName = "zjunsennorthclassicdiag"

Move-AzureStorageAccount -Abort -StorageAccountName $storageAccountName

如果准备好的配置看起来没问题,则可继续进行,使用以下命令提交资源

$storageAccountName = "zjunsennorthclassic01"

Move-AzureStorageAccount -Commit -StorageAccountName $storageAccountName

$storageAccountName = "zjunsennorthclassicdiag"

Move-AzureStorageAccount -Commit -StorageAccountName $storageAccountName

执行成功后在Azure门户上经典的存储帐户都消失了,转而出现了资源管理器模式的存储帐户

到此,我们的经典虚拟机就完成了到资源管理器模式下的迁移。整个迁移过程我的虚拟机都没有中断和停止服务

如果在验证迁移时返回不通过有错误信息请参考如下地址进行排查

如果只是迁移单个经典虚拟机,那么请参考