Configurar vários pools de nós usando pools de nós spot do AKS com o dimensionador automático de cluster

Concluído

O Azure fornece instâncias de Máquina Virtual do Azure que oferecem escalabilidade ao mesmo tempo em que reduzem os custos e são ideais para cargas de trabalho que podem ser interrompidas. No entanto, essas VMs (máquinas virtuais) acessam a capacidade de computação não utilizada do Azure com preços menores, mas ainda dão suporte a cenários de computação de alto desempenho.

A solução de acompanhamento de drones da sua empresa é implantada no AKS (Serviço de Kubernetes do Azure), assim como muitos aplicativos e serviços em contêineres. Um desses serviços é um serviço de processamento em lotes que agenda os caminhos de voo dos drones. Com o crescimento repentino da sua base de clientes, o serviço de processamento em lotes é inundado com solicitações e cria uma lista de pendências de entregas. Essa situação está causando atrasos e frustração do cliente.

O dimensionamento automático do número de réplicas de serviço de processamento em lote fornece o processamento de pedidos em tempo hábil. No entanto, ele também exige que você implante mais nós para acompanhar as necessidades de recursos de computação. Analisando as tendências de uso no Azure Monitor, você percebe que esses nós são usados apenas em horários específicos e não de maneira econômica. O serviço de processamento em lotes é sem estado e não salva nenhum dado de sessão do cliente. Você percebe que pode economizar dinheiro das seguintes maneiras:

  • Usando instâncias de nó de menor custo.
  • Dimensionando automaticamente a contagem de nós no pool de nós configurado para processamento em lotes.

Vamos examinar a infraestrutura que está por trás dessa solução que reduz custos no AKS.

O que é uma VM spot (máquina virtual spot) no Azure?

Uma máquina virtual spot é uma VM que permite acesso à capacidade de computação não utilizada do Azure mediante descontos significativos. As VMs spot substituem as VMs de baixa prioridade existentes no Azure. Você pode usar as VMs spot para executar cargas de trabalho que incluem:

  • Cenários de computação de alto desempenho, processamento em lotes ou aplicativos de renderização visual.

  • Aplicativos sem estado de grande escala.

  • Ambientes de desenvolvimento/teste, incluindo cargas de trabalho de CI (integração contínua) e CD (entrega contínua).

Disponibilidade da VM spot

A disponibilidade da VM spot depende de fatores como capacidade, tamanho, região e hora do dia. O Azure alocará VMs somente se houver capacidade disponível. Como resultado, não há nenhum SLA (contrato de nível de serviço) para esses tipos de VMs e eles não oferecem garantias de alta disponibilidade.

Política de remoção de VM spot

A política de remoção padrão de VMs spot é Desalocar. O Azure irá expulsar as VMs spot mediante um aviso prévio de 30 segundos quando a capacidade em uma região se tornar limitada. Uma VM definida com a política Desalocar passa para o estado Parado-Desalocado quando removida. Você pode reimplantar uma VM removida quando a capacidade do spot ficar disponível novamente. Uma VM desalocada continua sendo contabilizada na sua cota de vCPU (CPU virtual) spot e os preços referentes aos discos alocados subjacentes ainda se aplicam.

O que é um conjunto de dimensionamento de máquinas virtuais spot?

Um conjunto de dimensionamento de máquinas virtuais spot são conjuntos de dimensionamento de máquinas virtuais compatíveis com as VMs spot do Azure. Essas VMs se comportam da mesma forma que as VMs spot normais, mas com uma diferença: ao usar a compatibilidade com o conjunto de dimensionamento de máquinas virtuais para VMs spot no Azure, você escolhe entre duas políticas de remoção:

  • Desalocar: A política Desalocar funciona exatamente como descrito anteriormente.

  • Excluir: com a política Excluir, é possível evitar que sejam gerados custos de discos e que os limites de cota sejam atingidos. Com a política de remoção Excluir, as VMs removidas são excluídas juntamente com os discos subjacentes. O recurso de dimensionamento automático do conjunto de dimensionamento agora pode tentar compensar automaticamente a remoção da VM criando novas VMs. Embora a criação de VMs não seja garantida, as VMs removidas não são contabilizadas na cota de vCPU e nem incorrem em custos referentes aos discos subjacentes.

    A melhor prática é usar o recurso de dimensionamento automático apenas quando você define a política de remoção como Excluir no conjunto de dimensionamento.

O que é um pool de nós spot no AKS (Serviço de Kubernetes do Azure)?

Um pool de nós spot é um pool de nós de usuário que usa um conjunto de dimensionamento de máquinas virtuais spot. O AKS é compatível com VMs spot quando você:

  • Precisa criar pools de nós de usuário.
  • Deseja aproveitar os benefícios de custo oferecidos pela compatibilidade do conjunto de dimensionamento de máquinas virtuais com as VMs spot do Azure.

Use os pools de nós spot para:

  • Aproveitar a capacidade não utilizada no Azure.
  • Usar recursos do conjunto de dimensionamento com a política de remoção Excluir.
  • Definir o preço máximo que deseja pagar por hora.
  • Habilitar o dimensionador automático de clusters do Kubernetes do AKS recomendado ao usar pools de nós spot.

Por exemplo, para dar suporte ao serviço de processamento em lote do aplicativo de rastreamento de drones, você pode criar um pool de nós de usuário spot e habilitar o dimensionador automático de cluster. Em seguida, você pode configurar o dimensionador de pod horizontal para implantar mais serviços de processamento em lote para corresponder às demandas de recursos.

Conforme a demanda por nós aumenta, o dimensionador automático de cluster pode escalar ou reduzir verticalmente o número de nós no pool de nós spot. Caso ocorram expulsões de nós, o dimensionador automático do cluster continuará tentando escalar verticalmente o número de nós se nós adicionais ainda forem necessários.

Limitações do pool de nós spot

Antes de decidir adicionar um pool de nós do usuário spot ao cluster do AKS, considere as seguintes limitações:

  • O conjunto de dimensionamento spot subjacente é implantado somente em um domínio de falha e não oferece garantias de alta disponibilidade.
  • O cluster do AKS precisa que a compatibilidade ao pool de vários nós esteja habilitada.
  • Você só pode usar pools de nós spot como pools de nós do usuário.
  • Você não pode atualizar pools de nós spot.
  • A criação de VMs spot não é garantida. A criação de nós spot depende da capacidade e da disponibilidade de cota na região do Azure implantada no cluster.

Lembre-se de que os pools de nós spot só devem ser usados para cargas de trabalho que possam ser interrompidas.

Importante

Em algumas assinaturas, como as assinaturas de patrocínio, a capacidade de criar VMs spot e pools de nós spot é limitada. Talvez você não consiga criar um pool de nós spot para o seu cluster.

Adicionar um pool de nós spot a um cluster do AKS

Um pool de nós spot não pode ser um pool de nós do sistema de um cluster do AKS. Primeiro, você precisa criar seu cluster e, em seguida, usar o comando az aks nodepool add para adicionar um novo pool de nós de usuário.

Você definirá vários parâmetros para um novo pool de nós a fim de configurá-lo como um pool de nós spot.

Prioridade

O parâmetro --priority é definido como Regular por padrão para um novo pool de nós. Defina o valor como Spot para indicar que o novo pool que você está criando é um pool de nós spot. Esse valor não pode ser alterado após a criação.

Política de remoção

O pool de nós spot precisa usar um conjunto de dimensionamento de máquinas virtuais. Lembre-se de anteriormente que o pool de nós spot usa um conjunto de dimensionamento spot. Defina --eviction-policy como Delete para permitir que o conjunto de dimensionamento remova o nó e o disco alocado subjacente usado pelo nó. Você não pode alterar esse valor após a criação.

Você pode definir a política de remoção como Deallocate, mas quando esses nós são removidos, eles ainda contam com a cota de computação para dimensionamento ou atualização do cluster.

Preço máximo do nó spot

Os pools de nós spot permitem que você otimize seus custos ao limitar o valor máximo que está disposto a pagar por nó spot por hora. Para definir seu valor seguro, use o parâmetro --spot-max-price. Os nós spot recém-criados serão removidos quando esse valor for atingido.

Você pode definir esse valor para qualquer valor positivo de até cinco casas decimais, ou defini-lo como -1. Definir o valor --spot-max-price como -1 afeta o pool de nós das seguintes maneiras:

  • Os nós não são expulsos com base no preço do nó.
  • O custo dos novos nós se baseia no preço atual dos nós spot ou no preço de um nó padrão, o que for menor.

Por exemplo, se você definir o valor como 0,98765, o preço máximo de um nó será de US$ 0,98765 por hora. Quando o consumo do nó exceder esse valor, ele será removido.

Habilitar o dimensionador automático de cluster

Recomendamos que você habilite o dimensionador automático de cluster usando o parâmetro --enable-cluster-autoscaler. Se você não usar o dimensionador automático de cluster, correrá o risco de que a contagem de nós caia para zero no pool de nós, pois os nós serão removidos devido às restrições de capacidade do Azure.

Contagem mínima de nós

Defina a contagem mínima de nós como um valor entre 1 e 100 usando o parâmetro --min-count. É necessário ter uma contagem mínima de nós quando você habilita o dimensionador automático de cluster.

Contagem máxima de nós

Defina a contagem máxima de nós como um valor entre 1 e 100 usando o parâmetro --max-count. É necessário ter uma contagem máxima de nós quando você habilita o dimensionador automático de cluster.

Amostra de Configuração

Aqui está um exemplo de comando az aks nodepool add, que adiciona um pool de nós spot com um número máximo de 3 e mínimo de 1. Observe o uso de --enable-cluster-autoscaler para habilitar recursos do nó spot.

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

Implantar pods em pools de nós spot

Ao implantar cargas de trabalho no Kubernetes, você pode fornecer informações ao agendador para especificar quais nós as cargas de trabalho podem ou não podem executar. Você controla o agendamento da carga de trabalho configurando os taints, a tolerância ou a afinidade dos nós. Os nós spot são configurados com um rótulo específico e um taint.

O que é um taint?

Um taint é aplicado a um nó para indicar que somente pods específicos podem ser agendados nele. Os nós spot são configurados com um rótulo definido como kubernetes.azure.com/scalesetpriority:spot.

O que é tolerância?

A tolerância é uma especificação aplicada a um pod para permitir, mas não exigir, que um pod seja agendado em um nó com o taint correspondente. Os nós spot são configurados com um taint de nó definido como kubernetes.azure.com/scalesetpriority=spot:NoSchedule.

Observação

As taints e as tolerâncias não garantem que um pod será colocado em um nó específico. Por exemplo, se um nó não tiver nenhum taint, é possível que o pod com a tolerância possa ser agendado no nó não contido. Especificar uma afinidade com taints e tolerâncias pode resolver esse problema.

O que é afinidade de nó?

Você usa a afinidade de nós para descrever quais pods estão agendados em um nó. A afinidade é especificada usando rótulos definidos no nó. Por exemplo, no AKS, os pods de sistema são configurados com antiafinidade em relação aos nós spot a fim de impedir que os pods sejam agendados nesses nós.

Definir a tolerância em um arquivo de manifesto do pod

Especifique a tolerância de taint do nó criando uma entrada de dicionário tolerations no arquivo de manifesto da carga de trabalho. Nesse dicionário, você define as seguintes propriedades para cada taint de nó que a carga de trabalho precisa tolerar nesta seção:

Propriedade Descrição
key Identifica um par chave-valor de taint de nó especificado no nó. Por exemplo, em um pool de nós spot, o par chave-valor é kubernetes.azure.com/scalesetpriority:spot. A chave é kubernetes.azure.com/scalesetpriority.
operator Permite que a tolerância corresponda a um taint. O operador padrão é Equal. Você também pode especificar Exists para corresponder à tolerância. No entanto, ao usar Exists, você não especifica a propriedade a seguir (value).
value Representa a parte do valor do par chave-valor nó-taint especificado no nó. Por exemplo, em um pool de nós spot com um par chave-valor igual a kubernetes.azure.com/scalesetpriority:spot, o valor é spot.
effect Indica como o sistema lida com o agendamento de um pod. Existem três opções: NoSchedule, PreferNoSchedule e NoExecute. NoSchedule garante que o sistema não irá agendar o pod. PreferNoSchedule permite que o sistema tente não agendar o pod. NoExecute remove os pods que já estão em execução no nó afetado ou simplesmente não agenda o pod.

Definir afinidade de nó em um arquivo de manifesto de pod

A afinidade é especificada criando uma entrada affinity no arquivo de manifesto de carga de trabalho. Nesta entrada, você define as seguintes propriedades para cada rótulo de nó que uma carga de trabalho deve corresponder:

Propriedade Descrição
nodeAffinity Descreve as regras de agendamento de afinidade do nó para o pod.
requiredDuringSchedulingIgnoredDuringExecution Se os requisitos de afinidade especificados por esse campo não forem atendidos no momento do agendamento, o pod não poderá ser agendado no nó. Se os requisitos de afinidade especificados por esse campo deixarem de ser atendidos em algum momento durante a execução do pod (por exemplo, devido a uma atualização), o sistema poderá optar por tentar ou não expulsar o pod do respectivo nó.
nodeSelectorTerms Uma lista de termos do seletor de nós. Os termos retornados correspondem a qualquer um dos filtros, em vez de a todos os filtros.
matchExpressions Uma lista de requisitos do seletor de nó por rótulos de nó.
key A chave de rótulo à qual o seletor se aplica. A chave é kubernetes.azure.com/scalesetpriority
operator Representa a relação de uma chave com um conjunto de valores. Os operadores válidos são In, NotIn, Exists, DoesNotExistGt e Lt
values Representa a parte do valor do par de valores-chave do rótulo do nó especificado no nó. Em um pool de nós spot com um par chave-valor de kubernetes.azure.com/scalesetpriority:spot, o valor é spot.

Veja aqui um exemplo de uma carga de trabalho que tem tolerância e afinidade adicionadas para pools de nós spot.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  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"

Verificar seu conhecimento

1.

Suponha que você tenha um serviço sem estado que processa pedidos online e é executado em um cluster do AKS (Serviço de Kubernetes do Azure). Você decide usar pools de nós spot no cluster do AKS a fim de otimizar os custos de computação no cluster. Como adicionar pools de nós spot a um cluster do AKS?

2.

Para o serviço descrito na pergunta anterior, qual política de remoção é a opção mais econômica para configurar o pool de nós spot?

3.

Para o serviço descrito nas perguntas anteriores, como garantir que as cargas de trabalho sejam agendadas nos nós do pool de nós spot do usuário?