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 frustrando os clientes.

O dimensionamento automático do número de réplicas do serviço de processamento em lotes permite o processamento oportuno de pedidos. 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á SLA (Contrato de Nível de Serviço) para esses tipos de VMs e elas não oferecem garantia 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 removerá as VMs spot mediante um aviso prévio de 30 segundos quando a capacidade em uma região ficar 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 de VMs criando outras 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 proporcionar compatibilidade com o serviço de processamento em lotes do aplicativo de acompanhamento de drones, você pode criar um pool de nós do usuário spot e habilitar o dimensionador automático de clusters. Em seguida, você configura o dimensionador de pod horizontal para implantar serviços de processamento em lotes adicionais a fim de atender à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 remoções de nós, o dimensionador automático de cluster continuará tentando escalar verticalmente a contagem de nós se ainda forem necessários nós adicionais.

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.
  • Os pools de nós spot não podem ser atualizados.
  • 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.

Criar um pool de nós spot

Os pools de nós spot estão em versão prévia no momento em que este módulo está sendo escrito. Para concluir a configuração do pool de nós spot, você precisará habilitar a versão prévia do recurso no provedor de recursos Microsoft.ContainerService e instalar a extensão da CLI aks-preview.

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.

Habilitar versão prévia dos recursos na sua assinatura

Para usar os pools de nós spot, você precisa habilitar o recurso spotpoolpreview na sua assinatura e fornecer o conjunto mais recente de aprimoramentos de serviço ao configurar um cluster.

Cuidado

Depois que você habilitar a versão prévia de alguns recursos no Azure, os padrões poderão ser usados para todos os clusters do AKS criados na assinatura. Teste a versão prévia dos recursos em assinaturas que não sejam de produção a fim de evitar efeitos colaterais imprevistos nas implantações de produção.

Para registrar o recurso spotpoolpreview:

  1. Use o comando az feature register para registrar o recurso spotpoolpreview. Esse comando usa dois parâmetros: o namespace (que identifica o provedor de recursos com o qual você está registrando o recurso) e o nome (que identifica o recurso, em si).

    Registre o recurso spotpoolpreview com o provedor de recursos Serviço de Contêiner da Microsoft.

    O provedor de recursos Serviço de Contêiner da Microsoft habilita ações que afetam o gerenciamento de um cluster do AKS. Exemplos de ações incluem a criação, a atualização e a exclusão de serviços de contêiner ou a leitura de detalhes sobre eles.

    Aqui está um exemplo do comando az feature register para registrar o recurso spotpoolpreview:

    az feature register --namespace "Microsoft.ContainerService" --name "spotpoolpreview"
    
  2. O registro do provedor de recursos exige uma atualização quando o recurso é registrado. Para verificar o status do registro, consulte a lista de recursos dos provedor de recursos. A consulta az feature list retorna o valor Registrado após a conclusão. Aqui está um exemplo do comando de consulta:

    az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/spotpoolpreview')].{Name:name,State:properties.state}"
    
  3. Quando o recurso é registrado, a última etapa é a propagação do novo registro. Execute o comando az provider register com o parâmetro --namespace, especificando o mesmo provedor de recursos indicado anteriormente. Aqui está um exemplo do comando az provider register.

    az provider register --namespace Microsoft.ContainerService
    

Instalar a extensão da CLI aks-preview

Os parâmetros de comando do pool de nós spot do AKS estão disponíveis apenas na extensão da CLI aks-preview. Sem a extensão instalada, você não poderá usar a versão prévia dos recursos.

Você pode executar os comandos a seguir para instalar a extensão ou, se ela já estiver instalada, para verificar sua versão e atualizá-la.

Se a extensão ainda não estiver instalada, execute este comando para instalá-la:

az extension add --name aks-preview

Você deve instalar a extensão da CLI aks-preview versão 0.4.53 ou posterior para criar um cluster do AKS que use pools de nós spot. Verifique a versão da extensão que está instalada se você já tiver instalado a versão prévia. Para consultar a versão da extensão, execute o comando az extension show:

az extension show --name aks-preview --query [version]

Se você tiver instalado a extensão anteriormente e precisar atualizá-la para uma versão mais recente, execute o comando az extension update:

az extension update --name aks-preview

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ê criará o cluster e 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 que discutimos 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ó. Esse valor não pode ser alterado após a criação.

Você pode definir a política de remoção como Deallocate. No entanto, quando removidos, esses nós serão contabilizados na cota de computação e afetarão o dimensionamento ou a atualização posterior do cluster.

Preço máximo do nó spot

Os pools de nós spot permitem que você otimize os custos definindo 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 com qualquer valor positivo de até cinco casas decimais ou defini-lo como -1. A definição do valor de --spot-max-price como -1 afeta o pool de nós das seguintes maneiras:

  • Os nós não serão removidos com base no preço do nó.
  • O custo dos novos nós corresponderá ao preço atual dos nós spot ou ao 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.

Aqui está um exemplo do comando az aks nodepool add que adiciona um pool de nós spot. Observe o uso dos parâmetros adicionais para habilitar os 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 um taint, é possível que o pod com tolerância possa ser agendado no nó sem taint. 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

Você especifica 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 de taint de nó 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 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 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á ou não tentar eventualmente remover o pod de seu nó.
nodeSelectorTerms Uma lista de termos do seletor de nós. Os termos são OR em vez de AND.
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?