Configurar vários conjuntos de nós através de conjuntos de nós spot do AKS com o dimensionador automático de clusters

Concluído

O Azure fornece instâncias de Máquinas Virtuais que proporcionam escalabilidade, reduzem os custos e são ideias para carga de trabalho que podem ser interrompidas. Estas máquinas virtuais (VMs) acedem a capacidades de computação não utilizadas do Azure a preços mais baixos, mas continuam a suportar cenários de computação de elevado desempenho.

A solução de monitorização de drones da sua empresa é implementada no Azure Kubernetes Service (AKS) como muitos serviços e aplicações com contentores. Um destes serviços é um serviço de processamento em lotes que agenda percursos de voo de drones. Com o aumento repentino da base de clientes, repara que o serviço de processamento em lotes recebe um elevado número de pedidos e compila um registo de entregas pendentes. Esta situação está a causar atrasos e frustração por parte dos clientes.

O dimensionamento automático do número de réplicas de serviços de processamento em lote proporciona o processamento oportuno de pedidos. No entanto, também exige a implementação de mais nós para acompanhar as necessidades de recursos de computação. Ao analisar as tendências de utilização no Azure Monitor, percebe que estes nós só são utilizados em horas específicas e não de uma forma económica. O serviço de processamento em lotes está sem estado e não guarda os dados de sessão dos clientes. Percebe que pode economizar dinheiro ao:

  • Utilizar instâncias de nós de menor custo.
  • Dimensionar automaticamente o número de nós no conjunto de nós configurado para processamento em lotes.

Vamos analisar a infraestrutura subjacente que permite esta solução económica no AKS.

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

Uma máquina virtual spot é uma VM que lhe permite aceder a capacidades de computação não utilizadas do Azure com grandes descontos. As VMs spot substituem as VMs de baixa prioridade existentes no Azure. Pode utilizar VMs spot para executar cargas de trabalho que incluem:

  • Cenários de computação de elevado desempenho, processamento em lotes ou aplicações de composição de elementos visuais.

  • Aplicações sem estado de grande escala.

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

Disponibilidade de VMs spot

A disponibilidade de VMs spot depende de fatores como o tamanho da capacidade, a região e as horas do dia. O Azure alocará VMs apenas se a capacidade estiver disponível. Como resultado, não há contrato de nível de serviço (SLA) para esses tipos de VMs e elas não oferecem garantias de alta disponibilidade.

Política de expulsão de VMs spot

A política de expulsão predefinida das VMs spot é Desalocar. O Azure remove VMs spot com 30 segundos de aviso quando a capacidade em uma região se torna limitada. As VMs definidas com a política Desalocar passam para o estado “paradas-desalocadas” quando são expulsas. Pode voltar a implementar uma VM expulsa quando a capacidade spot voltar a estar disponível. Uma VM desalocada continua a contar para a quota da CPU virtual (vCPU) spot e os custos dos discos alocados subjacentes continuam a ser aplicados.

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

Os conjuntos de dimensionamento de máquinas virtuais spot são conjuntos de dimensionamento de máquinas virtuais que suportam VMs spot do Azure. Estas VMs comportam-se da mesma forma que as VMs spot normais, mas com uma diferença: quando utiliza o suporte de conjuntos de dimensionamento de máquinas virtuais para VMs spot no Azure, escolhe entre duas políticas de expulsão:

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

  • Excluir: a política Excluir permite evitar o custo dos discos e atingir os limites de cota. Com a política de expulsão Eliminar, as VMs expulsas são eliminadas 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 novas VMs. Embora a criação de VMs não esteja garantida, as VMs expulsas não contam para a quota da vCPU nem incorre em custos para os discos subjacentes.

    Uma melhor prática consiste em utilizar a função de dimensionamento automático apenas quando definir a política de expulsão como Eliminar no conjunto de dimensionamento.

O que é um conjunto de nós spot no Azure Kubernetes Service (AKS)?

Um conjunto de nós spot é um conjunto de nós de utilizador que utiliza um conjunto de dimensionamento de máquinas virtuais spot. O AKS suporta VMs spot quando:

  • Precisa de criar conjuntos de nós de utilizador.
  • Quer os benefícios de custos proporcionados pelo suporte do conjunto de dimensionamento de máquinas virtuais para VMs spot do Azure.

Utilize conjuntos de nós spot para:

  • Tirar partido da capacidade não utilizada no Azure.
  • Utilizar funcionalidades de conjunto de dimensionamento com a política de expulsão Eliminar.
  • Definir o preço máximo que quer pagar por hora.
  • Ativar o dimensionador automático de clusters de Kubernetes do AKS recomendado quando utilizar conjuntos 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 autoscaler de cluster. Em seguida, você pode configurar o dimensionador de pod horizontal para implantar mais serviços de processamento em lote para atender às demandas de recursos.

À medida que a necessidade de nós aumenta, o dimensionador automático de clusters pode aumentar e reduzir verticalmente o número de nós no conjunto de nós spot. Se ocorrerem remoções de nós, o autoscaler do cluster continuará tentando aumentar a contagem de nós se ainda forem necessários nós extras.

Limitações dos conjuntos de nós spot

Antes de decidir adicionar um conjunto de nós de utilizador spot ao cluster do AKS, considere as seguintes limitações:

  • O conjunto de dimensionamento spot subjacente só é implementado num único domínio de falha e não oferece garantias de elevada disponibilidade.
  • O cluster do AKS necessita que o suporte de conjuntos de nós múltiplos esteja ativado.
  • Só pode utilizar conjuntos de nós spot como conjuntos de nós de utilizador.
  • Não é possível atualizar pools de nós spot.
  • A criação de VMs spot não está garantida. A criação de nós spot depende da capacidade e da disponibilidade de quota na região do Azure implementada do cluster.

Não se esqueça de que apenas se devem utilizar conjuntos de nós spot para cargas de trabalho que podem ser interrompidas.

Importante

Em algumas subscrições, tais como nas subscrições de patrocínio, a capacidade de criar VMs spot e conjuntos de nós spot é limitada. Pode não conseguir criar um conjunto de nós spot para o cluster.

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

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

Tem de definir vários parâmetros para um novo conjunto de nós de forma a configurar este conjunto como um conjunto de nós spot.

Prioridade

O parâmetro --priority está predefinido como Regular para um novo conjunto de nós. Defina o valor como Spot para indicar que o novo conjunto que está a criar é um conjunto de nós spot. Não é possível alterar este valor após a criação.

Política de expulsão

Os conjuntos de nós spot têm de utilizar um conjunto de dimensionamento de máquinas virtuais. Lembre-se de anteriormente que o pool de nós spot usa um conjunto de escala spot. Defina --eviction-policy como Delete para permitir que o conjunto de escala remova o nó e o disco subjacente alocado que o nó usa. Não é possível 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 na sua cota de computação para dimensionar ou atualizar o cluster.

Preço máximo do nó spot

Os pools de nós spot otimizam os custos limitando o valor máximo que você está disposto a pagar por nó spot por hora. Para definir o montante de segurança, utilize o parâmetro --spot-max-price. Os nós spot recentemente criados são expulsos quando este valor é atingido.

Você pode definir esse valor como qualquer quantidade positiva até cinco casas decimais ou defini-lo como -1. A definição do valor afeta -1 o --spot-max-price pool de nós das seguintes maneiras:

  • Os nós não são removidos com base no preço do nó.
  • O custo para novos nós é baseado no preço atual para nós spot, ou o preço para um nó padrão, usando o que for menor.

Por exemplo, se você definir o valor como 0,98765, o preço máximo de um nó em USD será 0,98765 por hora. Quando o consumo do nó exceder este valor, o nó é expulso.

Ativar o dimensionador automático de clusters

Recomendamos que ative o dimensionador automático de clusters com o parâmetro --enable-cluster-autoscaler. Se não utilizar o dimensionador automático de clusters, corre o risco de a contagem de nós descer até zero no conjunto de nós porque os nós são expulsos devido a restrições de capacidade do Azure.

Número mínimo de nós

Defina o número mínimo de nós como um valor entre 1 e 100 com o parâmetro --min-count. O número mínimo de nós é necessário quando ativar o dimensionador automático de clusters.

Número máximo de nós

Defina o número máximo de nós como um valor entre 1 e 100 com o parâmetro --max-count. O número máximo de nós é necessário quando ativar o dimensionador automático de clusters.

Configuração de exemplo

Aqui está um comando de exemplo az aks nodepool add que adiciona um pool de nós spot com uma contagem máxima de 3 e contagem mínima de 1. Observe o uso de --enable-cluster-autoscaler 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

Implementar pods em conjuntos de nós spot

Ao implementar cargas de trabalho no Kubernetes, pode transmitir informações ao agendador para especificar os nós em que as cargas de trabalho podem ou não ser executadas. Controla o agendamento da carga de trabalho ao configurar taints, tolerâncias ou afinidades de nós. Os nós spot são configurados com uma etiqueta e taint específicos.

O que é um taint?

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

O que é tolerância?

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

Nota

Manchas e tolerâncias não garantem que um pod será colocado em um nó específico. Por exemplo, se um nó não tiver mancha, é possível que o pod com a tolerância seja agendado no nó não contaminado. Especificar uma afinidade com manchas e tolerâncias pode resolver esse problema.

O que é afinidade de nó?

Pode utilizar a afinidade de nós para descrever que pods estão agendados num nó. A afinidade é especificada com etiquetas definidas no nó. Por exemplo, no AKS, os pods do sistema são configurados com antiafinidade em relação a nós spot para impedir que sejam agendados nestes nós.

Definir a tolerância num ficheiro de manifesto de pod

Você especifica a tolerância de nó manchado criando uma entrada de tolerations dicionário em seu arquivo de manifesto de carga de trabalho. Neste dicionário, define as seguintes propriedades para cada taint de nó que a carga de trabalho tem de tolerar nesta secção:

Property Description
key Identifica um par chave-valor de taint de nó especificado no nó. Por exemplo, num conjunto 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 predefinido é Equal. Também pode especificar Exists para corresponder à tolerância. No entanto, ao utilizar Exists, não especifica a seguinte propriedade (value).
value Representa a parte do valor do par chave-valor node-taint especificado no nó. Por exemplo, num conjunto de nós spot com um par chave-valor kubernetes.azure.com/scalesetpriority:spot, o valor é spot.
effect Indica como o agendamento de um pod é processado no sistema. Existem três opções: NoSchedule, PreferNoSchedule e NoExecute. NoSchedule garante que o sistema não possa agendar o pod. PreferNoSchedule permite que o sistema tente não agendar o pod. NoExecute expulsa os pods já em execução no nó de taint ou não agenda o pod.

Definir afinidade de nó em um arquivo de manifesto pod

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

Property Description
nodeAffinity Descreve as regras de agendamento de afinidade de nó para o pod.
requiredDuringSchedulingIgnoredDuringExecution Se os requisitos de afinidade especificados por este 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 este 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 remover o pod de seu nó.
nodeSelectorTerms Uma lista de termos do seletor de nós. Os termos retornados correspondem a qualquer um dos filtros, em vez de todos os filtros.
matchExpressions Uma lista de requisitos do seletor de nós por rótulos do 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, DoesNotExist Gt, e Lt
values Representa a parte do valor do par chave-valor 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.

Aqui está 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"

Verifique o seu conhecimento

1.

Suponha que tem um serviço sem estado que processa encomendas online e é executado num cluster do Azure Kubernetes Service (AKS). Decide utilizar conjuntos de nós spot no cluster do AKS para otimizar os custos de computação no mesmo. Como pode adicionar conjuntos de nós spot a um cluster do AKS?

2.

Para o serviço descrito na pergunta anterior, que política de expulsão é a opção mais económica para configurar o conjunto de nós spot?

3.

Para o serviço descrito nas perguntas anteriores, como pode garantir que as cargas de trabalho são agendadas nos nós do conjunto de nós de utilizador spot?