Nesta página, você aprenderá a criar e usar uma instância preemptiva de máquina virtual (VM, na sigla em inglês). As VMs preemptivas estão disponíveis com um desconto de 60 a 91% em comparação com o preço das VMs padrão. No entanto, o Compute Engine poderá interromper essas instâncias (forçar a interrupção) caso precise recuperar esses recursos para outras tarefas. As VMs preemptivas sempre são interrompidas após 24 horas. As VMs preemptivas são recomendadas apenas para aplicativos tolerantes a falhas que resistam à preempção da VM Verifique se esse é o caso do seu aplicativo antes de criar uma instância. Leia a documentação Instâncias de VM preemptiva para entender os riscos e o valor dessas VMs.
Antes de começar
- Leia a documentação sobre instâncias de VMs preemptivas.
-
Configure a autenticação, caso ainda não tenha feito isso.
A autenticação é
o processo de verificação da sua identidade para acesso a serviços e APIs do Google Cloud.
Para executar códigos ou amostras de um ambiente de desenvolvimento local, autentique-se no
Compute Engine da seguinte maneira.
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
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
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.
- Copie ou faça download do script de desligamento na estação de trabalho local.
- Abra o arquivo para editá-lo e altere as seguintes variáveis:
[PROGRAM_NAME]
é o nome do processo ou programa que você quer encerrar. Por exemplo,apache2
ounginx
.[LOCAL_USER]
é o nome de usuário que você usou para fazer login na máquina virtual.[BUCKET_NAME]
é o nome do bucket do Cloud Storage em que você quer salvar o arquivo de checkpoint do programa. Observe que o nome do bucket não começa comgs://
nesse caso.
- Salve as alterações.
- Adicione o script de encerramento a uma nova VM ou a uma VM atual.
A instância foi criada com pelo menos acesso de leitura/gravação ao Cloud Storage. Consulte a documentação de autenticação para ver instruções sobre como criar uma VM com os escopos apropriados.
você tenha um bucket do Cloud Storage e permissão para gravar nele.
No console do Google Cloud, acesse a página Registros.
Selecione o projeto e clique em Continuar.
Adicione
compute.instances.preempted
ao campo filtrar por rótulo ou pesquisa de texto.Outra opção é inserir um nome de VM se você quiser ver as operações de preempção de uma determinada VM.
Pressione Enter para aplicar os filtros especificados. O console do Google Cloud atualiza a lista de registros para exibir somente as operações em que uma VM foi preemptiva.
Selecione uma operação na lista para ver detalhes sobre a instância que passou por interrupção forçada.
- Leia a documentação sobre instâncias de VMs preemptivas.
- Leia sobre scripts de desligamento.
- Conectar-se à VM.
Go
Para usar os exemplos Go desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.
Confira mais informações em Set up authentication for a local development environment.
Java
Para usar os exemplos Java desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.
Confira mais informações em Set up authentication for a local development environment.
Node.js
Para usar os exemplos Node.js desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.
Confira mais informações em Set up authentication for a local development environment.
Python
Para usar os exemplos Python desta página em um ambiente de desenvolvimento local, instale e inicialize o gcloud CLI e e configure o Application Default Credentials com suas credenciais de usuário.
Confira mais informações em Set up authentication for a local development environment.
REST
Para usar as amostras da API REST nesta página em um ambiente de desenvolvimento local, use as credenciais fornecidas para gcloud CLI.
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
Para mais informações, consulte Autenticar para usar REST na documentação de autenticação do Google Cloud.
Como criar uma VM preemptiva
Crie uma VM preemptiva usando a CLI gcloud ou a API Compute Engine. Para usar o Console do Google Cloud, crie uma VM do Spot.
gcloud
Com a ferramenta
gcloud compute
, use o mesmo comandoinstances create
que você usaria para criar uma instância normal, mas adicione a sinalização--preemptible
.gcloud compute instances create [VM_NAME] --preemptible
em que
[VM_NAME]
é o nome da VM.Go
Java
Node.js
Python
REST
Na API, crie uma solicitação normal para criar uma VM, mas inclua a propriedade
preemptible
emscheduling
e defina-a comotrue
. 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 }, ... }
Cotas de CPU preemptiva
As VMs preemptivas exigem cotas de CPU disponíveis, como as VMs padrão. Para evitar que VMs preemptivas consumam as cotas de CPU das VMs padrão, solicite uma cota especial de "CPU preemptiva". Depois que o Compute Engine conceder a você uma cota de CPU preemptiva nessa região, todas as VMs preemptivas serão contabilizadas nessa cota, e todas as VMs padrão serão contabilizadas na cota de CPU padrão.
Em regiões onde não há cotas de CPU preemptiva, use a cota de CPU padrão para iniciar instâncias preemptivas. Também é preciso ter IP e cota de disco suficientes. A cota de CPU preemptiva não é visível pela CLI gcloud ou nas páginas de cota do Console do Google Cloud Platform a menos que essa cota tenha sido concedida no Compute Engine.
Para mais informações sobre cotas, visite a página Cotas de recurso.
Iniciar uma VM preemptiva
Como qualquer outra VM, se uma VM preemptiva for parada ou interrompida, é possível iniciá-la novamente e retorná-la ao estado
RUNNING
. Iniciar uma VM preemptiva redefine o contador de 24 horas, mas como ainda é uma VM preemptiva, o Compute Engine pode antecipar antes de 24 horas. Não é possível converter uma VM preemptiva em uma VM padrão enquanto ela está em execução.Se o Compute Engine interromper uma VM preemptiva em um grupo gerenciado de instâncias (MIG, na sigla em inglês) de escalonamento automático ou um cluster do Google Kubernetes Engine (GKE), o grupo reiniciará a VM quando os recursos ficarem disponíveis novamente.
Processar a preempção com um script de desligamento
Quando a VM é preemptiva, é possível usar um script de desligamento para executar ações de limpeza antes que a VM seja interrompida. Por exemplo, é possível interromper normalmente um processo em execução e copiar um arquivo de checkpoint para o Cloud Storage.
O script de desligamento a seguir pode ser adicionado a uma VM preemptiva durante a execução ou quando ela é criada. Esse script é executado quando a VM começa a ser encerrada e antes que o comando
kill
normal do sistema operacional interrompa todos os processos restantes. Após o encerramento normal do programa desejado, o script fará o upload paralelo de um arquivo de checkpoint para um bucket do 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."
Para adicionar esse script a uma VM, configure-o para trabalhar com um aplicativo na VM e adicione-o aos metadados da VM.
Para esse script, presume-se que:
Identificar VMs preemptivas
Para verificar se uma VM é preemptiva, siga as etapas em Identificar o modelo de provisionamento e a ação de encerramento de uma VM.
Determinar se uma VM foi interrompida
Determine se uma VM foi preemptiva pelo console do Google Cloud, pela CLI gcloud ou pela API.
Console
Verifique se uma instância foi preemptiva consultando os registros de atividades do sistema.
gcloud
Use o comandogcloud compute operations list
com um parâmetro de filtro para receber uma lista de eventos de preempção no projeto.gcloud compute operations list \ --filter="operationType=compute.instances.preempted"
É possível usar o parâmetro de filtro para ampliar o escopo dos resultados. Por exemplo, para ver eventos de preempção apenas de VMs dentro de um grupo gerenciado de instâncias:
gcloud compute operations list \ --filter="operationType=compute.instances.preempted AND targetLink:instances/[BASE_VM_NAME]"
gcloud
retorna uma resposta semelhante a esta: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
compute.instances.preempted
indica que a VM foi preemptiva. É possível usar o comandooperations describe
para mais informações sobre uma determinada operação de preempção.gcloud compute operations describe \ systemevent-xxxxxxxx
gcloud
retorna uma resposta semelhante a esta:... 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 acessar uma lista das operações recentes do sistema, envie uma solicitaçãoGET
para o URI das operações da zona.GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/operations
A resposta contém uma lista das 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 que a resposta mostre apenas operações de preempção, adicione um filtro à solicitação de API:
operationType="compute.instances.preempted"
. Para ver as operações de preempção 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]"
.Outra opção é determinar se uma VM passou por preempção dentro da própria VM. Isso é útil quando você quer lidar com um encerramento decorrente de uma preempção do Compute Engine de maneira diferente de um encerramento normal em um script de encerramento. Para fazer isso, basta verificar o valor
preempted
no servidor de metadados nos metadados de instância padrão da VM.Por exemplo, use
curl
na VM para receber o valor depreempted
:curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted" -H "Metadata-Flavor: Google" TRUE
Se esse valor for
TRUE
, significa que a VM passou por interrupção forçada pelo Compute Engine. Caso contrário, seráFALSE
.Para usar isso fora de um script de encerramento, anexe ?wait_for_change=true ao URL. Será executada uma solicitação HTTP GET pendente que só retorna quando os metadados são alterados e a VM foi interrompida.
curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted?wait_for_change=true" -H "Metadata-Flavor: Google" TRUE
Testar as configurações da preempção
Para forçar a preempção em uma VM, execute eventos de manutenção simulados nela. Use esse recurso para testar como seus apps lidam com VMs preemptivas. Leia Como testar suas políticas de disponibilidade para aprender como executar eventos de manutenção simulados nas VMs.
Para simular a preempção de uma VM, interrompa a VM. Isso pode ser usada em vez de simular um evento de manutenção e evitar limites de cota.
Práticas recomendadas
Estas são algumas práticas recomendadas para ajudar você a aproveitar ao máximo as instâncias preemptivas de VM.
Como usar a API de instâncias em massa
Em vez de criar VMs individuais, use a API de instância em massa.
Escolher formas menores de máquina
Os recursos das VM preemptivas saem da capacidade extra e de backup do Google Cloud. Geralmente, é mais fácil conseguir capacidade para tipos de máquinas menores, o que significa tipos de máquinas com menos recursos como vCPUs e memória. É possível conseguir mais capacidade para VMs preemptivas selecionando um tipo de máquina personalizado menor, mas a capacidade é ainda mais provável para tipos de máquina predefinidos menores. Por exemplo, em comparação com a capacidade do tipo de máquina predefinido
n2-standard-32
, a capacidade para o tipo de máquina personalizadon2-custom-24-96
é mais provável, mas a capacidade para o tipo de máquina predefinidon2-standard-16
é ainda mais provável.Executar grandes clusters de VM preemptiva fora dos horários de pico
A carga nos data centers do Google Cloud varia de acordo com o local e a hora do dia, mas costuma ser mais baixa nas noites e fins de semana. Assim, o melhor momento para executar grandes clusters de VM preemptiva é durante esses períodos.
Desenvolver os aplicativos para serem tolerantes a falhas e preempção
É importante se preparar para mudanças nos padrões de preempção em diferentes momentos. Por exemplo, se uma zona sofrer uma interrupção parcial, uma grande quantidade de VMs preemptivas poderão preemptivas para abrir espaço para VMs padrão que precisam ser movidas como parte da recuperação. Nesse pequeno período de tempo, a taxa de preempção é muito diferente de qualquer outro dia. Se seu aplicativo considera que as preempções sempre ocorrem em pequenos grupos, pode ser que você não esteja preparado para um evento desse tipo. Interrompa a instância de VM para testar o comportamento do seu aplicativo em um evento de preempção.
Tentar criar novamente as VMs que foram preemptivas
Se a instância de VM tiver sido preemptiva, tente criar novas VMs preemptivas uma ou duas vezes antes de voltar às VMs padrão. Dependendo dos requisitos, combine VMs padrão com preemptivas nos clusters para garantir que o trabalho ocorra em um ritmo adequado.
Usar scripts de desligamento
Gerencie avisos de desligamento e preempção com um script de desligamento que salva o progresso de um trabalho. Portanto, continue de onde você parou em vez de começar do zero.
A seguir
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 2024-09-24 UTC.
-