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

Le istanze del set di scalabilità possono acconsentire esplicitamente a ricevere 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 terminate dipenderà dal limite di ritardo specificato dagli utenti nelle configurazioni del modello del set di scalabilità.

Dopo la registrazione alla funzionalità, 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.

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.

Portale di Azure

I passaggi seguenti consentono di abilitare la notifica di interruzione 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 .
  6. Per Ritardo di terminazione (minuti) impostare il timeout predefinito desiderato.
  7. Al termine della creazione del nuovo set di scalabilità, selezionare Rivedi e crea pulsante.

Nota

Non è possibile impostare le notifiche di terminazioni nei set di scalabilità esistenti in portale di Azure

API REST

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 descritta in precedenza.

Dopo aver abilitato scheduledEventsProfile nel modello del set di scalabilità e aver impostato notBeforeTimeout, aggiornare le singole istanze al modello più recente per 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 la notifica 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.

New-AzVmssConfig `
  -Location "VMSSLocation" `
  -SkuCapacity 2 `
  -SkuName "Standard_DS2" `
  -UpgradePolicyMode "Automatic" `
  -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 terminate.

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 in modo da riflettere le modifiche.

Interfaccia della riga di comando di Azure 2.0

L'esempio seguente riguarda l'abilitazione della 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 UbuntuLTS \
  --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 le notifiche di terminazione abilitate per un timeout predefinito di 10 minuti.

L'esempio seguente riguarda l'abilitazione della 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 le notifiche Terminate

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 che non siano esposte all'esterno della macchina virtuale.

Gli eventi pianificati sono abilitati per il set di scalabilità la prima volta che si effettua una richiesta di eventi. È possibile prevedere una risposta ritardata nella prima chiamata fino a 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 la rete virtuale, 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 alla 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 avrà un aspetto simile al seguente:

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

DocumentIncarnation è un ETag e offre un modo semplice per controllare se il payload 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 l'esecuzione di query e la risposta agli eventi Python.

Suggerimenti e procedure consigliate

  • Termina le notifiche solo sulle operazioni di eliminazione: tutte le operazioni di eliminazione (eliminazione manuale o scalabilità automatica avviata da scale-in) genereranno eventi Terminate se il set di scalabilità ha pianificatoEventsProfile abilitato. Altre operazioni, ad esempio riavvio, ricreazione dell'immagine, ridistribuzione e 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 della scadenza dell'ora NotBefore dell'evento.
  • Eliminazione obbligatoria in fase di timeout: non è possibile estendere il valore di timeout dopo la generazione di un evento. Una volta scaduto il timeout, l'evento terminate 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.
  • Approva tutte le eliminazioni in sospeso: se è presente un'eliminazione in sospeso in VM_1 non approvata e hai approvato un altro evento terminate in VM_2, VM_2 non viene eliminato fino a quando non viene approvato l'evento di terminazione per VM_1 o il relativo timeout è trascorso. 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 macchina virtuale viene eliminata prima della scadenza del timeout.

Risolvere problemi

Errore durante l'abilitazione di scheduledEventsProfile

Se viene visualizzato un errore "BadRequest" con un messaggio di errore che indica che "Impossibile trovare il membro 'scheduledEventsProfile' nell'oggetto di tipo 'VirtualMachineProfile'", controllare la versione dell'API usata per le operazioni del set di scalabilità. È necessaria l'API di calcolo versione 2019-03-01 o 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. L'API del servizio metadati versione 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 time non corretto

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

Passaggi successivi

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