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 do 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 Spot VMs no GKE, consulte Spot VMs.

As Spot VMs 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 do 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 do Spot.

Limitações

Antes de começar

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

  • Ativar a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a Google Cloud CLI para essa tarefa, instale e, em seguida, inicialize a CLI gcloud. Se você instalou a CLI gcloud anteriormente, instale a versão mais recente executando gcloud components update.

Criar um cluster com VMs Spot

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

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

Substitua CLUSTER_NAME pelo nome do novo bucket.

Console

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

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

    Acessar o Google Kubernetes Engine

  2. Clique em Criar.

  3. Na caixa de diálogo Criar cluster, ao lado de GKE Standard, clique em Configurar.

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

  5. Marque a caixa de seleção Ativar VMs do Spot.

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

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 console do Google Cloud. 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.

gcloud

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

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

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

Console

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

  1. Acesse a página 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 em Adicionar pool de nós.

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

  5. Marque a caixa de seleção Ativar VMs do Spot.

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

Programar cargas de trabalho em Spot VMs

O GKE adiciona os identificadores 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 do 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 Spot VMs. 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 \
        --num-nodes=1 \
        --spot
    

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

  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 Spot VMs.

  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 Spot VMs

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 \
        --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