Como criar e iniciar uma instância de VM preemptiva

Nesta página, você aprenderá a criar e usar uma instância preemptiva de máquina virtual (VM, na sigla em inglês). Essa instância pode ser criada e executada a um preço muito mais baixo do que as instâncias normais. No entanto, ela pode ser encerrada no Compute Engine quando o acesso aos recursos para outras tarefas é necessário. As instâncias preemptivas sempre são encerradas após 24 horas. Para saber mais sobre elas, leia a documentação de instâncias preemptivas.

Recomenda-se instâncias preemptivas apenas para aplicativos tolerantes a falhas que oferecem suporte às preempções de instância. Verifique se esse é o caso do seu aplicativo antes de criar uma instância. Leia a documentação de instâncias preemptivas para entender os riscos e o valor desse tipo de instância.

Antes de começar

Como criar uma instância preemptiva

Crie uma instância preemptiva usando o Console do Google Cloud Platform, a ferramenta gcloud ou a API.

Console

Criar uma instância preemptiva é o mesmo que criar uma instância normal, mas com a propriedade preemptible ativada.

  1. No Console do GCP, acesse a página "Instâncias de VM".

    Acessar a página "Instâncias da VM"

  2. Clique em Criar instância.
  3. Na página Criar uma nova instância, preencha as propriedades desejadas da instância.
  4. Clique em Gerenciamento, segurança, discos, rede, locatário único.
  5. Em Política de disponibilidade, defina a opção Preempção como Ativada. Essa configuração desativa a reinicialização automática da instância e define a ação de manutenção do host como Encerrar.
  6. Clique em Criar para criar a instância.

gcloud

Com o 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 [INSTANCE_NAME] --preemptible

[INSTANCE_NAME] é o nome da instância.

API

Na API, crie uma solicitação normal para criar uma instância, mas inclua a propriedade preemptible em scheduling e defina essa propriedade como true. Exemplo:

POST https://www.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

Da mesma forma que as instâncias regulares, as instâncias preemptivas requerem cotas de CPU. Para evitar que as instâncias preemptivas consumam as cotas de CPU das instâncias regulares, solicite uma cota especial de "CPU preemptiva". Assim que essa cota é concedida para essa região no Compute Engine, todas as instâncias preemptivas são deduzidas dessa cota. As instâncias regulares continuam a ser deduzidas da cota de CPU normal.

Em regiões onde não há cotas de CPU preemptiva, use a cota de CPU regular para criar instâncias preemptivas. Como de costume, você também precisa ter IP e cota de disco suficientes. A cota de CPU preemptiva não é visível pela ferramenta gcloud ou nas páginas de cota do Console do GCP, a menos que essa cota tenha sido concedida no Compute Engine.

Para mais informações sobre cotas, visite a página Cotas de recurso.

Processar a preempção com um script de desligamento

Se a instância foi rejeitada, use um script de desligamento para executar ações de limpeza antes que ela seja interrompida. Por exemplo, encerre um processo em execução e copie um arquivo de checkpoint para o Google Cloud Storage.

O script de desligamento a seguir pode ser adicionado a uma instância preemptiva em execução ou quando ela é criada. Esse script é executado quando a instância começa a ser desligada, antes que todos os processos restantes sejam encerrados com o comando normal kill do sistema operacional. Após o encerramento do programa desejado, o script faz o upload paralelo de um arquivo de checkpoint a um intervalo do Google 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 instância, configure-o para trabalhar com um aplicativo na sua instância e adicione-o aos metadados dela.

  1. Copie ou faça download do script de desligamento na estação de trabalho local.
  2. 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 ou nginx.
    • [LOCAL_USER] é o nome de usuário que você usou para fazer login na máquina virtual.
    • [BUCKET_NAME] é o nome do intervalo do Google Cloud Storage em que você quer salvar o arquivo de checkpoint do programa. Observe que o nome do intervalo não começa com gs:// nesse caso.
  3. Salve as alterações.
  4. Adicione o script de encerramento a uma instância nova ou atual.

Para esse script, presume-se que:

  • a instância foi criada pelo menos com acesso de leitura e gravação no Google Cloud Storage. Consulte a documentação de autenticação para aprender a criar uma instância com o escopo adequado;

  • você tem um intervalo do Google Cloud Storage com permissão de gravação.

Como verificar se uma instância é preemptiva

Para verificar se uma instância está configurada como preemptiva, use o Console do GCP, a ferramenta gcloud ou a API.

Console


Verifique se uma instância é preemptiva consultando as propriedades dela.

  1. Acesse a página "Instâncias da VM".

    Acessar a página "Instâncias da VM"

  2. Selecione seu projeto e clique em Continuar.
  3. Clique no nome da instância que você quer verificar. A página de detalhes da instância será aberta.
  4. O status preemptivo é especificado na seção de Políticas de disponibilidade dos detalhes da instância.

gcloud


No gcloud compute, use instances describe para consultar informações sobre uma instância, incluindo se ela é preemptiva.

gcloud compute instances describe [INSTANCE_NAME]

[INSTANCE_NAME] é o nome da instância.

A informação de resposta inclui o status preemptivo na seção de programação.

...
scheduling:
  automaticRestart: false
  onHostMaintenance: TERMINATE
  preemptible: true
...

API


Para verificar se uma instância é preemptiva, use a API para enviar uma solicitação GET para o URI da instância.

GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instances/[INSTANCE_NAME]

A informação de resposta inclui o status preemptivo abaixo de scheduling.

{
    "kind": "compute#instance",
    "id": "4468501694759003918",
    "creationTimestamp": "2015-04-15T15:40:59.004-07:00",
    "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-f",
    "status": "RUNNING",
    "name": "example-instance",
    "scheduling":
    {
       "preemptible": true
    },
    ...
 }

Você também pode determinar se uma instância é preemptiva a partir da própria instância. Basta verificar o valor scheduling/preemptible do servidor de metadados nos metadados padrão da instância.

Por exemplo, use curl a partir da sua instância para obter o valor de scheduling/preemptible:

curl "http://metadata.google.internal/computeMetadata/v1/instance/scheduling/preemptible" -H "Metadata-Flavor: Google"
TRUE

Se o valor for TRUE, a instância será preemptiva.

Como detectar se uma instância teve a interrupção forçada

Determine se uma instância foi interrompida com o Console do Google Cloud Platform, a ferramenta gcloud ou a API.

Console


Verifique se uma instância foi interrompida consultando os registros de atividade do sistema.

  1. Acesse a página "Registros".

    Acessar a página "Registros"

  2. Selecione seu projeto e clique em Continuar.
  3. Adicione compute.instances.preempted ao campo filtrar por rótulo ou pesquisa de texto.
  4. Também insira o nome de uma instância se você quiser consultar operações de preempção de uma instância específica.
  5. Pressione Enter para aplicar os filtros especificados. No Console do GCP, a lista de registros é atualizada para mostrar apenas as operações em que uma instância foi interrompida.
  6. Selecione uma operação na lista para ver detalhes sobre a instância interrompida.

gcloud


Use o comando gcloud compute operations list com um parâmetro de filtro para acessar 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 dentro de um grupo de instâncias gerenciadas:

gcloud compute operations list \
    --filter="operationType=compute.instances.preempted AND targetLink:instances/[BASE_INSTANCE_NAME]"

A resposta da gcloud é semelhante à seguinte:

NAME                  TYPE                         TARGET                                   HTTP_STATUS STATUS TIMESTAMP
systemevent-xxxxxxxx  compute.instances.preempted  us-central1-f/instances/example-instance-xxx  200         DONE   2015-04-02T12:12:10.881-07:00

Um tipo de operação compute.instances.preempted indica que a instância foi rejeitada. Use o comando operations describe para consultar mais informações sobre uma operação de preempção específica.

gcloud compute operations describe \
    systemevent-xxxxxxxx

A resposta da gcloud é semelhante à seguinte:

...
operationType: compute.instances.preempted
progress: 100
selfLink: https://www.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.
...

API


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://www.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-instance",
  "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 instância 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/[INSTANCE_NAME]".

Também é possível determinar se uma instância teve a interrupção forçada de dentro da própria instância. Isso é útil quando você quer lidar com um desligamento decorrente de uma preempção do Compute Engine de maneira diferente de um desligamento normal em um script de desligamento. Para fazer isso, basta verificar o valor preempted do servidor de metadados nos metadados padrão da sua instância.

Por exemplo, use curl de dentro da sua instância para conseguir 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 instância foi rejeitada pelo Compute Engine. Caso contrário, será FALSE.

Para usar isso fora de um script de desligamento, anexe ?wait_for_change=true ao URL. Será executada uma solicitação HTTP GET suspensa que só retornará quando os metadados tiverem sido alterados e a instância tiver sido rejeitada.

curl "http://metadata.google.internal/computeMetadata/v1/instance/preempted?wait_for_change=true" -H "Metadata-Flavor: Google"
TRUE

Práticas recomendadas

Estas são algumas práticas recomendadas para ajudar você a aproveitar ao máximo as instâncias preemptivas de VM.

Escolher formas menores de máquina

Os recursos para as instâncias preemptivas de VM são provenientes da capacidade excedente e de backup do Google Cloud Platform. Normalmente é mais fácil receber muita capacidade preemptiva com tipos de máquinas menores do que com as maiores. As taxas de preempção para tipos de máquinas menores com menos de 32 núcleos também são historicamente inferiores às dos tipos de máquinas maiores.

Também é possível receber mais capacidade disponível usando um tipo de máquina personalizado que esteja entre os tipos predefinidos. Por exemplo, provavelmente há mais capacidade para um tipo de máquina personalizado com 48 vCPUs do que em n1-standard-64s.

Executar grandes clusters de VM preemptiva fora dos horários de pico

A carga nos data centers do Google Cloud Platform varia de acordo com a localização e a hora do dia, mas geralmente é mais baixa à noite e nos fins de semana. Assim, o melhor momento para executar grandes clusters de VM preemptiva é durante esses períodos.

Desenvolver seus aplicativos para serem tolerantes a falhas e preempção

É importante estar preparado para mudanças nos padrões de preempção em diferentes momentos. Por exemplo, no caso de uma interrupção parcial em uma zona, é possível que um grande número de instâncias preemptivas sejam rejeitadas para dar espaço a instâncias regulares 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 novamente a criação de instâncias que foram rejeitadas

Se a instância preemptiva foi rejeitada, vale a pena tentar criá-la mais uma ou duas vezes antes de retornar às instâncias regulares. Dependendo dos requisitos, combine instâncias regulares 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

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Compute Engine