Questa pagina spiega come creare e utilizzare un'istanza di macchina virtuale (VM) prerilasciabile. Le VM prerilasciabili sono disponibili con uno sconto fino al 60-91% rispetto al prezzo delle VM standard. Tuttavia, Compute Engine potrebbe arrestare (prerilasciare) queste VM se ha bisogno di recuperare risorse per altre attività. Le VM prerilasciabili si arrestano sempre dopo 24 ore. Le VM prerilasciabili sono consigliate solo per le applicazioni a tolleranza di errore in grado di tollerare il prerilascio delle VM. Assicurati che la tua applicazione sia in grado di gestire i prerilasci prima di decidere di creare una VM prerilasciabile. Per comprendere i rischi e il valore delle VM prerilasciabili, leggi la documentazione sulle istanze VM prerilasciabili.
Prima di iniziare
- Leggi la documentazione relativa alle istanze VM prerilasciabili.
-
Se non l'hai ancora fatto, configura l'autenticazione.
L'autenticazione è il processo mediante il quale viene verificata l'identità per l'accesso ai servizi e alle API Google Cloud.
Per eseguire codice o esempi da un ambiente di sviluppo locale, puoi autenticarti in Compute Engine nel seguente modo.
Seleziona la scheda relativa a come prevedi di utilizzare gli esempi in questa pagina:
Console
Quando utilizzi la console Google Cloud per accedere ai servizi e alle API di Google Cloud, non devi configurare l'autenticazione.
gcloud
-
Installa Google Cloud CLI, quindi initialize eseguendo questo comando:
gcloud init
- Imposta una regione e una zona predefinite.
Go
Per utilizzare gli esempi Go in questa pagina da un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura Credenziali predefinite dell'applicazione con le tue credenziali utente.
- Installa Google Cloud CLI.
-
Per initialize gcloud CLI, esegui questo comando:
gcloud init
-
Crea credenziali di autenticazione locali per il tuo Account Google:
gcloud auth application-default login
Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Java
Per utilizzare gli esempi Java in questa pagina da un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura Credenziali predefinite dell'applicazione con le tue credenziali utente.
- Installa Google Cloud CLI.
-
Per initialize gcloud CLI, esegui questo comando:
gcloud init
-
Crea credenziali di autenticazione locali per il tuo Account Google:
gcloud auth application-default login
Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Node.js
Per utilizzare gli esempi Node.js in questa pagina da un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura Credenziali predefinite dell'applicazione con le tue credenziali utente.
- Installa Google Cloud CLI.
-
Per initialize gcloud CLI, esegui questo comando:
gcloud init
-
Crea credenziali di autenticazione locali per il tuo Account Google:
gcloud auth application-default login
Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
Python
Per utilizzare gli esempi Python in questa pagina da un ambiente di sviluppo locale, installa e inizializza gcloud CLI, quindi configura Credenziali predefinite dell'applicazione con le tue credenziali utente.
- Installa Google Cloud CLI.
-
Per initialize gcloud CLI, esegui questo comando:
gcloud init
-
Crea credenziali di autenticazione locali per il tuo Account Google:
gcloud auth application-default login
Per ulteriori informazioni, consulta Configura l'autenticazione per un ambiente di sviluppo locale.
REST
Per utilizzare gli esempi di API REST in questa pagina in un ambiente di sviluppo locale, devi utilizzare le credenziali che fornisci a gcloud CLI.
Installa Google Cloud CLI, quindi initialize eseguendo questo comando:
gcloud init
-
Crea una VM prerilasciabile
Creare una VM prerilasciabile utilizzando gcloud CLI o l'API Compute Engine. Per utilizzare la console Google Cloud, crea una VM spot.
gcloud
Con gcloud compute
, utilizza lo stesso comando instances create
che useresti per creare una VM normale, ma aggiungi il flag --preemptible
.
gcloud compute instances create [VM_NAME] --preemptible
dove [VM_NAME]
è il nome della VM.
Go
Java
Node.js
Python
REST
Nell'API, crea una richiesta normale per creare una VM, ma includi la proprietà preemptible
in scheduling
e impostala su true
. Ad esempio:
POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances
{
'machineType': 'zones/[ZONE]/machineTypes/[MACHINE_TYPE]',
'name': '[INSTANCE_NAME]',
'scheduling':
{
'preemptible': true
},
...
}
Quote per le CPU prerilasciabili
Le VM prerilasciabili richiedono quote CPU disponibili come le VM standard. Per evitare che le VM prerilasciabili consumino le quote di CPU delle VM standard, puoi richiedere una quota "Preemptible CPU" speciale. Quando Compute Engine ti concede la quota prerilasciabile per le CPU in quella regione, tutte le VM prerilasciabili verranno conteggiate in questa quota, mentre tutte le VM standard continueranno a essere conteggiate nella quota di CPU standard.
Nelle regioni in cui non disponi di una quota per le CPU prerilasciabili, puoi utilizzare la quota standard per le CPU per avviare le VM prerilasciabili. Devi inoltre avere una quota sufficiente per IP e disco, come di consueto. La quota prerilasciabile per le CPU non è visibile nelle pagine delle quote di gcloud CLI o della console Google Cloud, a meno che Compute Engine non l'abbia concessa.
Per ulteriori informazioni sulle quote, visita la pagina Quote delle risorse.
Avvia una VM prerilasciata
Come per qualsiasi altra VM, se una VM prerilasciabile viene arrestata o prerilasciata, puoi avviare la VM di nuovo e riportarla allo stato RUNNING
. L'avvio di una VM prerilasciabile reimposta il contatore delle 24 ore, ma poiché è ancora una VM prerilasciabile, Compute Engine può prerilasciare prima di 24 ore. Non è possibile convertire una VM prerilasciabile in una VM standard mentre è in esecuzione.
Se Compute Engine interrompe una VM prerilasciabile in un gruppo di istanze gestite con scalabilità automatica (MIG) o in un cluster Google Kubernetes Engine (GKE), il gruppo riavvia la VM quando le risorse diventano di nuovo disponibili.
Gestire il prerilascio con uno script di chiusura
Quando la tua VM viene prerilasciata, puoi utilizzare uno script di arresto per eseguire azioni di pulizia prima dell'arresto della VM. Ad esempio, puoi interrompere agevolmente un processo in esecuzione e copiare il file di un checkpoint in Cloud Storage.
Di seguito è riportato uno script di chiusura che puoi aggiungere a una VM prerilasciabile in esecuzione o a una nuova VM prerilasciabile quando la crei. Questo script viene eseguito all'avvio della VM, prima che il normale comando kill
del sistema operativo arresti tutti i processi rimanenti. Dopo aver arrestato automaticamente il programma desiderato, lo script esegue un caricamento parallelo di un file di checkpoint in un bucket Cloud Storage.
#!/bin/bash
MY_PROGRAM="[PROGRAM_NAME]" # For example, "apache2" or "nginx"
MY_USER="[LOCAL_USERNAME]"
CHECKPOINT="/home/$MY_USER/checkpoint.out"
GSUTIL_OPTS="-m -o GSUtil:parallel_composite_upload_threshold=32M"
BUCKET_NAME="[BUCKET_NAME]" # For example, "my-checkpoint-files" (without gs://)
echo "Shutting down! Seeing if ${MY_PROGRAM} is running."
# Find the newest copy of $MY_PROGRAM
PID="$(pgrep -n "$MY_PROGRAM")"
if [[ "$?" -ne 0 ]]; then
echo "${MY_PROGRAM} not running, shutting down immediately."
exit 0
fi
echo "Sending SIGINT to $PID"
kill -2 "$PID"
# Portable waitpid equivalent
while kill -0 "$PID"; do
sleep 1
done
echo "$PID is done, copying ${CHECKPOINT} to gs://${BUCKET_NAME} as ${MY_USER}"
su "${MY_USER}" -c "gsutil $GSUTIL_OPTS cp $CHECKPOINT gs://${BUCKET_NAME}/"
echo "Done uploading, shutting down."
Per aggiungere questo script a una VM, configuralo in modo che funzioni con un'applicazione sulla VM e aggiungilo ai metadati della VM.
- Copia o scarica lo script di arresto nella workstation locale.
- Apri il file da modificare e cambia le seguenti variabili:
[PROGRAM_NAME]
è il nome del processo o del programma che vuoi arrestare. Ad esempio,apache2
onginx
.[LOCAL_USER]
è il nome utente con cui hai eseguito l'accesso alla macchina virtuale.[BUCKET_NAME]
è il nome del bucket Cloud Storage in cui vuoi salvare il file dei checkpoint del programma. Tieni presente che in questo caso il nome del bucket non inizia congs://
.
- Salva le modifiche.
- Aggiungi lo script di chiusura a una nuova VM o a una VM esistente.
Questo script presuppone quanto segue:
La VM è stata creata con almeno accesso in lettura/scrittura a Cloud Storage. Consulta la documentazione sull'autenticazione per istruzioni su come creare una VM con gli ambiti appropriati.
Disponi già di un bucket Cloud Storage e hai l'autorizzazione per scrivere nel bucket.
Identifica le VM prerilasciabili
Per verificare se una VM è prerilasciabile, segui i passaggi per identificare il modello di provisioning e l'azione di terminazione di una VM.
Determina se una VM è stata prerilasciata
Determina se una VM è stata prerilasciata con la console Google Cloud, gcloud CLI o l'API.
Console
Puoi verificare se una VM è stata prerilasciata controllando i log delle attività del sistema.
Nella console Google Cloud, vai alla pagina Log.
Seleziona il progetto e fai clic su Continua.
Aggiungi
compute.instances.preempted
al campo Filtra per etichetta o ricerca testuale.Facoltativamente, puoi anche inserire il nome di una VM se vuoi visualizzare le operazioni di prerilascio per una VM specifica.
Premi Invio per applicare i filtri specificati. La console Google Cloud aggiorna l'elenco dei log per mostrare solo le operazioni in cui una VM è stata prerilasciata.
Seleziona un'operazione nell'elenco per visualizzare i dettagli sulla VM che è stata prerilasciata.
gcloud
Utilizza il comando gcloud compute operations list
con un parametro filter per visualizzare un elenco di eventi di prerilascio nel tuo progetto.
gcloud compute operations list \
--filter="operationType=compute.instances.preempted"
Puoi utilizzare il parametro di filtro per definire ulteriormente l'ambito dei risultati. Ad esempio, per visualizzare gli eventi di prerilascio solo per le VM in un gruppo di istanze gestite:
gcloud compute operations list \
--filter="operationType=compute.instances.preempted AND targetLink:instances/[BASE_VM_NAME]"
gcloud
restituisce una risposta simile alla seguente:
NAME TYPE TARGET HTTP_STATUS STATUS TIMESTAMP systemevent-xxxxxxxx compute.instances.preempted us-central1-f/instances/example-vm-xxx 200 DONE 2015-04-02T12:12:10.881-07:00
Un tipo di operazione compute.instances.preempted
indica che la VM è stata prerilasciata. Puoi usare il comando operations describe
per ottenere
ulteriori informazioni su un'operazione di prerilascio specifica.
gcloud compute operations describe \
systemevent-xxxxxxxx
gcloud
restituisce una risposta simile alla seguente:
... operationType: compute.instances.preempted progress: 100 selfLink: https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f/operations/systemevent-xxxxxxxx startTime: '2015-04-02T12:12:10.881-07:00' status: DONE statusMessage: Instance was preempted. ...
REST
Per ottenere un elenco delle operazioni di sistema recenti, invia una richiesta GET
all'URI delle operazioni di zona.
GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/operations
La risposta contiene un elenco di operazioni recenti.
{ "kind": "compute#operation", "id": "15041793718812375371", "name": "systemevent-xxxxxxxx", "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f", "operationType": "compute.instances.preempted", "targetLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f/instances/example-vm", "targetId": "12820389800990687210", "status": "DONE", "statusMessage": "Instance was preempted.", ... }
Per definire l'ambito della risposta in modo da mostrare solo le operazioni di prerilascio, puoi aggiungere un
filtro alla richiesta API:
operationType="compute.instances.preempted"
. Per visualizzare le operazioni di prerilascio
per una VM specifica, aggiungi un parametro targetLink
al filtro:
operationType="compute.instances.preempted" AND
targetLink="https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[VM_NAME]"
.
In alternativa, puoi determinare se una VM è stata prerilasciata dall'interno della VM stessa. Ciò è utile se vuoi gestire una chiusura dovuta a un prerilascio di Compute Engine in modo diverso da un normale arresto in uno script di arresto. Per farlo, devi semplicemente verificare se nel server dei metadati è presente il valore preempted
nei metadati di istanza predefiniti della tua VM.
Ad esempio, utilizza curl
all'interno della VM per ottenere il valore di
preempted
:
curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted" -H "Metadata-Flavor: Google"
TRUE
Se questo valore è TRUE
, la VM è stata prerilasciata da Compute Engine,
altrimenti è FALSE
.
Se desideri utilizzarla al di fuori di uno script di chiusura, puoi aggiungere ?wait_for_change=true all'URL. Questa operazione esegue una richiesta GET HTTP inutilizzata che viene restituita solo quando i metadati sono stati modificati e la VM è stata prerilasciata.
curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted?wait_for_change=true" -H "Metadata-Flavor: Google"
TRUE
Testa le impostazioni di prerilascio
Puoi eseguire eventi di manutenzione simulati sulle tue VM per forzarle a prerilascio. Utilizza questa funzionalità per testare come le tue app gestiscono le VM prerilasciabili. Leggi la pagina relativa al test dei criteri di disponibilità per scoprire come testare gli eventi di manutenzione sulle tue VM.
Puoi anche simulare il prerilascio di una VM arrestando la VM. Questa operazione può essere utilizzata al posto di un evento di manutenzione e che evita i limiti di quota.
best practice
Di seguito sono riportate alcune best practice per utilizzare al meglio le istanze VM prerilasciabili.
Utilizzo dell'API per le istanze collettive
Anziché creare singole VM, puoi utilizzare l'API di istanza collettiva.
Scegli forme più piccole della macchina
Le risorse per le VM prerilasciabili provengono dall'eccesso e da una capacità di backup di Google Cloud. La capacità è spesso più facile da ottenere per i tipi di macchina più piccoli, ovvero tipi di macchina con meno risorse come vCPU e memoria. Potresti aumentare la capacità delle VM prerilasciabili selezionando un tipo di macchina personalizzata più piccolo, ma la capacità è ancora più probabile per i tipi di macchina predefinita più piccoli. Ad esempio, rispetto alla capacità per il tipo di macchina predefinita n2-standard-32
, la capacità per il tipo di macchina personalizzata n2-custom-24-96
è più probabile, ma la capacità per il tipo di macchina predefinita n2-standard-16
è ancora più probabile.
Esegui cluster di VM prerilasciabile di grandi dimensioni durante i periodi di picco
Il carico sui data center di Google Cloud varia in base alla località e all'ora del giorno, ma in genere è minimo nelle notti e nei fine settimana. Di conseguenza, le notti e i fine settimana sono i momenti migliori per eseguire cluster di VM prerilasciabile di grandi dimensioni.
Progetta le tue applicazioni in modo che siano a tolleranza di errore e di prerilascio
È importante essere preparati al fatto che si verificano cambiamenti nei modelli di prerilascio in diversi momenti. Ad esempio, se una zona subisce un'interruzione parziale, un numero elevato di VM prerilasciabili potrebbe essere prerilasciato per fare spazio alle VM standard che devono essere spostate durante il ripristino. In questo lasso di tempo ridotto, il tasso di prerilascio sarebbe molto diverso rispetto a qualsiasi altro giorno. Se la tua applicazione presuppone che le prerilascio avvengano sempre in piccoli gruppi, potresti non essere pronto per questo evento. Puoi testare il comportamento della tua applicazione in un evento di prerilascio arrestando l'istanza VM.
Riprova a creare VM che sono state prerilasciate
Se l'istanza VM è stata prerilasciata, prova a creare nuove VM prerilasciabili una o due volte prima di ricorrere alle VM standard. A seconda dei requisiti, potrebbe essere una buona idea combinare VM standard e prerilasciabili nei tuoi cluster per assicurarti che il lavoro proceda a un ritmo adeguato.
Utilizzare gli script di chiusura
Gestisci le notifiche di arresto e prerilascio con uno script di arresto che può salvare l'avanzamento di un job in modo che possa riprendere da dove si è interrotto, anziché ricominciare da capo.
Che cosa succede dopo?
- Leggi la documentazione sulle istanze VM prerilasciabili.
- Ulteriori informazioni sugli script di chiusura.
- Connettiti alla VM.