你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用 Azure PowerShell 部署 Azure 现成虚拟机

适用于:✔️ Linux VM ✔️ Windows VM ✔️ 灵活规模集

使用 Azure 现成虚拟机,可以利用未使用的容量,大幅降低成本。 每当 Azure 需要回收容量时,Azure 基础结构就会逐出 Azure 现成虚拟机。 因此,Azure 现成虚拟机非常适用于那些处理服务中断的工作负荷(例如批处理作业)、开发/测试环境、大型计算工作负荷等。

Azure 现成虚拟机的定价因地区和 SKU 而异。 有关详细信息,请参阅针对 LinuxWindows 的 VM 定价。 若要详细了解如何设置最高价格,请参阅 Azure 现成虚拟机 - 定价

可以选择对 VM 设置你愿意支付的每小时最高价格。 Azure 现成虚拟机的最高价格可以美元 (USD) 形式设置,最多保留 5 位小数。 例如,值 0.98765 表示最高价格为 0.98765 美元/小时。 如果将最高价格设置为 -1,则不会根据价格逐出 VM。 VM 的价格将是 Spot 的当前价格或是标准 VM 的价格(两者中的较低者,前提是有可用的容量和配额)。

创建 VM

通过使用 New-AzVmConfig 来创建配置以创建现成虚拟机。 包括 -Priority Spot 并将 -MaxPrice 设置为以下项之一:

  • -1,使 VM 不会因价格而被逐出。
  • 一个美元金额,最多 5 位数。 例如,-MaxPrice .98765 表示一旦现成虚拟机的价格达到大约每小时 $.98765 就会解除分配 VM。

此示例创建一个现成虚拟机,该虚拟机不会根据定价解除分配(只有当 Azure 需要回收容量时,才会将其解除分配)。 逐出策略设置为解除分配 VM,以便以后可以重启该 VM。 如果要在 VM 被逐出时删除该 VM 和基础磁盘,请在 New-AzVMConfig 中将 -EvictionPolicy 设置为 Delete

$resourceGroup = "mySpotRG"
$location = "eastus"
$vmName = "mySpotVM"
$cred = Get-Credential -Message "Enter a username and password for the virtual machine."
New-AzResourceGroup -Name $resourceGroup -Location $location
$subnetConfig = New-AzVirtualNetworkSubnetConfig `
   -Name mySubnet -AddressPrefix 192.168.1.0/24
$vnet = New-AzVirtualNetwork -ResourceGroupName $resourceGroup `
   -Location $location -Name MYvNET -AddressPrefix 192.168.0.0/16 `
   -Subnet $subnetConfig
$pip = New-AzPublicIpAddress -ResourceGroupName $resourceGroup -Location $location `
  -Name "mypublicdns$(Get-Random)" -AllocationMethod Static -IdleTimeoutInMinutes 4
$nsgRuleRDP = New-AzNetworkSecurityRuleConfig -Name myNetworkSecurityGroupRuleRDP  -Protocol Tcp `
  -Direction Inbound -Priority 1000 -SourceAddressPrefix * -SourcePortRange * -DestinationAddressPrefix * `
  -DestinationPortRange 3389 -Access Deny
$nsg = New-AzNetworkSecurityGroup -ResourceGroupName $resourceGroup -Location $location `
  -Name myNetworkSecurityGroup -SecurityRules $nsgRuleRDP
$nic = New-AzNetworkInterface -Name myNic -ResourceGroupName $resourceGroup -Location $location `
  -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -NetworkSecurityGroupId $nsg.Id

# Create a virtual machine configuration and set this to be an Azure Spot Virtual Machine

$vmConfig = New-AzVMConfig -VMName $vmName -VMSize Standard_D1 -Priority "Spot" -MaxPrice -1 -EvictionPolicy Deallocate | `
Set-AzVMOperatingSystem -Windows -ComputerName $vmName -Credential $cred | `
Set-AzVMSourceImage -PublisherName MicrosoftWindowsServer -Offer WindowsServer -Skus 2016-Datacenter -Version latest | `
Add-AzVMNetworkInterface -Id $nic.Id

New-AzVM -ResourceGroupName $resourceGroup -Location $location -VM $vmConfig

创建 VM 后,可以通过查询来查看资源组中所有 VM 的最高价格。

Get-AzVM -ResourceGroupName $resourceGroup | `
   Select-Object Name,@{Name="maxPrice"; Expression={$_.BillingProfile.MaxPrice}}

模拟逐出

可以使用 REST、PowerShell 或 CLI 模拟 Azure 现成虚拟机逐出,以测试应用程序对突然逐出的响应。

大多数情况下,需要借助 REST API 虚拟机 - 模拟逐出来自动测试应用程序。 对于 REST,Response Code: 204 意味着模拟逐出成功。 可以将模拟逐出与计划事件服务相结合,自动测试应用在 VM 被逐出时的响应。

若要了解操作中的计划事件,请观看 Azure Friday - 使用 Azure Scheduled Events 准备 VM 维护

快速测试

若要快速测试以了解模拟逐出的运作情况,我们可通过查询计划事件服务来查看使用 PowerShell 模拟逐出时的具体情况。

首次为事件发出请求时,为你的服务启用了计划事件服务。

远程登录到 VM,然后打开命令提示符。

在 VM 的命令提示符处键入:

curl -H Metadata:true http://169.254.169.254/metadata/scheduledevents?api-version=2019-08-01

第一次响应可能需要长达 2 分钟的时间。 自此之后,几乎会立即显示输出。

在已安装 Az PowerShell 模块的计算机(例如本地计算机)中,使用 Set-AzVM 模拟逐出。 将资源组名称和 VM 名称替换成你自己的名称。

Set-AzVM -ResourceGroupName "mySpotRG" -Name "mySpotVM" -SimulateEviction

如果请求成功完成,则响应输出将为“Status: Succeeded”。

快速返回到现成虚拟机的远程连接,再次查询 Scheduled Events 终结点。 重复以下命令,直到获得包含详细信息的输出:

curl -H Metadata:true http://169.254.169.254/metadata/scheduledevents?api-version=2019-08-01

当计划事件服务获得逐出通知后,响应将如下所示:

{"DocumentIncarnation":1,"Events":[{"EventId":"A123BC45-1234-5678-AB90-ABCDEF123456","EventStatus":"Scheduled","EventType":"Preempt","ResourceType":"VirtualMachine","Resources":["myspotvm"],"NotBefore":"Tue, 16 Mar 2021 00:58:46 GMT","Description":"","EventSource":"Platform"}]}

可以看到 "EventType":"Preempt",资源为 VM 资源 "Resources":["myspotvm"]

你还可以通过检查 "NotBefore" 值来查看 VM 何时会被逐出。 VM 在 NotBefore 中给定的时间之前不会被逐出,因此,在此时间窗口内你的应用程序可以正常关闭。

后续步骤

此外,还可以使用 Azure CLI门户模板创建 Azure 现成虚拟机。

使用 Azure 零售价格 API 查询当前的定价信息,了解 Azure 现成虚拟机定价。 meterNameskuName 都会包含 Spot

如果遇到错误,请参阅错误代码