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.
- Confira a disponibilidade de VMs spot antes de provisionar recursos para reduzir as chances de encontrar erros de disponibilidade de recursos.
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:
No console do Google Cloud , acesse a página Criar um cluster do Kubernetes.
No menu de navegação, na seção Pools de nós, clique no nome do pool de nós que você quer configurar.
Em Modelo de provisionamento, selecione VMs spot.
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.
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:
Acesse a página do Google Kubernetes Engine no console do Google Cloud .
Na lista de clusters, clique no nome do cluster que você quer modificar.
Clique na guia Nós.
Clique em Criar pool de nós gerenciado pelo usuário.
No menu de navegação, clique em Nós.
Em Modelo de provisionamento, selecione VMs spot.
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.
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.
Crie um novo cluster com o pool de nós padrão usando VMs padrão:
gcloud container clusters create CLUSTER_NAMESubstitua
CLUSTER_NAMEpelo nome do novo bucket.Receba as credenciais para o cluster:
gcloud container clusters get-credentials CLUSTER_NAMECrie um pool de nós usando VMs Spot:
gcloud container node-pools create POOL_NAME \ --cluster=CLUSTER_NAME \ --num-nodes=1 \ --spotSubstitua:
POOL_NAME: o nome do novo pool de nós.CLUSTER_NAME: o nome do cluster.
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: 4Nesse manifesto, o campo
nodeSelectorinstrui o GKE a programar apenas pods em nós que usam VMs spot.Aplique o manifesto ao cluster:
kubectl apply -f pi-app.yamlDescreva o pod:
kubectl describe pod piO 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 piO campo
Nodemostra 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.
Para criar um pool de nós com nós que usam VMs Spot e com taints de nó, use o flag
--node-taintsao 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 \ --spotPara 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: NoScheduleO 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 spot com nós on demand como substituto.
- Saiba mais sobre as VMs spot no GKE.
- Confira um tutorial sobre como implantar uma carga de trabalho em lote usando VMs spot no GKE.