Como executar VMs preemptivas

Nesta página, você encontra uma visão geral do suporte de máquina virtual (VM) preemptiva no Google Kubernetes Engine (GKE).

Visão geral

VMs preemptivas são instâncias de VM do Compute Engine com duração de, no máximo, 24 horas e que não oferecem garantias de disponibilidade. Elas têm um preço mais baixo que as VMs padrão do Compute Engine e oferecem os mesmos tipos de máquinas e opções.

É possível usar VMs preemptivas em clusters ou pools de nós do GKE para executar jobs em lote ou tolerantes a falhas que sejam menos suscetíveis à natureza efêmera e não garantida das VMs preemptivas.

Para saber mais sobre elas, consulte VMs preemptivas na documentação do Compute Engine.

Como as VMs preemptivas funcionam

Quando os clusters ou pools de nós do GKE criam VMs do Compute Engine, elas se comportam como um grupo de instâncias gerenciadas. VMs preemptivas no GKE estão sujeitas às mesmas limitações das instâncias preemptivas em um grupo de instâncias gerenciadas. Elas são encerradas 30 segundos após o recebimento da notificação de preempção.

Além disso, essas VMs preemptivas recebem um Rótulo do Kubernetes, cloud.google.com/gke-preemptible=true. Os rótulos do Kubernetes podem ser usados no campo nodeSelector para escalonamento de pods para nós específicos.

Veja abaixo um seletor de exemplo de filtro de VMs preemptivas:

apiVersion: v1
kind: Pod
spec:
  nodeSelector:
    cloud.google.com/gke-preemptible: "true"

Violações de restrição do Kubernetes

O uso de VMs preemptivas no GKE invalida algumas garantias do Kubernetes. As seguintes restrições são modificadas por VMs preemptivas:

  • A preempção do nó encerra os Pods de modo inadequado e ignora o período de carência do pod (em inglês) configurado. Isso significa que os pods são encerrados sem aviso prévio.

  • De acordo com a documentação do orçamento de interrupção de pod (em inglês): "o orçamento só protege contra remoções voluntárias, e não contra todas as causas de indisponibilidade". A preempção não é voluntária, por isso você pode enfrentar uma indisponibilidade maior do que o especificado no orçamento de interrupção do pod.

Práticas recomendadas

Como as VMs preemptivas não têm garantias de disponibilidade, é preciso projetar o sistema com o pressuposto de que qualquer ou todas as instâncias do Compute Engine podem ser rejeitadas e ficar indisponíveis. Não há garantias de quando novas instâncias ficam disponíveis.

Além disso, não há garantia de que os pods executados em VMs preemptivas sempre possam ser desligados normalmente. Pode levar vários minutos até que o GKE detecte que o nó foi interrompido e que os pods não estão mais em execução, o que atrasará a reprogramação deles para um novo nó.

Se você quiser garantir que os jobs ou as cargas de trabalho sejam processados mesmo que não haja nenhuma VM preemptiva disponível, poderá criar pools de nós preemptivos e não preemptivos no cluster.

Ainda que os nomes de nós geralmente permaneçam os mesmos se e quando forem substituídos após a preempção, os IPs preemptivos internos e externos da VM poderão ser alterados após a preempção.

Não use VMs preemptivas com pods com monitoração porque elas podem violar a semântica inerente a StatefulSets e levar à perda de dados.

Como usar taints de nó para evitar a programação em nós de VM preemptiva

Para evitar interrupções no sistema, use um taint de nó para garantir que os pods críticos não sejam programados em um nó de VM preemptivo.

Se você aplicar o tainting de nós, verifique se o cluster também tem nós não preemptivos, para que sempre haja um pool de nós em que os componentes do sistema sejam executados, como o DNS.

Como criar taint de nó para VMs preemptivas

Para adicionar um taint de nó com VMs preemptivas, execute o comando a seguir:

kubectl taint nodes node-name cloud.google.com/gke-preemptible="true":NoSchedule

Em que node-name é o nome do nó.

Agora, apenas os pods que toleram o taint serão programados no nó.

Como adicionar tolerância a pods

Para adicionar a tolerância relevante aos pods, inclua o seguinte na especificação do pod ou do modelo de pod do objeto:

tolerations:
- key: cloud.google.com/gke-preemptible
  operator: Equal
  value: "true"
  effect: NoSchedule

Taints de nós preemptivos do GPU

Crie o cluster com nós não preemptivos antes de adicionar um pool de nós de GPU preemptivo. Isso garante que sempre haja um pool de nós de VMs padrão para executar componentes do sistema, como DNS, antes de adicionar pools de nós de GPU preemptivos.

Se não houver outros pools de nós no cluster quando um pool de nós preemptivos com GPUs for adicionado ao cluster, incluindo se um cluster for criado inicialmente com um pool de nós de GPU preemptivo, ele não terá a mancha "nvidia.com/gpu":NoSchedule atribuída. Isso significa que os pods do sistema serão programados nos nós preemptivos que podem ser prejudiciais quando são submetidos a uma interrupção. Esses pods também consomem recursos em nós do GPU. Isso desperdiça não apenas a capacidade, mas também o dinheiro, porque os nós do GPU são mais caros do que os nós não-GPU.

Como criar um cluster ou pool de nós com VMs preemptivas

Use a ferramenta de linha de comando gcloud ou o Console do Cloud para criar um cluster ou pool de nós com VMs preemptivas.

gcloud

É possível criar um cluster ou pool de nós com VMs preemptivas especificando a sinalização --preemptible.

Para criar um cluster com VMs preemptivas, execute o comando a seguir:

gcloud container clusters create cluster-name --preemptible

Em que cluster-name é o nome do cluster a ser criado.

Para criar um pool de nós com VMs preemptivas, execute o seguinte comando:

gcloud container node-pools create pool-name --preemptible \
    --cluster cluster-name

em que:

  • pool-name é o nome do pool de nós a ser criado;
  • cluster-name é o nome do cluster para o pool de nós.

Console

  1. Acesse o menu do Google Kubernetes Engine no Console do Cloud.

    Acessar o menu do Google Kubernetes Engine

  2. Clique no botão Criar cluster.

  3. Configure o cluster como quiser.

  4. No painel de navegação, em Pools de nós, para o pool de nós que você quer configurar, clique em Nós.

  5. Marque a caixa de seleção Ativar nós preemptivos.

  6. Clique em Criar.

A seguir