Esta página explica como criar e usar uma instância de máquina virtual (VM) preemptível. As VMs preemptivas estão disponíveis com um desconto de até 60 a 91% em comparação com o preço das VMs padrão. No entanto, o Compute Engine pode parar (preempt) estas VMs se precisar de reaver esses recursos para outras tarefas. As VMs preemptivas param sempre após 24 horas. As VMs preemptivas só são recomendadas para aplicações tolerantes a falhas que possam resistir à preempção de VMs. Certifique-se de que a sua aplicação consegue processar as preempções antes de decidir criar uma VM preempível. Para compreender os riscos e o valor das VMs preemptivas, leia a documentação sobre as instâncias de VM preemptivas.
Antes de começar
- Leia a documentação sobre instâncias de VM preemptivas.
-
Se ainda não o tiver feito, configure a autenticação.
A autenticação valida a sua identidade para aceder a Google Cloud serviços e APIs. Para executar código ou exemplos a partir de um ambiente de desenvolvimento local, pode autenticar-se no Compute Engine selecionando uma das seguintes opções:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
Instale a CLI Google Cloud. Após a instalação, inicialize a CLI gcloud executando o seguinte comando:
gcloud init
Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.
- Set a default region and zone.
Go
Para usar os Go exemplos nesta página num ambiente de desenvolvimento local, instale e inicialize a CLI gcloud e, em seguida, configure as Credenciais predefinidas da aplicação com as suas credenciais de utilizador.
Instale a CLI Google Cloud.
Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.
Para mais informações, consulte Set up authentication for a local development environment.
Java
Para usar os Java exemplos nesta página num ambiente de desenvolvimento local, instale e inicialize a CLI gcloud e, em seguida, configure as Credenciais predefinidas da aplicação com as suas credenciais de utilizador.
Instale a CLI Google Cloud.
Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.
Para mais informações, consulte Set up authentication for a local development environment.
Node.js
Para usar os Node.js exemplos nesta página num ambiente de desenvolvimento local, instale e inicialize a CLI gcloud e, em seguida, configure as Credenciais predefinidas da aplicação com as suas credenciais de utilizador.
Instale a CLI Google Cloud.
Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.
Para mais informações, consulte Set up authentication for a local development environment.
Python
Para usar os Python exemplos nesta página num ambiente de desenvolvimento local, instale e inicialize a CLI gcloud e, em seguida, configure as Credenciais predefinidas da aplicação com as suas credenciais de utilizador.
Instale a CLI Google Cloud.
Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.
Para mais informações, consulte Set up authentication for a local development environment.
REST
Para usar os exemplos da API REST nesta página num ambiente de desenvolvimento local, usa as credenciais que fornece à CLI gcloud.
Instale a CLI Google Cloud.
Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.
Para mais informações, consulte o artigo Autenticar para usar REST na Google Cloud documentação de autenticação.
Crie uma VM preemptiva
Crie uma VM preemptível através da CLI gcloud ou da API Compute Engine. Em alternativa, para usar a Google Cloud consola, crie uma VM do Spot.
gcloud
Com o
gcloud compute
, use o mesmo comandoinstances create
que usaria para criar uma VM normal, mas adicione a flag--preemptible
.gcloud compute instances create [VM_NAME] --preemptible
onde
[VM_NAME]
é o nome da VM.Go
Java
Node.js
Python
REST
Na API, crie um pedido normal para criar uma VM, mas inclua a propriedade
preemptible
emscheduling
e defina-a comotrue
. Por exemplo: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 }, ... }
Quotas de CPU preemptivas
As VMs preemptivas requerem quotas de CPU disponíveis, como as VMs padrão. Para evitar que as VMs preemptíveis consumam as quotas de CPU das suas VMs padrão, pode pedir uma quota especial de "CPU preemptível". Depois de o Compute Engine lhe conceder uma quota de CPU preemptível nessa região, todas as VMs preemptíveis são contabilizadas nessa quota, e todas as VMs padrão continuam a ser contabilizadas na quota de CPU padrão.
Nas regiões onde não tem quota de CPU preemptiva, pode usar a quota de CPU padrão para iniciar VMs preemptivas. Também precisa de ter quota de IP e de disco suficientes, como habitualmente. A quota de CPUs preemptíveis não está visível na CLI gcloud nem nas páginas de quota da consola, a menos que o Compute Engine tenha concedido a quota.Google Cloud
Para mais informações sobre quotas, visite a página Quotas de recursos.
Inicie uma VM preemptiva
Tal como qualquer outra VM, se uma VM preemptível for parada ou preemptada, pode iniciar a VM novamente e repô-la no estado
RUNNING
. O início de uma VM preemptiva repõe o contador de 24 horas, mas, como continua a ser uma VM preemptiva, o Compute Engine pode ser preemptivo antes de 24 horas. Não é possível converter uma VM preemptível numa VM padrão enquanto estiver em execução.Se o Compute Engine parar uma VM preemptível num grupo de instâncias geridas (GIG) de escala automática ou num cluster do Google Kubernetes Engine (GKE), o grupo reinicia a VM quando os recursos ficarem novamente disponíveis.
Faça a gestão da preempção com um script de encerramento
Quando o Compute Engine antecipa uma VM, pode usar um script de encerramento para tentar realizar ações de limpeza antes de a VM ser antecipada. Por exemplo, pode parar graciosamente um processo em execução e copiar um ficheiro de ponto de verificação para o Cloud Storage. Em particular, a duração máxima do período de encerramento é mais curta para um aviso de preemptão do que para um encerramento iniciado pelo utilizador. Para mais informações acerca do período de encerramento de um aviso de preempção, consulte o processo de preempção na documentação conceptual.
Segue-se um script de encerramento que pode adicionar a uma VM preemptível em execução ou a uma nova VM preemptível quando a criar. Este script é executado quando a VM começa a ser encerrada, antes de o comando
kill
normal do sistema operativo parar todos os processos restantes. Depois de parar corretamente o programa pretendido, o script carrega em paralelo um ficheiro de ponto de verificação para um contentor do Cloud Storage.#!/bin/bash MY_PROGRAM="[PROGRAM_NAME]" # For example, "apache2" or "nginx" MY_USER="[LOCAL_USERNAME]" CHECKPOINT="/home/$MY_USER/checkpoint.out" 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 "gcloud storage cp $CHECKPOINT gs://${BUCKET_NAME}/" echo "Done uploading, shutting down."
Para adicionar este script a uma VM, configure o script para funcionar com uma aplicação na VM e adicione-o aos metadados da VM.
- Copie ou transfira o script de encerramento para a sua estação de trabalho local.
- Abra o ficheiro para edição e altere as seguintes variáveis:
[PROGRAM_NAME]
é o nome do processo ou do programa que quer encerrar. Por exemplo,apache2
ounginx
.[LOCAL_USER]
é o nome de utilizador com o qual tem sessão iniciada na máquina virtual.[BUCKET_NAME]
é o nome do contentor do Cloud Storage onde quer guardar o ficheiro de ponto de verificação do programa. Tenha em atenção que, neste caso, o nome do contentor não começa comgs://
.
- Guarde as alterações.
- Adicione o script de encerramento a uma nova VM ou a uma VM existente.
Este script pressupõe o seguinte:
A VM foi criada com, pelo menos, acesso de leitura/escrita ao Cloud Storage. Consulte a documentação de autenticação para ver instruções sobre como criar uma VM com os âmbitos adequados.
Tem um contentor do Cloud Storage existente e autorização para escrever nele.
Identifique VMs preemptivas
Para verificar se uma VM é uma VM preemptível, siga os passos para Identificar o modelo de aprovisionamento e a ação de rescisão de uma VM.
Determine se uma VM foi anulada
Determine se uma VM foi anulada com o Google Cloud console, a CLI gcloud ou a API.
Consola
Pode verificar se uma VM foi anulada verificando os registos de atividade do sistema.
Na Google Cloud consola, aceda à página Registos.
Selecione o projeto e clique em Continuar.
Adicione
compute.instances.preempted
ao campo filtrar por etiqueta ou pesquisa de texto.Opcionalmente, também pode introduzir um nome de VM se quiser ver operações de remoção preventiva para uma VM específica.
Prima Enter para aplicar os filtros especificados. A Google Cloud consola atualiza a lista de registos para mostrar apenas as operações em que uma MV foi anulada.
Selecione uma operação na lista para ver detalhes sobre a VM que foi anulada.
gcloud
Use o comandogcloud compute operations list
com um parâmetro filter para obter uma lista de eventos de preemptção no seu projeto.gcloud compute operations list \ --filter="operationType=compute.instances.preempted"
Pode usar o parâmetro filter para restringir ainda mais o âmbito dos resultados. Por exemplo, para ver apenas eventos de antecipação para VMs num grupo de instâncias gerido:
gcloud compute operations list \ --filter="operationType=compute.instances.preempted AND targetLink:instances/[BASE_VM_NAME]"
gcloud
devolve uma resposta semelhante à seguinte: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
Um tipo de operação de
compute.instances.preempted
indica que a VM foi anulada. Pode usar o comandooperations describe
para obter mais informações sobre uma operação de preemptiva específica.gcloud compute operations describe \ systemevent-xxxxxxxx
gcloud
devolve uma resposta semelhante à seguinte:... 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
Para obter uma lista de operações recentes do sistema, envie um pedidoGET
para o URI das operações de zona.GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/operations
A resposta contém uma lista de operações recentes.
{ "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.", ... }
Para restringir o âmbito da resposta de modo a mostrar apenas operações de antecipação, pode adicionar um filtro ao seu pedido de API:
operationType="compute.instances.preempted"
. Para ver as operações de preemptividade de uma VM específica, adicione um parâmetrotargetLink
ao filtro:operationType="compute.instances.preempted" AND targetLink="https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[VM_NAME]"
.Em alternativa, pode determinar se uma VM foi anulada a partir da própria VM. Isto é útil se quiser processar um encerramento devido a uma preempção do Compute Engine de forma diferente de um encerramento normal num script de encerramento. Para tal, basta verificar o valor
preempted
no metadados da instância predefinidos da VM no servidor de metadados.Por exemplo, use
curl
a partir da sua VM para obter o valor depreempted
:curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted" -H "Metadata-Flavor: Google" TRUE
Se este valor for
TRUE
, a VM foi anulada pelo Compute Engine. Caso contrário, éFALSE
.Se quiser usar esta opção fora de um script de encerramento, pode anexar ?wait_for_change=true ao URL. Isto executa um pedido HTTP GET pendente que só é devolvido quando os metadados são alterados e a VM é anulada.
curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted?wait_for_change=true" -H "Metadata-Flavor: Google" TRUE
Teste as definições de antecipação
Pode executar eventos de manutenção simulados nas suas VMs para forçar a sua remoção preventiva. Use esta funcionalidade para testar como as suas apps processam VMs preemptivas. Leia o artigo sobre como testar as suas políticas de disponibilidade para saber como testar eventos de manutenção nas suas VMs.
Também pode simular a remoção de uma VM parando a VM, o que pode ser usado em vez de simular um evento de manutenção e evita limites de quota.
Práticas recomendadas
Seguem-se algumas práticas recomendadas para ajudar a tirar o máximo partido das instâncias de VM preemptíveis.
Usar a API de instâncias em massa
Em vez de criar VMs individuais, pode usar a API de instâncias em massa.
Escolha formas de máquinas mais pequenas
Os recursos para VMs preemptíveis provêm da capacidade excedentária e de cópia de segurança Google Cloud Normalmente, é mais fácil obter capacidade para tipos de máquinas mais pequenos, o que significa tipos de máquinas com menos recursos, como vCPUs e memória. Pode encontrar mais capacidade para VMs preemptíveis selecionando um tipo de máquina personalizado mais pequeno, mas é ainda mais provável encontrar capacidade para tipos de máquinas predefinidos mais pequenos. Por exemplo, em comparação com a capacidade do tipo de máquina
n2-standard-32
predefinido, a capacidade do tipo de máquinan2-custom-24-96
personalizado é mais provável, mas a capacidade do tipo de máquinan2-standard-16
predefinido é ainda mais provável.Execute grandes clusters de VMs preemptíveis durante as horas de menor procura
A carga nos Google Cloud centros de dados varia consoante a localização e a hora do dia, mas é geralmente mais baixa à noite e aos fins de semana. Como tal, as noites e os fins de semana são as melhores alturas para executar grandes clusters de VMs preemptíveis.
Crie as suas aplicações para serem tolerantes a falhas e a preemptivas
É importante estar preparado para o facto de existirem alterações nos padrões de antecipação em diferentes momentos. Por exemplo, se uma zona sofrer uma indisponibilidade parcial, um grande número de VMs preemptivas pode ser preemptado para dar lugar a VMs padrão que precisam de ser movidas como parte da recuperação. Nesse pequeno período, a taxa de antecipação seria muito diferente da de qualquer outro dia. Se a sua aplicação pressupõe que as antecipações são sempre feitas em pequenos grupos, pode não estar preparada para um evento deste tipo. Pode testar o comportamento da sua aplicação num evento de preemptividade parando a instância de VM.
Volte a tentar criar VMs que foram antecipadas
Se a sua instância de VM tiver sido preemptiva, experimente criar novas VMs preemptivas uma ou duas vezes antes de voltar às VMs padrão. Consoante os seus requisitos, pode ser uma boa ideia combinar VMs padrão e VMs preemptivas nos seus clusters para garantir que o trabalho avança a um ritmo adequado.
Use scripts de encerramento
Faça a gestão dos avisos de encerramento e de preemptção com um script de encerramento que pode guardar o progresso de uma tarefa para que possa continuar de onde parou, em vez de começar do zero.
O que se segue?
- Leia a documentação sobre instâncias de VM preemptivas.
- Leia acerca dos scripts de encerramento.
- Estabeleça ligação à sua VM.
Exceto em caso de indicação contrária, o conteúdo desta página é licenciado de acordo com a Licença de atribuição 4.0 do Creative Commons, e as amostras de código são licenciadas de acordo com a Licença Apache 2.0. Para mais detalhes, consulte as políticas do site do Google Developers. Java é uma marca registrada da Oracle e/ou afiliadas.
Última atualização 2025-09-19 UTC.
-