Executar cargas de trabalho tolerantes a falhas a custos menores com as VMs do Spot

Esta página mostra como executar cargas de trabalho tolerantes a falhas, sem estado ou em lote a custos menores usando VMs spot nos clusters e pools de nós do Google Kubernetes Engine (GKE).

Visão geral

As VMs Spot são máquinas virtuais (VMs) do Compute Engine com um preço menor que as VMs padrão e não oferecem garantia de disponibilidade. As VMs Spot oferecem os mesmos tipos de máquinas e opções que as VMs padrão do Compute Engine. O Compute Engine pode recuperar VMs do Spot a qualquer momento devido a eventos do sistema, como quando os recursos são necessários para as VMs padrão.

Para saber mais sobre as VMs spot no GKE, consulte VMs spot.

As VMs spot substituem a necessidade de usar VMs preemptivas para executar cargas de trabalho sem estado, em lote ou tolerantes a falhas. Ao contrário das VMs preemptivas, que expiram após 24 horas, as VMs spot não têm prazo de validade. As VMs do Spot são encerradas quando o Compute Engine exige que os recursos executem VMs padrão.

As VMs Spot também são compatíveis com clusters do Autopilot do GKE por meio de pods do Spot. Com os Spot Pods, o Autopilot programa e gerencia automaticamente as cargas de trabalho nas VMs spot.

Limitações

  • As VMs spot não são compatíveis com os pools de nós do Windows Server.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ative a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Para usar a Google Cloud CLI nesta tarefa, instale e inicialize a CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando o comando gcloud components update. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.

Provisionar VMs spot no GKE

Para provisionar VMs spot, crie um cluster que use VMs spot para o pool de nós padrão. Ou crie um pool de nós que use VMs Spot.

Use o console do Google Cloud ou a Google Cloud CLI para definir os parâmetros de encerramento completo das VMs spot. Para mais informações sobre como definir os parâmetros de encerramento completo, consulte Encerramento e encerramento completo de VMs spot.

Criar um cluster com VMs Spot

É possível criar um novo cluster usando VMs Spot com a Google Cloud CLI ou o console Google Cloud .

Console

Para criar um novo cluster com um pool de nós usando VMs Spot, execute as etapas a seguir:

  1. No console do Google Cloud , acesse a página Criar um cluster do Kubernetes.

    Acessar "Criar um cluster do Kubernetes"

  2. No menu de navegação, na seção Pools de nós, clique no nome do pool de nós que você quer configurar.

  3. Em Modelo de provisionamento, selecione VMs spot.

  4. Opcional: para configurar o período de encerramento normal para pods em execução em nós neste pool de nós, selecione um valor no menu suspenso Período de encerramento normal e, se aplicável, insira um valor no campo Período de encerramento normal de pods críticos (segundos). Os valores, se configurados, são armazenados na configuração do sistema de nós, em que é possível atualizá-los depois, se necessário. Para mais informações, consulte Encerramento e encerramento completo de VMs spot.

  5. Configure o cluster conforme necessário e clique em Criar.

gcloud

Crie um novo cluster que use VMs Spot no pool de nós padrão em vez de VMs padrão:

gcloud container clusters create CLUSTER_NAME \
    --spot
    [--system-config-from-file=SYSTEM_CONFIG_PATH]

Substitua CLUSTER_NAME pelo nome do novo bucket.

Se quiser definir os parâmetros para o encerramento completo do pool de nós padrão, substitua SYSTEM_CONFIG_PATH pelo caminho do arquivo que contém a configuração kubelet. Para mais informações, consulte Encerramento automático de VMs spot no GKE. Também é possível atualizar esses parâmetros após a criação do pool de nós. No entanto, o GKE precisa recriar os nós para fazer as mudanças.

Criar um pool de nós com VMs Spot

É possível criar novos pools de nós usando VMs Spot com a CLI gcloud ou o Google Cloud console. Só é possível ativar VMs Spot em novos pools de nós. Não é possível ativar ou desativar VMs Spot em pools de nós existentes.

Console

Para criar um novo pool de nós usando VMs Spot, execute as etapas a seguir:

  1. Acesse a página do Google Kubernetes Engine no console do Google Cloud .

    Acessar o Google Kubernetes Engine

  2. Na lista de clusters, clique no nome do cluster que você quer modificar.

  3. Clique na guia Nós.

  4. Clique em Criar pool de nós gerenciado pelo usuário.

  5. No menu de navegação, clique em Nós.

  6. Em Modelo de provisionamento, selecione VMs spot.

  7. Opcional: para configurar o período de encerramento normal para pods em execução em nós neste pool de nós, selecione um valor no menu suspenso Período de encerramento normal e, se aplicável, insira um valor no campo Período de encerramento normal de pods críticos (segundos). Os valores, se configurados, são armazenados na configuração do sistema de nós, em que é possível atualizá-los depois, se necessário. Para mais informações, consulte Encerramento e encerramento completo de VMs spot.

  8. Configure o pool de nós conforme necessário e clique em Criar pool de nós.

gcloud

Crie um novo pool de nós usando VMs Spot:

gcloud container node-pools create POOL_NAME \
    --cluster=CLUSTER_NAME \
    --spot
    [--system-config-from-file=SYSTEM_CONFIG_PATH]

Substitua:

  • POOL_NAME: o nome do novo pool de nós.
  • CLUSTER_NAME: o nome do cluster.

Opcionalmente, se quiser definir os parâmetros para o encerramento completo, substitua SYSTEM_CONFIG_PATH pelo caminho para o arquivo que contém a configuração kubelet. Para mais informações, consulte Encerramento normal de VMs spot no GKE. Também é possível atualizar esses parâmetros após a criação do pool de nós. No entanto, o GKE precisa recriar os nós para fazer as alterações.

Escalonar cargas de trabalho em VMs spot

O GKE adiciona os rótulos cloud.google.com/gke-spot=true e cloud.google.com/gke-provisioning=spot (para nós que executam a versão 1.25.5-gke.2500 ou posterior do GKE) aos nós que usam VMs spot. É possível filtrar esse identificador na especificação do pod usando o campo nodeSelector na especificação do pod ou a afinidade do nó.

No exemplo a seguir, você cria um cluster com dois pools de nós, um dos quais usa VMs spot. Em seguida, implante um aplicativo nginx sem estado nas Spot VMs, usando um nodeSelector para controlar o local em que o GKE coloca os pods.

  1. Crie um novo cluster com o pool de nós padrão usando VMs padrão:

    gcloud container clusters create CLUSTER_NAME
    

    Substitua CLUSTER_NAME pelo nome do novo bucket.

  2. Receba as credenciais para o cluster:

    gcloud container clusters get-credentials CLUSTER_NAME
    
  3. Crie um pool de nós usando VMs Spot:

    gcloud container node-pools create POOL_NAME \
       --cluster=CLUSTER_NAME \
        --num-nodes=1 \
        --spot
    

    Substitua:

    • POOL_NAME: o nome do novo pool de nós.
    • CLUSTER_NAME: o nome do cluster.
  4. Salve o seguinte manifesto como um arquivo chamado pi-app.yaml:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pi
    spec:
      template:
        metadata:
          labels:
            app: pi
        spec:
          nodeSelector:
            cloud.google.com/gke-spot: "true"
          terminationGracePeriodSeconds: 25
          containers:
          - name: pi
            image: perl:5.34.0
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: Never
      backoffLimit: 4
    

    Nesse manifesto, o campo nodeSelector instrui o GKE a programar apenas pods em nós que usam VMs spot.

  5. Aplique o manifesto ao cluster:

    kubectl apply -f pi-app.yaml
    
  6. Descreva o pod:

    kubectl describe pod pi
    

    O resultado será assim:

    Name:         pi-kjbr9
    Namespace:    default
    Priority:     0
    Node:         gke-cluster-2-spot-pool-fb434072-44ct
    ...
    Labels:       app=pi
                  job-name=pi
    Status:       Succeeded
    ...
    Controlled By:  Job/pi
    Containers:
    ...
    Conditions:
      Type              Status
      Initialized       True 
      Ready             False 
      ContainersReady   False 
      PodScheduled      True 
    Volumes:
    ...
    Node-Selectors:              cloud.google.com/gke-spot=true
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:
      Type    Reason     Age    From               Message
      ----    ------     ----   ----               -------
      Normal  Scheduled  4m3s   default-scheduler  Successfully assigned default/pi-kjbr9 to gke-cluster-2-spot-pool-fb434072-44ct
      Normal  Pulling    4m2s   kubelet            Pulling image "perl:5.34.0"
      Normal  Pulled     3m43s  kubelet            Successfully pulled image "perl:5.34.0" in 18.481761978s
      Normal  Created    3m43s  kubelet            Created container pi
      Normal  Started    3m43s  kubelet            Started container pi
    

    O campo Node mostra que o GKE programa somente seus pods em nós que usam VMs Spot.

Usar taints e tolerâncias para VMs spot

Como prática recomendada, crie clusters com pelo menos um pool de nós sem VMs Spot, em que é possível colocar cargas de trabalho do sistema, como DNS. É possível usar taints de nós e as tolerâncias correspondentes para evitar que o GKE coloque cargas de trabalho em VMs Spot.

  1. Para criar um pool de nós com nós que usam VMs Spot e com taints de nó, use o flag --node-taints ao criar o pool de nós:

    gcloud container node-pools create POOL_NAME \
        --cluster=CLUSTER_NAME \
        --node-taints=cloud.google.com/gke-spot="true":NoSchedule \
        --spot
    
  2. Para adicionar a tolerância correspondente aos pods que você quer programar nas VMs Spot, modifique suas implantações e adicione o seguinte à especificação do pod:

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

    O GKE programa apenas pods com essa tolerância nas VMs Spot com o taint de nós adicionado.

A seguir