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
- A funcionalidade de encerramento elegante do nó do kubelet só está ativada em clusters com a versão 1.20 e posteriores do GKE. Para versões do GKE anteriores à 1.20, pode usar o controlador de eventos de terminação de nós do Kubernetes no GCP para terminar graciosamente os seus pods quando as VMs Spot são antecipadas.
- As VMs de capacidade instantânea não suportam pools de nós do Windows Server.
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:
Na Google Cloud consola, aceda à página Criar um cluster do Kubernetes.
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.
Selecione a caixa de verificação Ativar VMs de spot.
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:
Aceda à página do Google Kubernetes Engine na Google Cloud consola.
Na lista de clusters, clique no nome do cluster que quer modificar.
Clique em
Adicionar conjunto de nós.No menu de navegação, clique em Nodes.
Selecione a caixa de verificação Ativar VMs de spot.
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.
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.Obtenha credenciais para o cluster:
gcloud container clusters get-credentials CLUSTER_NAME
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.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.Aplique o manifesto ao cluster:
kubectl apply -f pi-app.yaml
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.
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
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?
- Saiba como executar uma aplicação GKE em VMs Spot com nós a pedido como alternativa.
- Saiba mais sobre as VMs Spot no GKE.
- Faça um tutorial sobre a implementação de uma carga de trabalho em lote com VMs do Spot no GKE.