使用 Azure PowerShell 部署 Azure Spot Virtual Machines
適用於:✔️ Linux VM ✔️ Windows VM ✔️ 彈性擴展集
使用 Azure Spot Virtual Machines 可讓您以大幅降低的成本使用我們未運用的容量。 在任何時候,只要 Azure 又需要這些容量,Azure 基礎結構就會收回 Azure Spot Virtual Machines。 因此,Azure Spot Virtual Machines 很適合可因應中斷的工作負載,例如批次處理工作、開發/測試環境、大量計算工作負載等。
Azure Spot Virtual Machines 的定價是根據區域和 SKU 的變數為準。 如需詳細資訊,請參閱 Linux 和 Windows 的 VM 定價。 如需設定價格上限的詳細資訊,請參閱 Azure Spot Virtual Machines - 定價。
您可以選擇為 VM 設定您願意支付的每小時價格上限。 Azure 現成虛擬機器的最高價格可以設為美元 (USD),且最多可取小數點後 5 位。 例如,0.98765
的值是每小時 $0.98765 美元的最大價格。 如果您將最大價格設為 -1
,將不會根據價格來收回 VM。 VM 的價格會是現成 VM 的目前價格或標準 VM 的價格,無論何者比較小,只要有可用的容量和配額即可。
建立 VM
使用 New-AzVmConfig (機器翻譯) 建立設定,以建立現成 VM。 包含 -Priority Spot
,並將 -MaxPrice
設定為下列任一值:
-1
,如此便不會根據價格收回 VM。- 任一金額,最多 5 位數。 舉例來說,
-MaxPrice .98765
代表一旦現成 VM 的價格達到每小時約 $.98765,VM 就會解除配置。
此範例示範如何建立不會根據價格解除配置的現成 VM (只有 Azure 需要取回容量的時候除外)。 這裡的收回原則設定為解除配置 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 Spot Virtual Machine 的收回動作,以測試您的應用程式對突然收回的回應狀況如何。
在大部分情況下,建議您使用 REST API Virtual Machines - Simulate Eviction (機器翻譯) 來協助自動測試應用程式。 對於 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 分鐘才會顯示輸出, 但之後的回應應該會近乎即時地顯示輸出。
在已安裝 PowerShell 模組的電腦 (例如您的本機電腦) 中,使用 Set-AzVM (機器翻譯) 模擬收回動作。 以您自己的名稱來取代資源群組名稱和 VM 名稱。
Set-AzVM -ResourceGroupName "mySpotRG" -Name "mySpotVM" -SimulateEviction
如果成功提出要求,回應輸出會顯示 Status: Succeeded
。
快速回到您現成 VM 的遠端連線,然後再次查詢 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 現成 VM。
使用 Azure 零售價格 API 查詢目前的定價資訊,並取得 Azure 現成虛擬機器的定價資訊。 meterName
和 skuName
都會包含 Spot
。
如果您遇到錯誤,請參閱錯誤碼。