Notifica di interruzione per le istanze del set di scalabilità di macchine virtuali di Azure

Le istanze del set di scalabilità possono acconsentire esplicitamente alla ricezione delle notifiche di terminazione dell'istanza e impostare un timeout di ritardo predefinito sull'operazione di terminazione. La notifica di terminazione viene inviata tramite il servizio – metadati di Azure eventi pianificati, che fornisce notifiche per e ritardo di operazioni di impatto, ad esempio riavvii e ridistribuzione. La soluzione aggiunge un altro evento – Terminate – all'elenco degli eventi pianificati e il ritardo associato dell'evento di chiusura dipenderà dal limite di ritardo specificato dagli utenti nelle configurazioni del modello del set di scalabilità.

Dopo aver eseguito la registrazione negli eventi pianificati chiamando l'endpoint del servizio metadati appropriato, le istanze del set di scalabilità non devono attendere la scadenza del timeout specificato prima dell'eliminazione dell'istanza. Dopo aver ricevuto una notifica Terminate, l'istanza può scegliere di essere eliminata in qualsiasi momento prima della scadenza del timeout di terminazione. Non è possibile abilitare le notifiche di terminazioni nelle istanze Spot. Per altre informazioni sulle istanze Spot, vedere macchine virtuali Spot di Azure per i set di scalabilità di macchine virtuali

Abilitare le notifiche di terminazioni

Esistono diversi modi per abilitare le notifiche di terminazione nelle istanze del set di scalabilità, come descritto negli esempi seguenti.

Azure portal

La procedura seguente abilita la notifica di chiusura durante la creazione di un nuovo set di scalabilità.

  1. Passare a set di scalabilità di macchine virtuali.
  2. Selezionare + Aggiungi per creare un nuovo set di scalabilità.
  3. Passare alla scheda Gestione.
  4. Individuare la sezione terminazione dell'istanza.
  5. Per Notifica di terminazione dell'istanza, selezionare Attiva.
  6. Per Ritardo di terminazione (minuti), impostare il timeout predefinito desiderato.
  7. Al termine della creazione del nuovo set di scalabilità, selezionare pulsante Rivedi e crea.

È anche possibile abilitare le notifiche di terminazione in un set di scalabilità esistente.

  1. Passare al set di scalabilità desiderato
  2. Passare alla scheda Configurazione
  3. Per Abilitare la notifica di terminazione dell'istanza, selezionare Attiva.
  4. Per Ritardo di terminazione (minuti), impostare il timeout predefinito desiderato.
  5. Selezionare il pulsante Salva.

REST API

Nell'esempio seguente viene abilitata la notifica di terminazioni nel modello del set di scalabilità.

PUT on `/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachineScaleSets/{vmScaleSetName}?api-version=2019-03-01`
{
  "properties": {
    "virtualMachineProfile": {
            "scheduledEventsProfile": {
                "terminateNotificationProfile": {
                    "notBeforeTimeout":"PT5M",
                    "enable":true
                }
            }
        }
    }        
}

Il blocco precedente specifica un ritardo di timeout di 5 minuti (come indicato da PT5M) per qualsiasi operazione di terminazione in tutte le istanze del set di scalabilità. Il campo notBeforeTimeout può richiedere qualsiasi valore compreso tra 5 e 15 minuti in formato ISO 8601. È possibile modificare il timeout predefinito per l'operazione di terminazione modificando la proprietà notBeforeTimeout in terminateNotificationProfile descritto in precedenza.

Dopo aver abilitato scheduledEventsProfile nel modello del set di scalabilità e aver impostato il valore notBeforeTimeout, aggiornare le singole istanze al modello più recente in modo da riflettere le modifiche.

Nota

Le notifiche terminate nelle istanze del set di scalabilità possono essere abilitate solo con l'API versione 2019-03-01 e successive

Azure PowerShell

Quando si crea un nuovo set di scalabilità, è possibile abilitare le notifiche di terminazione nel set di scalabilità usando il cmdlet New-AzVmssConfig.

Questo script di esempio illustra la creazione di un set di scalabilità e le risorse associate usando il file di configurazione: Creare un set di scalabilità di macchine virtuali completo. È possibile fornire notifiche "configure terminate" aggiungendo i parametri TerminateScheduledEvents e TerminateScheduledEventNotBeforeTimeoutInMinutes all'oggetto di configurazione per la creazione del set di scalabilità. L'esempio seguente abilita la funzionalità con un timeout di ritardo di 10 minuti.

Importante

A partire da novembre 2023, i set di scalabilità di macchine virtuali creati con PowerShell e l'interfaccia della riga di comando di Azure avranno per impostazione predefinita la modalità di orchestrazione flessibile se non è specificata alcuna modalità di orchestrazione. Per altre informazioni su questa modifica e sulle azioni da eseguire, vedere Modifica che causa un'interruzione per i clienti di PowerShell/CLI di VMSS - Hub della community Microsoft

New-AzVmssConfig `
  -Location "VMSSLocation" `
  -SkuCapacity 2 `
  -OrchestrationMode "Flexible" `
  -SkuName "Standard_DS2" `
  -TerminateScheduledEvents $true `
  -TerminateScheduledEventNotBeforeTimeoutInMinutes 10

Usare il cmdlet Update-AzVmss per abilitare le notifiche di terminazione in un set di scalabilità esistente.

Update-AzVmss `
  -ResourceGroupName "myResourceGroup" `
  -VMScaleSetName "myScaleSet" `
  -TerminateScheduledEvents $true `
  -TerminateScheduledEventNotBeforeTimeoutInMinutes 15

L'esempio precedente abilita le notifiche di terminazione in un set di scalabilità esistente e imposta un timeout di 15 minuti per l'evento di terminazione.

Dopo aver abilitato gli eventi pianificati nel modello del set di scalabilità e aver impostato il timeout, aggiornare le singole istanze al modello più recente per riflettere le modifiche.

Interfaccia della riga di comando di Azure 2.0

L'esempio seguente consiste nell'abilitare la notifica di terminazione durante la creazione di un nuovo set di scalabilità.

az group create --name <myResourceGroup> --location <VMSSLocation>
az vmss create \
  --resource-group <myResourceGroup> \
  --name <myVMScaleSet> \
  --image Ubuntu2204 \
  --admin-username <azureuser> \
  --generate-ssh-keys \
  --terminate-notification-time 10

L'esempio precedente crea prima un gruppo di risorse, quindi crea un nuovo set di scalabilità con notifiche terminate abilitate per un timeout predefinito di 10 minuti.

L'esempio seguente consiste nell'abilitare la notifica di terminazione in un set di scalabilità esistente.

az vmss update \  
  --resource-group <myResourceGroup> \
  --name <myVMScaleSet> \
  --enable-terminate-notification true \
  --terminate-notification-time 10

Ottenere notifiche di termine

Le notifiche di terminazione vengono recapitate tramite eventi pianificati, ovvero un servizio metadati di Azure. Il Servizio metadati di Azure presenta informazioni sulle macchine virtuali in esecuzione usando un endpoint REST accessibile dall'interno della macchina virtuale. Le informazioni sono disponibili tramite un indirizzo IP non instradabile, in modo da non essere esposte al di fuori della macchina virtuale.

Gli eventi pianificati sono abilitati per il set di scalabilità la prima volta che si effettua una richiesta di eventi. La prima chiamata può ricevere una risposta con un ritardo massimo di due minuti. Eseguire periodicamente una query sull'endpoint per rilevare gli eventi di manutenzione imminenti e lo stato delle attività di manutenzione in corso.

Gli eventi pianificati sono disabilitati per il set di scalabilità se le istanze del set di scalabilità non effettuano una richiesta per 24 ore.

Individuazione degli endpoint

Per le macchine virtuali abilitate per le reti virtuali, il servizio metadati è disponibile da un indirizzo IP statico non instradabile, 169.254.169.254.

L'endpoint completo per la versione più recente degli eventi pianificati è:

'http://169.254.169.254/metadata/scheduledevents?api-version=2019-01-01'

Risposta di query

Una risposta contiene una serie di eventi pianificati. Una serie vuota indica che al momento non sono presenti eventi pianificati.

Nel caso in cui siano presenti eventi pianificati, la risposta contiene una matrice di eventi. Per un "evento Terminate", la risposta sarà simile alla seguente:

{
    "DocumentIncarnation": {IncarnationID},
    "Events": [
        {
            "EventId": {eventID},
            "EventType": "Terminate",
            "ResourceType": "VirtualMachine",
            "Resources": [{resourceName}],
            "EventStatus": "Scheduled",
            "NotBefore": {timeInUTC},
        }
    ]
}

DocumentIncarnation è un ETag e fornisce un modo semplice per verificare se il payload degli eventi è stato modificato dall'ultima query.

Per altre informazioni su ognuno dei campi precedenti, vedere la documentazione relativa agli eventi pianificati per Windows e Linux.

Rispondere agli eventi

Dopo aver appreso un evento imminente e aver completato la logica per l'arresto normale, è possibile approvare l'evento in sospeso effettuando una chiamata POST al servizio metadati con EventId. La chiamata POST indica ad Azure che può continuare con l'eliminazione della macchina virtuale.

Di seguito è riportato il codice JSON previsto nel corpo della richiesta POST. La richiesta deve contenere un elenco di StartRequests. Ogni StartRequest contiene l'EventId per l'evento che si vuole accelerare:

{
	"StartRequests" : [
		{
			"EventId": {EventId}
		}
	]
}

Assicurarsi che ogni macchina virtuale nel set di scalabilità approvi solo l'Id evento pertinente solo per tale macchina virtuale. Una macchina virtuale può ottenere il proprio nome di macchina virtuale tramite i metadati dell'istanza. Questo nome assume il formato "{scale-set-name}_{instance-id}" e verrà visualizzato nella sezione "Risorse" della risposta alla query descritta in precedenza.

È anche possibile fare riferimento agli script di esempio per eseguire query e rispondere agli eventi Python.

Suggerimenti e procedure consigliate

  • Le notifiche terminano solo nelle ‘operazioni di eliminazione' Tutte le operazioni – di eliminazione (eliminazione manuale o scalabilità automatica) genereranno eventi Terminate se il set di scalabilità ha scheduledEventsProfile abilitato. Altre operazioni, ad esempio il riavvio, la ricreazione dell'immagine, la ridistribuzione e l'arresto/deallocazione non generano eventi Terminate.
  • Nessuna attesa obbligatoria per il timeout – È possibile avviare l'operazione di terminazione in qualsiasi momento dopo la ricezione dell'evento e prima che il tempo NotBefore dell'evento scada.
  • Eliminazione obbligatoria in timeout – Non è possibile estendere il valore di timeout dopo la generazione di un evento. Una volta scaduto il timeout, l'evento di terminazione in sospeso verrà elaborato e la macchina virtuale verrà eliminata.
  • Valore di timeout – modificabile È possibile modificare il valore di timeout in qualsiasi momento prima dell'eliminazione di un'istanza modificando la proprietà notBeforeTimeout nel modello del set di scalabilità e aggiornando le istanze della macchina virtuale al modello più recente.
  • Approvare tutte le eliminazioni – in sospeso Se è presente un'eliminazione in sospeso in VM_1 non approvata e si è approvato un altro evento di terminazione in VM_2, VM_2 non viene eliminato finché l'evento di terminazione per VM_1 è stato approvato o il timeout è scaduto. Dopo aver approvato l'evento terminate per VM_1, vengono eliminati sia VM_1 che VM_2.
  • Approvare tutte le eliminazioni – simultanee Estendendo l'esempio precedente, se VM_1 e VM_2 hanno lo stesso tempo NotBefore, entrambi gli eventi di terminazione devono essere approvati o nessuna delle macchine virtuali viene eliminata prima della scadenza del timeout.

Risoluzione dei problemi

Errore durante l'abilitazione di scheduledEventsProfile

Se viene visualizzato un ‘errore BadRequest' con un messaggio di errore che indica che "Non è possibile trovare il membro 'scheduledEventsProfile' nell'oggetto di tipo 'VirtualMachineProfile', controllare la versione dell'API" usata per le operazioni del set di scalabilità. È necessaria la versione dell'API di calcolo 2019-03-01 o versione successiva.

Errore durante il recupero degli eventi Terminate

Se non si ricevono eventi Terminate tramite eventi pianificati, controllare la versione dell'API usata per ottenere gli eventi. La versione dell'API del servizio metadati 2019-01-01 o successiva è necessaria per gli eventi Terminate.

'http://169.254.169.254/metadata/scheduledevents?api-version=2019-01-01'

Recupero dell'evento Terminate con notBefore non corretto

Dopo aver abilitato scheduledEventsProfile nel modello del set di scalabilità e aver impostato il valore notBeforeTimeout, aggiornare le singole istanze al modello più recente in modo da riflettere le modifiche.

Passaggi successivi

Informazioni su come distribuire l'applicazione nei set di scalabilità di macchine virtuali.