快速创建、启动Azure虚拟机(群)
在使用Azure Virtual Machine过程中,用户常常会遇到以下需求:
l 在同一个托管服务(Cloud Service)下,快速创建多个虚拟机。
l 快速启动同一个托管服务下多个已有的虚拟机。
由于这些虚拟机从属于同一个托管服务,共用托管服务所对应的网络配置和负载映射等,因此在同时创建或者同时启动多个虚拟机的操作中,用户容易遇到以下问题:
产生这个问题的原因是:在第一台虚拟机启动初期,Azure后端尚在分配共用资源(如局域网IP)给第一台虚拟机,需要对托管服务独占式访问操作,第二台虚拟机需要在第一台虚拟机成功获取共有资源之后才能开始启动过程。
对于快速创建或启动同一托管服务下的多个虚拟机,本博文介绍一些常见的实施方法和优化步骤。
1. 了解虚拟机的创建过程和创建方法
Azure后端(Fabric)根据用户需求(虚拟机配置、网络设定等)在Azure数据中心内创建目标虚拟机,主要包括以下过程:
l 在目标数据中心内找到合适的硬件资源,用于创建虚拟机。
l Azure后端复制目标OS镜像至用户的存储账号(或使用用户预备存储在Azure Storage中的镜像)
l Azure后端安装虚拟机,启动操作系统。
l Azure后端配置虚拟机的网络设置等。
l Azure后端配置虚拟机的对外服务设置(VIP、Endpoint等)
因此,一个虚拟机的创建过程往往需要数分钟才能彻底完成。对于Azure用户而言,创建虚拟机的主要方法包括以下三种:
A. 使用管理主页(如https://manage.windowsazure.cn)
B. 使用Azure PowerShell命令,如
NAME : New-AzureVM
SYNOPSIS : Creates a new Microsoft Azure virtual machine.
-------------------------- EXAMPLE 1 --------------------------
PS C:\> New-AzureVMConfig -Name "MyNewVM" -InstanceSize ExtraSmall -ImageName (Get-AzureVMImage)[4].ImageName `
| Add-AzureProvisioningConfig -Windows -Password $adminPassword -AdminUsername PsTestAdmin`
| New-AzureVM -ServiceName "MySvc2" -AffinityGroup "Contoso" -WaitForBoot
-------------------------- EXAMPLE 2 --------------------------
PS C:\> New-AzureVMConfig -Name "MySUSEVM2" -InstanceSize ExtraSmall -ImageName (Get-AzureVMImage)[7].ImageName `
| Add-AzureProvisioningConfig -Linux -LinuxUser $lxUser -Password $adminPassword -AdminUsername PsTestAdmin | New-AzureVM
-------------------------- EXAMPLE 3 --------------------------
PS C:\> $Images = Get-AzureVMImage
$myImage = $Images[4]
$myVM = New-AzureVMConfig -Name "MyVM2" -InstanceSize ExtraSmall -ImageName $myImage.ImageName `
| Add-AzureProvisioningConfig -Windows -Password $adminPassword `
| Add-AzureDataDisk -CreateNew -DiskSizeInGB 50 -DiskLabel "DataDisk50" -LUN 0
-------------------------- EXAMPLE 4 --------------------------
PS C:\> New-AzureVMConfig -Name "MyNewVM" -InstanceSize ExtraSmall -ImageName (Get-AzureVMImage)[4].ImageName `
| Add-AzureProvisioningConfig -Windows -Password $adminPassword -AdminUsername PsTestAdmin`
| New-AzureVM -ServiceName "MySvc2" -AffinityGroup "Contoso" -ReservedIPName $ipName
C. 使用REST API:https://msdn.microsoft.com/en-us/library/azure/jj157194.aspx, 用户可以使用习惯的开发语言(如C#, Java, PHP, …)调用此API创建虚拟机。
2. 快速创建多个虚拟机
深入使用Azure PowerShell,用户可以实现一些定制化功能的批量操作,如下示例方法,
$imageName="yourimageName"
$affinityGroup="yourAffinityGroupName"
$serviceName="yourServiceName"
$linuxUser="yourUsername "
$password="yourPassword"
$instanceSize="Medium"
$vnetName="yourVNetName"
$subnetName="Subnet-1"
$VMList=@()
for($i=2; $i -le 50; $i++)
{
$prefix="testVM"
$newName=$prefix+"{0:0}" -f $i
$VM=New-AzureVMConfig -Name $newName -InstanceSize
$instanceSize -ImageName $imageName | Add-AzureProvisioningConfig -Linux -LinuxUser
$linuxUser -Password $password | Add-AzureEndpoint -Protocol tcp -LocalPort 80
-PublicPort 80 -Name 'web' -LBSetName 'lbweb' -ProbePort 80 -ProbeProtocol http
-ProbePath '/'
Set-AzureSubnet -VM $VM -SubnetNames $subnetName
$VMlist += $VM
}
New-AzureVM -VMs $VMlist -ServiceName " yourServiceName" -VNetName $vnetName
在创建虚拟机过程中,可能会由于用户虚拟机的配置(如部分Linux中用户行为分析模块NUBA不支持8GB以上的内存)或者Azure后端资源池的分布差异,同样的脚本在创建更多的虚拟机时会持续失败。因此,Azure用户需要在创建虚拟机过程中考虑以下几点:
I. 不同的数据中心即时可用的虚拟机型号很可能不同
II. 如创建虚拟机过程中反复失败且收到“internal server error”等信息,可以考虑在脚本中切换虚拟机型号再进行创建,创建完成之后,调整虚拟机大小到目标型号。
III. 创建虚拟机时,所有可用的虚拟机型号都可以选用,但一旦虚拟机创建成功后,虚拟机向上向下可调整的型号是有限的,如下图,A1型号的虚拟机创建成功后不支持直接升级到D14. 因此Azure用户需要根据将来虚拟机可能变化的范围合理选择初次创建时候的虚拟机大小。
3. 虚拟机停止状态
Azure Virtual Machine存在两种停止状态:stopped (deallocated)
和 stopped,如图:
l Stopped (Deallocated):用户通过Azure管理主页、PowerShell或者REST请求关闭(shutdown)目标虚拟机后,虚拟机将会进入该状态(已下架),即表示在Azure后端,目标虚拟机已经被释放,虚拟机镜像存储在Azure Storage中,虚拟机占用的Cloud Service资源如IP、端口等都被回收。因此,该状态下的虚拟机不产生Compute费用。 (更多信息: https://msdn.microsoft.com/en-us/library/azure/dn763934.aspx#BKMK_Dealloc)
l Stopped:当用户远程连接到虚拟机并从虚拟机内部关闭虚拟机后,虚拟机将进入该状态,此时目标虚拟机在Azure后端依然存在,内部IP、外部端口等Cloud
Service资源依然被占用,只是OS处于shutdown的状态,因此处于Stopped状态的虚拟机会产生Compute费用。该状态也有可能会由于虚拟机内部程序导致,如虚拟机内部的某个程序关闭了虚拟机。
(更多信息: https://msdn.microsoft.com/en-us/library/azure/dn763934.aspx#BKMK_Stop)
处于stopped (deallocated)状态的虚拟机被重新启动时,将会执行虚拟机创建过程中的大部分步骤(如上),而处于stopped状态的虚拟机被重新启动时,主要的过程是OS的重启。
4. 快速启动多个虚拟机(同一个托管服务下)
由于同一托管服务下的多个虚拟机共用网络配置、负载映射等,处于stopped (deallocated)状态的虚拟机被重启时,将会对目标托管服务进行短暂的独占式访问,如下
因此,同时启动同一托管服务下的多个虚拟机,会出现上图中的独占访问异常。由于单个虚拟机启动通常需要2~5分钟,若通过portal逐一启动多个虚拟机(如20个),将会耗时较长。解决这一问题的方法主要有两种:
A. 逐一迅速启动虚拟机,待第一台虚拟机启动初期完成之后(而不是等待虚拟机彻底启动完成),迅速启动第二台虚拟机。(该过程需要通过脚本实现,结合Start-AzureVM、Get-AzureVM、循环控制等命令来第一时间启动后续的虚拟机)
B. 通过操作托管服务来启动所有的虚拟机,如通过Azure管理主页实现(management portal 》 cloud services 》 target cloud service (which contains
target VMs in stopped(de-allocated) ) 》 dashboard tab 》 start button in the bottom 》 click the start. ),该操作过程中,Azure后端负责控制多个虚拟机间的启动次序和即时性,最大限度的保证快速启动。
上述方案B也可以通过Azure Powershell或者REST API实现,请参考:
(Start-AzureService)
https://msdn.microsoft.com/en-us/library/azure/dn495171.aspx
NAME : Start-AzureService
SYNOPSIS : Starts the specified hosted service in Azure
SYNTAX
Start-AzureService [[-ServiceName] <String>] [[-Slot] <String>] [[-Subscription] <String>] [<CommonParameters>]
DESCRIPTION
Starts the specified hosted service in the cloud, if the service is in the stopped state. Note that the Publish-AzureServiceProject command will attempt to automatically start the service
REST API:
https://msdn.microsoft.com/en-us/library/azure/ee460808.aspx
The Update Deployment Status asynchronous operation changes the running status of a deployment. The status of a deployment can be running or suspended.
5. 其他
如果虚拟机的状态是stopped,而不是stopped
(deallocated),常规的启动方法是通过Azure管理主页或者PowerShell命令Start-AzureVM,由于处于stopped状态的虚拟机产生的Compute费用和Running状态的虚拟机一样,因此一般情况下不建议保持虚拟机的状态在stopped,如果是异常(如虚拟机内部应用导致关机)导致,需要解决找到问题根源之后再部署该虚拟机服务。
如果客户需要启动从属于不同托管服务下的多个虚拟机,可以同时调用多个Start-AzureVM命令或者REST请求,直接同步启动多个虚拟机。
更多信息请参考:
Azure虚拟机状态及生命周期:https://msdn.microsoft.com/en-us/library/azure/dn763934.aspx
PowerShell命令(虚拟机操作):https://msdn.microsoft.com/en-us/library/azure/dn495240.aspx
China Azure中的虚拟机服务:https://www.windowsazure.cn/home/features/virtual-machines/
Azure技术支持:https://www.windowsazure.cn/support/contact/?fb=001