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 até 91% em relação ao preço padrã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.
Com isso, você confirma 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 selecionando uma das seguintes opções:
Selecione a guia para como planeja usar as amostras nesta página:
Console
Quando você usa o console Google Cloud para acessar serviços Google Cloud e APIs, não é necessário configurar a autenticação.
gcloud
-
Instale a CLI do Google Cloud. Após a instalação, inicialize a Google Cloud CLI executando o seguinte comando:
gcloud initAo usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
- Defina uma região e uma zona padrão.
-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Se você estiver usando um shell local, crie credenciais de autenticação local para sua conta de usuário:
gcloud auth application-default login
Não é necessário fazer isso se você estiver usando o Cloud Shell.
Se um erro de autenticação for retornado e você estiver usando um provedor de identidade (IdP) externo, confirme se você fez login na CLI gcloud com sua identidade federada.
-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Se você estiver usando um shell local, crie credenciais de autenticação local para sua conta de usuário:
gcloud auth application-default login
Não é necessário fazer isso se você estiver usando o Cloud Shell.
Se um erro de autenticação for retornado e você estiver usando um provedor de identidade (IdP) externo, confirme se você fez login na CLI gcloud com sua identidade federada.
-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Se você estiver usando um shell local, crie credenciais de autenticação local para sua conta de usuário:
gcloud auth application-default login
Não é necessário fazer isso se você estiver usando o Cloud Shell.
Se um erro de autenticação for retornado e você estiver usando um provedor de identidade (IdP) externo, confirme se você fez login na CLI gcloud com sua identidade federada.
-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Se você estiver usando um shell local, crie credenciais de autenticação local para sua conta de usuário:
gcloud auth application-default login
Não é necessário fazer isso se você estiver usando o Cloud Shell.
Se um erro de autenticação for retornado e você estiver usando um provedor de identidade (IdP) externo, confirme se você fez login na CLI gcloud com sua identidade federada.
Go
Para usar os exemplos de Go nesta página em um ambiente de desenvolvimento local, instale e inicialize a CLI gcloud e configure o Application Default Credentials com suas credenciais de usuário.
Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Java
Para usar os exemplos do Java nesta página em um ambiente de desenvolvimento local, instale e inicialize a CLI gcloud e configure o Application Default Credentials com suas credenciais de usuário.
Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Node.js
Para usar os exemplos do Node.js nesta página em um ambiente de desenvolvimento local, instale e inicialize a CLI gcloud e configure o Application Default Credentials com suas credenciais de usuário.
Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Python
Para usar os exemplos do Python nesta página em um ambiente de desenvolvimento local, instale e inicialize a CLI gcloud e configure o Application Default Credentials com suas credenciais de usuário.
Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
REST
Para usar as amostras da API REST desta página em um ambiente de desenvolvimento local, use as credenciais fornecidas para gcloud CLI.
Instale a CLI do Google Cloud.
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
Saiba mais em 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 consoleGoogle Cloud , crie uma VM do Spot em vez disso.
gcloud
Com a ferramenta gcloud compute, use o mesmo comando instances 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 em scheduling e defina-a como true. 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
},
...
}
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 na CLI gcloud ou nas páginas de cota do console doGoogle Cloud , a menos que ela 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 o Compute Engine interrompe uma VM, é possível usar um script de desligamento para tentar executar ações de limpeza antes que a VM sofra uma interrupção forçada. Por exemplo, é possível interromper normalmente um processo em execução e copiar um arquivo de checkpoint para o Cloud Storage. O período máximo de desligamento é menor para uma notificação de preempção do que para um desligamento iniciado pelo usuário. Para mais informações sobre o período de desativação de uma notificação de preempção, consulte Processo de preempção na documentação conceitual.
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"
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 esse script a uma VM, configure-o para trabalhar com um aplicativo na VM e adicione-o aos metadados da VM.
- 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,apache2ounginx.[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.
Para esse script, presume-se que:
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.
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 Google Cloud console, pela CLI gcloud ou pela API.
Console
Verifique se uma instância foi preemptiva consultando os registros de atividades do sistema.
No console do Google Cloud , acesse a página Registros.
Selecione o projeto e clique em Continuar.
Adicione
compute.instances.preemptedao 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 VM que passou por interrupção forçada.
gcloud
Use o comando gcloud 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 comando operations 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ção GET 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âmetro targetLink 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 de
preempted:
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 personalizado n2-custom-24-96 é mais provável, mas a capacidade para o tipo de máquina predefinido n2-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
- Leia a documentação sobre instâncias de VMs preemptivas.
- Leia sobre scripts de desligamento.
- Conectar-se à VM.