VMs do Spot


Esta página explica o que são as VMs Spot e como funcionam no Google Kubernetes Engine (GKE). Para saber como usar VMs do Spot, consulte o artigo Use Spot VMs.

Vista geral das VMs do Spot no GKE

As VMs do Spot são instâncias de máquinas virtuais (VMs) do Compute Engine com um preço inferior ao das VMs padrão do Compute Engine e não oferecem qualquer garantia de disponibilidade. As VMs de capacidade instantânea oferecem os mesmos tipos de máquinas e opções que as VMs padrão.

Pode usar VMs do Spot nos seus clusters e conjuntos de nós para executar cargas de trabalho sem estado, em lote ou com tolerância a falhas que podem tolerar interrupções causadas pela natureza efémera das VMs do Spot.

As VMs do Spot permanecem disponíveis até o Compute Engine precisar dos recursos para VMs padrão.

Para saber mais sobre as VMs de capacidade instantânea, consulte o artigo VMs de capacidade instantânea na documentação do Compute Engine.

Vantagens das VMs do Spot

As VMs do Spot e as VMs preemptíveis partilham muitas vantagens, incluindo as seguintes:

Ao contrário das VMs preemptivas, que expiram após 24 horas, as VMs do Spot não têm um tempo de expiração. As VMs de preço mais baixo só são terminadas quando o Compute Engine precisa dos recursos noutro local.

Como funcionam as VMs do Spot no GKE

Quando cria um cluster ou um conjunto de nós com VMs de capacidade instantânea, o GKE cria VMs de capacidade instantânea do Compute Engine subjacentes que se comportam como um grupo de instâncias geridas (GIG). Os nós que usam VMs de instância única comportam-se como nós padrão do GKE, mas sem garantia de disponibilidade. Quando os recursos usados pelas VMs do Spot são necessários para executar VMs padrão, o Compute Engine termina essas VMs do Spot para usar os recursos noutro local.

Encerramento e encerramento controlado de VMs do Spot

Quando o Compute Engine precisa de reaver os recursos usados pelas VMs Spot, é enviado um aviso de rescisão para o GKE. As VMs Spot terminam 30 segundos após receberem um aviso de rescisão.

Por predefinição, os clusters usam o graceful node shutdown. O kubelet repara no aviso de rescisão e rescinde graciosamente os pods que estão a ser executados no nó. Se os pods fizerem parte de uma carga de trabalho gerida, como uma implementação, o controlador cria e agenda novos pods para substituir os pods terminados.

Com base no melhor esforço, o kubelet concede um período de encerramento elegante de 15 segundos para os pods não pertencentes ao sistema, após o qual os pods do sistema (com as priorityClasses system-cluster-critical ou system-node-critical) têm 15 segundos para terminar elegantemente. Durante o encerramento elegante de nós, o kubelet atualiza o estado dos pods e atribui uma fase Failed e um motivo Terminated aos pods encerrados.

A VM é encerrada 30 segundos após o envio do aviso de rescisão, mesmo que especifique um valor superior a 15 segundos no campo terminationGracePeriodSeconds do manifesto do agrupamento.

Quando o número de pods terminados atinge um limite de 1000 para clusters com menos de 100 nós ou 5000 para clusters com 100 nós ou mais, a recolha de lixo limpa os pods.

Também pode eliminar manualmente os pods terminados através dos seguintes comandos:

  kubectl get pods --all-namespaces | grep -i NodeShutdown | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n
  kubectl get pods --all-namespaces | grep -i Terminated | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n

Agendar cargas de trabalho em VMs do Spot

O GKE adiciona automaticamente as etiquetas 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 de spot. Pode agendar Pods específicos em nós que usam VMs Spot através do campo nodeSelector na especificação do Pod. Os exemplos seguintes usam a etiqueta cloud.google.com/gke-spot:

apiVersion: v1
kind: Pod
spec:
  nodeSelector:
    cloud.google.com/gke-spot: "true"

Em alternativa, pode usar a afinidade de nós para indicar ao GKE que agende pods em VMs Spot, semelhante ao exemplo seguinte:

apiVersion: v1
kind: Pod
spec:
...
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: cloud.google.com/gke-spot
            operator: In
            values:
            - "true"
...

Também pode usar nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution para preferir que o GKE coloque pods em nós que usam VMs Spot. Não é recomendável dar preferência a VMs Spot, porque o GKE pode agendar os pods em nós viáveis existentes que usam VMs padrão.

Usar restrições e tolerâncias para o agendamento

Para evitar interrupções do sistema, use uma contaminação de nós para garantir que o GKE não agenda cargas de trabalho críticas em VMs Spot. Quando contamina nós que usam VMs Spot, o GKE agenda apenas pods que tenham a tolerância correspondente nesses nós.

Se usar taints de nós, certifique-se de que o cluster também tem, pelo menos, um conjunto de nós que usa VMs do Compute Engine padrão. Os conjuntos de nós que usam VMs padrão oferecem um local fiável para o GKE agendar componentes críticos do sistema, como o DNS.

Para informações sobre a utilização de uma contaminação de nós para VMs do Spot, consulte o artigo Use contaminações e tolerâncias para VMs do Spot.

Usar VMs do Spot com node pools de GPU

As VMs do Spot suportam a utilização de GPUs. Quando cria um novo conjunto de nós de GPU, o GKE adiciona automaticamente a marcação nvidia.com/gpu=present:NoSchedule aos novos nós. Apenas os pods com a tolerância correspondente podem ser executados nestes nós. O GKE adiciona automaticamente esta tolerância aos pods que pedem GPUs.

O cluster tem de ter, pelo menos, um pool de nós sem GPU existente que use VMs padrão antes de criar um pool de nós com GPU que use VMs Spot. Se o seu cluster tiver apenas um conjunto de nós de GPU com VMs Spot, o GKE não adiciona a restrição nvidia.com/gpu=present:NoSchedule a esses nós. Como resultado, o GKE pode agendar cargas de trabalho do sistema nos conjuntos de nós de GPU com VMs Spot, o que pode provocar interrupções devido às VMs Spot e aumentar o consumo de recursos, uma vez que os nós de GPU são mais caros do que os nós sem GPU.

Redimensionador automático de clusters e aprovisionamento automático de nós

Pode usar o escalador automático de clusters e o aprovisionamento automático de nós para dimensionar automaticamente os clusters e os conjuntos de nós com base nas exigências das suas cargas de trabalho. O redimensionador automático de clusters e o aprovisionamento automático de nós suportam a utilização de VMs Spot.

VMs do Spot e aprovisionamento automático de nós

O aprovisionamento automático de nós cria e elimina automaticamente node pools no seu cluster para satisfazer as exigências das suas cargas de trabalho. Quando agenda cargas de trabalho que requerem VMs Spot através de um nodeSelector ou de uma afinidade de nós, o aprovisionamento automático de nós cria novos conjuntos de nós para acomodar os pods das cargas de trabalho. O GKE adiciona automaticamente a restrição cloud.google.com/gke-spot=true:NoSchedule aos nós nos novos conjuntos de nós. Apenas os pods com a tolerância correspondente podem ser executados em nós nesses conjuntos de nós. Tem de adicionar a tolerância correspondente às suas implementações para permitir que o GKE coloque os pods em VMs Spot:

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

Pode garantir que o GKE agenda os seus pods apenas em VMs Spot usando uma tolerância e uma regra de afinidade de nó ou nodeSelector para filtrar VMs Spot.

Se agendar uma carga de trabalho usando apenas uma tolerância, o GKE pode agendar os pods em VMs Spot ou VMs padrão existentes com capacidade. Se precisar de agendar uma carga de trabalho em VMs Spot, use um nodeSelector ou uma afinidade de nós, além de uma tolerância. Para saber mais, consulte o artigo Agendamento de cargas de trabalho em VMs de spot.

VMs do Spot e redimensionador automático de clusters

O escalador automático de clusters adiciona e remove automaticamente nós nos seus node pools com base na procura. Pode configurar o escalador automático de clusters para adicionar novos nós com uma preferência por VMs Spot. Para saber mais, consulte o artigo VMs Spot e o escalador automático de clusters.

Política predefinida

A partir da versão 1.24.1-gke.800 do GKE, pode definir a política de localização do escalador automático. O redimensionador automático de clusters tenta aprovisionar node pools de VMs Spot quando os recursos estão disponíveis e a política de localização predefinida está definida como ANY. Com esta política, as VMs do Spot têm um risco inferior de serem anuladas. Para outros tipos de VMs, a política de distribuição do escalador automático do cluster predefinida é BALANCED.

Atualize node pools padrão com VMs do Spot

Se os seus pools de nós do cluster padrão que usam VMs de Spot estiverem configurados para usar atualizações rápidas, o GKE cria nós rápidos com VMs de Spot. No entanto, o GKE não aguarda que as VMs Spot estejam prontas antes de isolar e esvaziar os nós existentes, uma vez que as VMs Spot não oferecem qualquer garantia de disponibilidade. Para saber mais, consulte o artigo Atualizações de picos.

Modificações ao comportamento do Kubernetes

A utilização de VMs de capacidade instantânea no GKE modifica algumas garantias e restrições fornecidas pelo Kubernetes, como as seguintes:

  • A recuperação de VMs do Spot é involuntária e não está coberta pelas garantias de PodDisruptionBudgets. Pode ocorrer uma indisponibilidade superior à PodDisruptionBudget configurada.

Práticas recomendadas para VMs do Spot

Ao conceber um sistema que usa VMs de spot, pode evitar interrupções importantes usando as seguintes diretrizes:

  • As VMs de capacidade instantânea não têm garantias de disponibilidade. Conceba os seus sistemas partindo do princípio de que o GKE pode reaver qualquer uma ou todas as suas VMs Spot em qualquer altura, sem garantia de quando as novas instâncias ficam disponíveis.
  • Para garantir que as suas cargas de trabalho e tarefas são processadas mesmo quando não existem VMs Spot disponíveis, certifique-se de que os seus clusters têm uma combinação de pools de nós que usam VMs Spot e pools de nós que usam VMs do Compute Engine padrão.
  • Certifique-se de que o cluster tem, pelo menos, um conjunto de nós sem GPU que use VMs padrão antes de adicionar um conjunto de nós com GPU que use VMs Spot.
  • Embora os nomes dos nós não mudem normalmente quando os nós são recriados, os endereços IP internos e externos usados pelas VMs de Spot podem mudar após a recriação.
  • Use taints e tolerâncias de nós para garantir que os pods críticos não são agendados em node pools que usam VMs do Spot.
  • Para executar cargas de trabalho com estado em VMs Spot, teste para garantir que as suas cargas de trabalho podem ser terminadas normalmente no prazo de 25 segundos após o encerramento para minimizar o risco de corrupção de dados do volume persistente.
  • Siga as práticas recomendadas de encerramento de pods do Kubernetes.

O que se segue?