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
- O recurso de encerramento otimizado de nós do kubelet só é ativado nos clusters que executam o GKE versão 1.20 e posterior. Para versões do GKE anteriores à 1.20, use o gerenciador de eventos de encerramento de nós do Kubernetes no GCP para encerrar corretamente seus pods quando as VMs do Spot forem interrompidas.
- As Spot VMs 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:
- 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:
Acesse a página Google Kubernetes Engine no console do Google Cloud.
Clique em add_box Criar.
Na caixa de diálogo Criar cluster, ao lado de GKE Standard, clique em Configurar.
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.
Marque a caixa de seleção Ativar VMs do Spot.
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:
Acesse a página Google Kubernetes Engine no console do Google Cloud.
Na lista de clusters, clique no nome do cluster que você quer modificar.
Clique em
Adicionar pool de nós.No menu de navegação, clique em Nós.
Marque a caixa de seleção Ativar VMs do Spot.
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.
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.Receba as credenciais para o cluster:
gcloud container clusters get-credentials CLUSTER_NAME
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.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.Aplique o manifesto ao cluster:
kubectl apply -f pi-app.yaml
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.
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
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
- Saiba como executar um aplicativo do GKE em VMs do Spot com nós sob demanda como substituto.
- Saiba mais sobre Spot VMs no GKE.
- Confira um tutorial sobre como implantar uma carga de trabalho em lote usando VMs do Spot no GKE.