Distribuire Macchine virtuali Spot di Azure con Azure PowerShell

Si applica a: ✔️ macchine virtuali Linux ✔️ macchine virtuali Windows ✔️ set di scalabilità flessibili

L'uso delle Azure Spot Virtual Machines consente di sfruttare la capacità inutilizzata con un notevole risparmio sui costi. Ogni volta che Azure necessita di nuovo di capacità, l'infrastruttura di Azure eliminerà le macchine virtuali di Azure Spot Virtual Machines. Le macchine virtuali di Azure Spot Virtual Machines sono pertanto ideali per i carichi di lavoro in grado di gestire le interruzioni, come i processi di elaborazione batch, gli ambienti di sviluppo/test, i carichi di lavoro di calcolo di grandi dimensioni e altro ancora.

I prezzi per Azure Spot Virtual Machines sono variabili, in base all'area e all'SKU. Per altre informazioni, vedere i prezzi delle macchine virtuali per Linux e Windows. Per altre informazioni sull'impostazione del prezzo massimo, vedere Azure Spot Virtual Machines - Prezzi.

È possibile impostare un prezzo massimo che si è disposti a pagare, all'ora, per la macchina virtuale. Il prezzo massimo per una macchina virtuale spot di Azure può essere impostato in dollari statunitensi (USD), usando fino a 5 cifre decimali. Ad esempio, il valore 0.98765sarebbe un prezzo massimo di 0,98765 USD all'ora. Se si imposta il prezzo massimo su -1, la macchina virtuale non verrà eliminata in base al prezzo. Il prezzo della macchina virtuale corrisponderà al prezzo corrente per spot o al prezzo di una macchina virtuale standard, a seconda di quale sia il più basso, purché siano disponibili capacità e quota.

Creare la macchina virtuale

Creare una macchina virtuale spot usando New-AzVmConfig per creare la configurazione. Includere -Priority Spot e impostare -MaxPrice su:

  • -1 pertanto la macchina virtuale non viene rimossa in base al prezzo.
  • un importo del dollaro, fino a 5 cifre. Ad esempio, -MaxPrice .98765 significa che la macchina virtuale verrà deallocata una volta che il prezzo di una spotVM va a circa $ 98765 all'ora.

Questo esempio crea una macchina virtuale spot che non verrà deallocata in base ai prezzi (solo quando Azure richiede di nuovo la capacità). Il criterio di rimozione è impostato per deallocare la macchina virtuale, in modo che possa essere riavviata in un secondo momento. Se si vuole eliminare la macchina virtuale e il disco sottostante quando la macchina virtuale viene rimossa, impostare su -EvictionPolicy Delete in 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

Dopo aver creato la macchina virtuale, è possibile eseguire una query per visualizzare il prezzo massimo per tutte le macchine virtuali nel gruppo di risorse.

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

Simulare un'operazione di rimozione

È possibile simulare una rimozione di una macchina virtuale spot di Azure usando REST, PowerShell o l'interfaccia della riga di comando per testare il livello di risposta dell'applicazione a una rimozione improvvisa.

Nella maggior parte dei casi, è consigliabile usare l'API REST Macchine virtuali - Simulare la rimozione per facilitare il test automatizzato delle applicazioni. Per REST, un Response Code: 204 indica che la rimozione simulata ha avuto esito positivo. È possibile combinare le eliminazioni simulate con il servizio Eventi pianificati per automatizzare la modalità di risposta dell'app quando la macchina virtuale viene rimossa.

Per visualizzare gli eventi pianificati in azione, guardare Azure Friday - Uso di Eventi pianificati di Azure per prepararsi alla manutenzione delle macchine virtuali.

Test rapido

Per un test rapido per illustrare il funzionamento di una rimozione simulata, verrà esaminata l'esecuzione di query sul servizio eventi pianificato per verificare l'aspetto di una rimozione tramite PowerShell.

Il servizio Eventi pianificati viene abilitato la prima volta che si effettua una richiesta di eventi.

Connettersi da remoto alla macchina virtuale e aprire un prompt dei comandi.

Nella finestra del prompt dei comandi digitare:

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

Questa prima risposta potrebbe richiedere fino a 2 minuti. Da ora in poi, si dovrebbe visualizzare l'output quasi immediatamente.

Da un computer in cui è installato il modulo Az PowerShell (ad esempio il computer locale), simulare una rimozione usando Set-AzVM. Sostituire il nome del gruppo di risorse e della macchina virtuale con il proprio.

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

L'output della risposta avrà Status: Succeeded se la richiesta è stata effettuata correttamente.

Tornare rapidamente alla connessione remota alla macchina virtuale spot ed eseguire di nuovo una query sull'endpoint Eventi pianificati. Ripetere il comando seguente fino a ottenere un output contenente altre informazioni:

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

Quando il servizio eventi pianificato riceve la notifica di rimozione, si otterrà una risposta simile alla seguente:

{"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"}]}

È possibile notare "EventType":"Preempt" e che la risorsa è la risorsa della macchina virtuale "Resources":["myspotvm"].

È anche possibile vedere quando la macchina virtuale verrà rimossa controllando il "NotBefore" valore. La macchina virtuale non verrà rimossa prima dell'ora specificata in NotBefore, in modo che la finestra dell'applicazione venga chiusa normalmente.

Passaggi successivi

È anche possibile creare una macchina virtuale spot di Azure usando l'interfaccia della riga di comando di Azure, il portale o un modello.

Eseguire query sulle informazioni sui prezzi correnti usando l'API prezzi al dettaglio di Azure per informazioni sui prezzi delle macchine virtuali spot di Azure. meterName e skuName conterranno entrambi Spot.

Se si verifica un errore, vedere Codici di errore.