Execute cargas de trabalho com tolerância a falhas a custos mais baixos com VMs do Spot

Esta página mostra-lhe como executar cargas de trabalho tolerantes a falhas, sem estado ou em lote a custos mais baixos através da utilização de VMs Spot nos seus clusters e node pools do Google Kubernetes Engine (GKE).

Vista geral

As VMs do Spot são máquinas virtuais (VMs) do Compute Engine com um preço inferior ao das VMs padrão predefinidas e não oferecem qualquer garantia de disponibilidade. As VMs do Spot oferecem os mesmos tipos de máquinas e opções que as VMs padrão do Compute Engine. O Compute Engine pode reaver VMs descontínuas em qualquer altura devido a eventos do sistema, como quando os recursos são necessários para VMs padrão.

Para saber mais sobre as VMs do Spot no GKE, consulte o artigo VMs do Spot.

As VMs do Spot substituem a necessidade de usar VMs preemptivas para executar cargas de trabalho sem estado, em lote ou com tolerância a falhas. Ao contrário das VMs preemptíveis, que expiram após 24 horas, as VMs do Spot não têm tempo de expiração. As VMs do Spot são terminadas quando o Compute Engine requer os recursos para executar VMs padrão.

As VMs do Spot também são suportadas em clusters do GKE Autopilot através de pods do Spot. Com os Spot Pods, o Autopilot agenda e gere automaticamente as cargas de trabalho em VMs do Spot.

Limitações

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize-a. Se instalou anteriormente a CLI gcloud, execute gcloud components update para obter a versão mais recente.

Crie um cluster com VMs do Spot

Pode criar um novo cluster com VMs Spot através da CLI Google Cloud ou da Google Cloud consola.

gcloud

Crie um novo cluster que use VMs do Spot no node pool predefinido em vez de VMs padrão:

gcloud container clusters create CLUSTER_NAME \
    --spot

Substitua CLUSTER_NAME pelo nome do novo cluster.

Consola

Para criar um novo cluster com um conjunto de nós que use VMs de Spot, siga os passos abaixo:

  1. Na Google Cloud consola, aceda à página Criar um cluster do Kubernetes.

    Aceda a Crie um cluster do Kubernetes

  2. No menu de navegação, na secção Conjuntos de nós, clique no nome do conjunto de nós que quer configurar e, de seguida, clique em Nós.

  3. Selecione a caixa de verificação Ativar VMs de spot.

  4. Configure o cluster conforme necessário e, de seguida, clique em Criar.

Crie um node pool com VMs do Spot

Pode criar novos conjuntos de nós com VMs Spot através da CLI gcloud ou da Google Cloud consola. Só pode ativar VMs de capacidade instantânea em novos conjuntos de nós. Não pode ativar nem desativar VMs de capacidade instantânea em pools de nós existentes.

gcloud

Crie um novo node pool com VMs do Spot:

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

Substitua POOL_NAME pelo nome do novo conjunto de nós.

Consola

Para criar um novo conjunto de nós com VMs do Spot, siga os passos abaixo:

  1. Aceda à página do Google Kubernetes Engine na Google Cloud consola.

    Aceda ao Google Kubernetes Engine

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

  3. Clique em Adicionar conjunto de nós.

  4. No menu de navegação, clique em Nodes.

  5. Selecione a caixa de verificação Ativar VMs de spot.

  6. Configure o node pool conforme necessário e, de seguida, clique em Criar.

Agende cargas de trabalho em VMs do Spot

O GKE adiciona as 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) etiquetas aos nós que usam VMs Spot. Pode filtrar esta etiqueta na especificação do pod usando o campo nodeSelector na especificação do pod ou a afinidade de nós.

No exemplo seguinte, cria um cluster com dois node pools, um dos quais usa VMs Spot. Em seguida, implementa uma aplicação nginx sem estado nas VMs de Spot, usando um nodeSelector para controlar onde o GKE coloca os pods.

  1. Crie um novo cluster com o node pool predefinido através de VMs padrão:

    gcloud container clusters create CLUSTER_NAME
    

    Substitua CLUSTER_NAME pelo nome do novo cluster.

  2. Obtenha credenciais para o cluster:

    gcloud container clusters get-credentials CLUSTER_NAME
    
  3. Crie um node pool com VMs do Spot:

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

    Substitua POOL_NAME pelo nome do novo conjunto de nós.

  4. Guarde o seguinte manifesto como um ficheiro com o nome 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
    

    Neste manifesto, o campo nodeSelector indica ao GKE que deve agendar 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 é semelhante ao seguinte:

    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 agenda apenas os seus pods em nós que usam VMs de spot.

Use restrições e tolerâncias para VMs do Spot

Como prática recomendada, crie clusters com, pelo menos, um conjunto de nós sem VMs Spot, onde pode colocar cargas de trabalho do sistema, como DNS. Pode usar contaminações de nós e as tolerâncias correspondentes para indicar ao GKE que evite colocar determinadas cargas de trabalho em VMs do Spot.

  1. Para criar um node pool com nós que usam VMs do Spot e têm node taints, use a flag --node-taints quando criar o node pool:

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

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

    O GKE só agenda pods com esta tolerância nas VMs Spot com a restrição de nó adicionada.

O que se segue?