Adicionar um pool de nós do Azure Spot a um cluster do Serviço Kubernetes do Azure (AKS)

Neste artigo, você adiciona um pool de nós spot secundário a um cluster existente do Serviço Kubernetes (AKS) do Azure.

Um pool de nós spot é um pool de nós apoiado por um conjunto de escala de máquina virtual spot do Azure. Com VMs spot em seu cluster AKS, você pode aproveitar a capacidade não utilizada do Azure com economias de custos significativas. A quantidade de capacidade disponível não utilizada varia com base em muitos fatores, como tamanho do nó, região e hora do dia.

Quando você implanta um pool de nós Spot, o Azure aloca os nós Spot se houver capacidade disponível e implanta um conjunto de escala Spot que apoia o pool de nós Spot em um único domínio padrão. Não há SLA para os nós Spot. Não há garantias de alta disponibilidade. Se o Azure precisar de capacidade de volta, a infraestrutura do Azure removerá os nós Spot.

Os nós spot são ótimos para cargas de trabalho que podem lidar com interrupções, rescisões antecipadas ou remoções. Por exemplo, cargas de trabalho como trabalhos de processamento em lote, ambientes de desenvolvimento e teste e grandes cargas de trabalho de computação podem ser bons candidatos para agendar em um pool de nós Spot.

Antes de começar

  • Este artigo pressupõe uma compreensão básica dos conceitos do Kubernetes e do Azure Load Balancer. Para obter mais informações, consulte Conceitos principais do Kubernetes para o Serviço Kubernetes do Azure (AKS).
  • Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.
  • Quando você cria um cluster para usar um pool de nós Spot, o cluster deve usar Conjuntos de Escala de Máquina Virtual para pools de nós e o balanceador de carga SKU Padrão . Você também deve adicionar outro pool de nós depois de criar seu cluster, que é abordado neste tutorial.
  • Este artigo requer que você esteja executando a CLI do Azure versão 2.14 ou posterior. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).

Limitações

As limitações a seguir se aplicam quando você cria e gerencia clusters AKS com um pool de nós Spot:

  • Um pool de nós spot não pode ser um pool de nós padrão, ele só pode ser usado como um pool secundário.
  • Não é possível atualizar o plano de controle e os pools de nós ao mesmo tempo. Você deve atualizá-los separadamente ou remover o pool de nós Spot para atualizar o plano de controle e os pools de nós restantes ao mesmo tempo.
  • Um pool de nós Spot deve usar Conjuntos de Escala de Máquina Virtual.
  • Não é possível alterar ScaleSetPriority ou SpotMaxPrice após a criação.
  • Ao definir SpotMaxPrice, o valor deve ser -1 ou um valor positivo com até cinco casas decimais.
  • Um pool de nós Spot tem o kubernetes.azure.com/scalesetpriority:spot rótulo, a kubernetes.azure.com/scalesetpriority=spot:NoSchedule mancha e os pods do sistema têm antiafinidade.
  • Você deve adicionar uma tolerância e afinidade correspondentes para agendar cargas de trabalho em um pool de nós Spot.

Adicionar um pool de nós Spot a um cluster AKS

Ao adicionar um pool de nós spot a um cluster existente, ele deve ser um cluster com vários pools de nós habilitados. Ao criar um cluster AKS com vários pools de nós habilitados, você cria um pool de nós com um priority de Regular por padrão. Para adicionar um pool de nós Spot, você deve especificar Spot como o valor de priority. Para obter mais detalhes sobre como criar um cluster AKS com vários pools de nós, consulte Usar vários pools de nós.

  • Crie um pool de nós com um priority de Spot usando o az aks nodepool add comando.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name spotnodepool \
        --priority Spot \
        --eviction-policy Delete \
        --spot-max-price -1 \
        --enable-cluster-autoscaler \
        --min-count 1 \
        --max-count 3 \
        --no-wait
    

No comando anterior, o priority de Spot torna o pool de nós um pool de nós Spot. O eviction-policy parâmetro é definido como Delete, que é o valor padrão. Quando você define a política de remoção como Delete, os nós no conjunto de escala subjacente do pool de nós são excluídos quando são removidos.

Você também pode definir a política de remoção como Deallocate, o que significa que os nós no conjunto de escala subjacente são definidos para o estado parado-desalocado após a remoção. Os nós no estado de desalocação interrompida contam em relação à sua cota de computação e podem causar problemas com o dimensionamento ou atualização do cluster. Os valores e eviction-policy só podem ser definidos durante a priority criação do pool de nós. Esses valores não podem ser atualizados posteriormente.

O comando anterior também habilita o autoscaler de cluster, que recomendamos usar com pools de nós spot. Com base nas cargas de trabalho em execução no cluster, o autoscaler do cluster dimensiona o número de nós para cima e para baixo. Para pools de nós spot, o autoscaler de cluster aumentará o número de nós após uma remoção se ainda forem necessários mais nós. Se você alterar o número máximo de nós que um pool de nós pode ter, também precisará ajustar o maxCount valor associado ao autoscaler de cluster. Se você não usar um autoscaler de cluster, após a remoção, o pool de pontos acabará diminuindo para 0 e exigirá operação manual para receber quaisquer nós de spot adicionais.

Importante

Agende apenas cargas de trabalho em pools de nós spot que possam lidar com interrupções, como trabalhos de processamento em lote e ambientes de teste. Recomendamos que você configure manchas e tolerâncias em seu pool de nós Spot para garantir que apenas cargas de trabalho que possam lidar com remoções de nós sejam agendadas em um pool de nós Spot. Por exemplo, o comando acima adiciona uma mancha de kubernetes.azure.com/scalesetpriority=spot:NoSchedule, portanto, apenas pods com uma tolerância correspondente são agendados neste nó.

Verificar o pool de nós Spot

  • Verifique se o pool de nós foi adicionado usando o az aks nodepool show comando e confirmando o scaleSetPriority is Spot.

    az aks nodepool show --resource-group myResourceGroup --cluster-name myAKSCluster --name spotnodepool
    

Agendar um pod para ser executado no nó Spot

Para agendar um pod para ser executado em um nó Spot, você pode adicionar uma tolerância e afinidade de nó que corresponda à mancha aplicada ao seu nó Spot.

O exemplo a seguir mostra uma parte de um arquivo YAML que define uma tolerância correspondente à kubernetes.azure.com/scalesetpriority=spot:NoSchedule mancha e uma afinidade de nó correspondente ao kubernetes.azure.com/scalesetpriority=spot rótulo usado na etapa anterior com requiredDuringSchedulingIgnoredDuringExecution e preferredDuringSchedulingIgnoredDuringExecution regras de afinidade de nó:

spec:
  containers:
  - name: spot-example
  tolerations:
  - key: "kubernetes.azure.com/scalesetpriority"
    operator: "Equal"
    value: "spot"
    effect: "NoSchedule"
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: "kubernetes.azure.com/scalesetpriority"
            operator: In
            values:
            - "spot"
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value

Quando você implanta um pod com essa tolerância e afinidade de nós, o Kubernetes agenda com êxito o pod nos nós com a mancha e o rótulo aplicados. Neste exemplo, aplicam-se as seguintes regras:

  • O nó deve ter um rótulo com a chave kubernetes.azure.com/scalesetpriority, e o valor desse rótulo deve ser spot.
  • O nó preferencialmente tem um rótulo com a chave another-node-label-key, e o valor desse rótulo deve ser another-node-label-value.

Para obter mais informações, consulte Atribuindo pods a nós.

Atualizar um pool de nós Spot

Quando você atualiza um pool de nós Spot, o AKS emite internamente um cordão e um aviso de despejo, mas nenhum dreno é aplicado. Não há nós de surto disponíveis para atualizações do pool de nós spot. Fora dessas alterações, o comportamento ao atualizar pools de nós spot é consistente com o de outros tipos de pool de nós.

Para obter mais informações sobre atualização, consulte Atualizar um cluster AKS.

Preço máximo para uma piscina Spot

O preço das instâncias spot é variável, com base na região e na SKU. Para obter mais informações, consulte informações de preços para Linux e Windows.

Com preços variáveis, você tem a opção de definir um preço máximo, em dólares americanos (USD), usando até cinco casas decimais. Por exemplo, o valor 0,98765 seria um preço máximo de $0,98765 USD por hora. Se você definir o preço máximo como -1, a instância não será removida com base no preço. Enquanto houver capacidade e cota disponíveis, o preço para a instância será o preço mais baixo do preço atual para uma instância spot ou para uma instância padrão.

Próximos passos

Neste artigo, você aprendeu como adicionar um pool de nós Spot a um cluster AKS. Para obter mais informações sobre como controlar pods em pools de nós, consulte Práticas recomendadas para recursos avançados do agendador no AKS.