Развертывание точечных виртуальных машин Azure с помощью PowerShell

Область применения: ✔️ Виртуальные машины Linux ✔️ Виртуальные машины Windows ✔️ Гибкие масштабируемые наборы

Точечные виртуальные машины Azure позволяют применить неиспользуемую емкость наших ресурсов. Это обеспечивает значительную экономию. В любой момент, когда эта емкость становится нужна, инфраструктура Azure вытесняет точечные виртуальные машины Azure. Это означает, что точечные виртуальные машины Azure прекрасно подходят для рабочих нагрузок, для которых допустимы прерывания, например для заданий пакетной обработки, сред разработки или тестирования, больших вычислительных рабочих нагрузок и др.

Цены на точечные виртуальные машины Azure зависят от региона и ценовой категории. Дополнительные сведения см. на страницах с информацией о ценах на виртуальные машины Linux и Windows. Дополнительные сведения о настройке максимальной цены см. в разделе Цены на точечные виртуальные машины Azure.

Вы можете задать максимальную цену, которую готовы платить за час работы виртуальной машины. Максимальную цену для точечной виртуальной машины можно установить в долларах США, используя до 5 знаков после запятой. Например, значение 0.98765 определяет максимальную цену 0,98765 долларов США в час. Если вы укажете для максимальной цены значение -1, виртуальная машине не будет вытесняться по критерию цены. Цена на такую виртуальную машину будет определяться меньшим из двух значений: текущая цена точечных виртуальных машин или цена на стандартные виртуальные машины, но только при условии наличия емкости и соблюдения квоты.

Создание виртуальной машины

Создайте точечную виртуальную машину с помощью команды New-AzVmConfig для создания конфигурации. Включите -Priority Spot и задайте для -MaxPrice одно из следующих значений:

  • -1, чтобы избежать вытеснения виртуальной машины на основе цены;
  • сумма в долларах, до 5 цифр. Например, -MaxPrice .98765 означает, что виртуальная машина будет освобождена, когда цена за точечную виртуальную машину составит около 0,98765 долл. в час.

В этом примере создается точечная виртуальная машина, которая не будет освобождаться на основе цены (только в том случае, если Azure вновь потребуется емкость). Политика вытеснения устанавливается таким образом, чтобы освободить виртуальную машину, в результате чего ее можно будет перезапустить позже. Если вы хотите удалить виртуальную машину и базовый диск при вытеснении виртуальной машины, присвойте параметру -EvictionPolicy значение Delete в New-AzVMConfig.

$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

После создания виртуальной машины можно выполнить запрос, чтобы узнать максимальную цену для всех виртуальных машин в группе ресурсов.

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

Имитация вытеснения

Вы можете имитировать вытеснение точечной виртуальной машины Azure с помощью REST, PowerShell или CLI, чтобы проверить реакцию вашего приложения на внезапное вытеснение.

В большинстве случаев необходимо использовать REST API Виртуальные машины — имитировать вытеснение для автоматизированного тестирования приложений. Для REST Response Code: 204 означает, что имитация вытеснения прошла успешно. Имитацию вытеснений можно объединить со службой Запланированных событий, чтобы автоматизировать реакцию приложения на вытеснение виртуальной машины.

Сведения о том, как просмотреть запланированные события в действии, см. в статье Azure Friday — Использование запланированных событий Azure для подготовки к обслуживанию виртуальной машины.

Быстрый тест

Для быстрого тестирования способа работы имитации вытеснения рассмотрим запрос к службе запланированных событий, чтобы увидеть, как она выглядит при имитации вытеснения с помощью PowerShell.

Служба "Запланированные события" включается для вашей службы, когда вы впервые запрашиваете события.

Выполните удаленный вход в виртуальную машину, а затем откройте командную строку.

В командной строке на виртуальной машине введите:

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

Первый ответ может занять до 2 минут. Теперь выходные данные должны отображаться практически сразу же.

На компьютере, на котором установлен модуль Az PowerShell (например, на локальном компьютере), имитируйте вытеснение с помощью Set-AzVM. Замените имя группы ресурсов и имя виртуальной машины на свои собственные.

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

Если запрос был успешно выполнен, выходные данные ответного сообщения будут иметь состояние Status: Succeeded.

Быстро вернитесь к удаленному подключению к точечной виртуальной машине и повторите запрос к конечной точке запланированных событий. Повторяйте следующую команду до тех пор, пока не получите выходные данные, содержащие дополнительные сведения:

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" и ресурс являются ресурсами виртуальной машины "Resources":["myspotvm"].

Чтобы узнать о вытеснении виртуальной машины, установите флажок "NotBefore". Виртуальная машина не будет вытеснена до истечения времени, заданного параметром NotBefore, что позволяет корректно закрыть окно приложения.

Дальнейшие действия

Вы также можете создать точечную виртуальную машину Azure с помощью Azure CLI, портала или шаблона.

Запросите текущие сведения о ценах через API розничных цен Azure, чтобы получить сведения о ценах на точечные виртуальные машины Azure. Значения meterName и skuName должны содержать Spot.

Если при выполнении возникнут ошибки, изучите статью Коды ошибок.