Usar o autoscaler de clusters no Serviço de Kubernetes do Azure (AKS)

Para acompanhar as exigências das aplicações no AKS, pode ser necessário ajustar o número de nós que executam as suas cargas de trabalho. O componente de ajuste automático do cluster monitoriza os pods no seu cluster que não podem ser agendados devido a restrições de recursos. Quando o autoscaler do cluster deteta problemas, ele aumenta o número de nós no pool de nós para atender às demandas do aplicativo. Também verifica regularmente a presença de nós subutilizados e remove-os quando as cargas de trabalho podem ser reagendadas em segurança e as condições de redução de escala são cumpridas.

Este artigo mostra como habilitar e gerenciar o autoscaler de cluster no AKS, que é baseado na versão de código aberto do Kubernetes.

Antes de começar

Este artigo requer a CLI do Azure versão 2.0.76 ou posterior. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, consulte Install CLI do Azure.

Ative ou desative o escalador automático num cluster

Importante

O autoscaler de cluster é um componente do Kubernetes. Embora o cluster AKS utilize Conjuntos de Dimensionamento de Máquinas Virtuais para os nós, não ative nem edite manualmente definições para o autoscaling de conjuntos de escala. Permita que o autoscaler do cluster Kubernetes gerencie as configurações de escala necessárias. Para obter mais informações, consulte Posso modificar os recursos do AKS no grupo de recursos do nó?

Habilitar o autoscaler de cluster em um novo cluster

  1. Crie um grupo de recursos usando o comando az group create.

    az group create --name myResourceGroup --location eastus
    
  2. Crie um cluster AKS usando o comando az aks create e ative e configure a escala automática do cluster no pool de nós para o cluster usando o parâmetro --enable-cluster-autoscaler e especificando um nó --min-count e --max-count. O seguinte comando de exemplo cria um cluster com um único nó apoiado por um Conjunto de Escala de Máquina Virtual, ativa o autoescalonador do cluster, define um mínimo de um e um máximo de três nós:

    az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-count 1 \
    --vm-set-type VirtualMachineScaleSets \
    --load-balancer-sku standard \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3 \
    --generate-ssh-keys
    

    Leva alguns minutos para criar o cluster e definir as configurações do autoscaler do cluster.

Habilitar o autodimensionador de cluster em um cluster existente

Atualize um cluster existente utilizando o comando az aks update e ative e configure o autoscaler do cluster no pool de nós com o parâmetro --enable-cluster-autoscaler e especificando um nó --min-count e --max-count. O comando de exemplo a seguir atualiza um cluster AKS existente para habilitar o autoscaler de cluster no pool de nós para o cluster e define um mínimo de um e máximo de três nós:

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3

Leva alguns minutos para atualizar o cluster e definir as configurações do autoscaler do cluster.

Desabilitar o autoscaler de cluster em um cluster

Desative o autoscaler do cluster usando o az aks update comando e o --disable-cluster-autoscaler parâmetro.

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --disable-cluster-autoscaler

Os nós não são removidos quando o autoscaler do cluster está desativado.

Observação

Você pode dimensionar manualmente o cluster depois de desabilitar o autoscaler do cluster usando o comando az aks scale. Se você usar o pod autoscaler horizontal, ele continuará a ser executado com o autoscaler de cluster desativado, mas os pods podem acabar não podendo ser agendados se todos os recursos do nó estiverem em uso.

Reativar o autodimensionador de cluster em um cluster

Você pode reativar o autodimensionador de cluster em um cluster existente usando o comando az aks update e especificando os parâmetros --enable-cluster-autoscaler, --min-count e --max-count.

Ativar ou desativar o autoscaler do cluster nos pools de nós

Usar o escalador automático de clusters em vários pools de nós

Você pode usar o escalador automático de clusters com vários pools de nós e pode habilitar o escalador automático de clusters em cada pool de nós individual e atribuir-lhes regras únicas de escalonamento automático.

Atualize as configurações em um pool de nós existente usando o az aks nodepool update comando.

az aks nodepool update \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name nodepool1 \
    --update-cluster-autoscaler \
    --min-count 1 \
    --max-count 5

Desabilitar o autoscaler de cluster em um pool de nós

Desative o autoescalador de cluster num agrupamento de nós usando o comando az aks nodepool update e o parâmetro --disable-cluster-autoscaler.

az aks nodepool update \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name nodepool1 \
    --disable-cluster-autoscaler

Reativar o escalador automático de cluster num pool de nós

Você pode reativar o autoscaler de cluster em um conjunto de nós usando o comando az aks nodepool update e especificando os parâmetros --enable-cluster-autoscaler, --min-count e --max-count.

Observação

Se você planeja usar o autoscaler de cluster com pools de nós que abrangem várias zonas e aproveitam os recursos de agendamento relacionados a zonas, como agendamento topológico de volume, recomendamos que você tenha um pool de nós por zona e habilite --balance-similar-node-groups por meio do perfil autoscaler. Isso garante que o autoscaler possa aumentar com êxito e manter os tamanhos dos pools de nós equilibrados.

Atualizar as configurações do autoscaler do cluster

À medida que seu aplicativo exige mudanças, talvez seja necessário ajustar a contagem de nós do autoscaler do cluster para dimensioná-la de forma eficiente.

Altere a contagem de nós usando o comando az aks update e atualize o autoscaler do cluster usando o parâmetro --update-cluster-autoscaler, especificando o seu nó atualizado --min-count e --max-count.

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --update-cluster-autoscaler \
    --min-count 1 \
    --max-count 5

Observação

O autoscaler de cluster impõe a contagem mínima nos casos em que a contagem real cai abaixo do mínimo devido a fatores externos, como durante uma remoção pontual ou ao alterar o valor mínimo de contagem da API AKS.

Utilize o perfil do autoscaler do cluster

Você pode configurar detalhes mais granulares do autoscaler de cluster alterando os valores padrão no perfil de autoscaler em todo o cluster. Por exemplo, um evento de redução de escala acontece depois que os nós são subutilizados após 10 minutos. Se você tiver cargas de trabalho executadas a cada 15 minutos, convém alterar o perfil do autoscaler para reduzir os nós subutilizados após 15 ou 20 minutos. Quando você habilita o dimensionador automático de cluster, um perfil padrão é usado, a menos que você especifique configurações diferentes.

Importante

O perfil do autoscaler de cluster afeta todos os pools de nós que usam o autoscaler de cluster. Não é possível definir um perfil de escalonamento automático por pool de nós. Quando você define o perfil, todos os pools de nós existentes com o autoscaler de cluster habilitado começam imediatamente a usar o perfil.

Configurações de perfil do cluster autoscaler

A tabela a seguir lista as configurações disponíveis para o perfil do autoscaler do cluster:

Configurações Descrição Valor predefinido
scan-interval Com que frequência o cluster é reavaliado para aumentar ou diminuir a escala. 10 segundos
scale-down-delay-after-add Quanto tempo após escalar para cima é retomada a avaliação de redução de escala. 10 minutos
scale-down-delay-after-delete Quanto tempo após a exclusão do nó a avaliação de redução é retomada. scan-interval
scale-down-delay-after-failure Quanto tempo depois da falha de redução de escala essa avaliação de redução é retomada. Três minutos
scale-down-unneeded-time Por quanto tempo um nó deve permanecer desnecessário antes de ser elegível para diminuição de escala. 10 minutos
scale-down-unready-time Por quanto tempo um nó não pronto deve permanecer desnecessário antes de ser elegível para redução de escala. 20 minutos
ignore-daemonsets-utilization Se os pods DaemonSet serão ignorados ao calcular a utilização de recursos para redução de escala. false
daemonset-eviction-for-empty-nodes Se os pods DaemonSet serão terminados graciosamente a partir de nós vazios. false
daemonset-eviction-for-occupied-nodes Se os pods DaemonSet serão terminados graciosamente a partir de nós não vazios. true
scale-down-utilization-threshold O valor máximo entre a soma dos pedidos da CPU e a soma dos pedidos de memória de todos os pods a correr no nó dividido pelo recurso alocável correspondente do nó, abaixo do qual um nó pode ser considerado para redução de escala. 0,5
max-graceful-termination-sec Número máximo de segundos que o autoscaler do cluster aguarda para que o pod seja encerrado ao tentar diminuir o tamanho de um nó. 600 segundos
balance-similar-node-groups Detecta agrupamentos de nós semelhantes e equilibra o número de nós entre eles. false
expander Tipo de pool de nós que o expansor usa no aumento de escala. Os valores possíveis incluem most-pods, random, least-waste, e priority. random
skip-nodes-with-local-storage Se true o autoscaler do cluster não excluir nós que tenham pods com armazenamento local, por exemplo, EmptyDir ou HostPath. false
skip-nodes-with-system-pods Se trueo autoscaler de cluster não excluir nós com pods do kube-system (exceto DaemonSet ou mirror pods). true
max-empty-bulk-delete Número máximo de nós vazios que podem ser excluídos ao mesmo tempo. 10 nós
new-pod-scale-up-delay Para cenários como burst/batch scale, em que não se deseja que o Cluster Autoscaler (CA) aja antes que o agendador do Kubernetes possa agendar todos os pods, é possível configurar a CA para ignorar pods não agendados anteriormente a estes atingirem uma certa idade. 0 segundos
max-total-unready-percentage Percentagem máxima de nós não prontos no cluster. Depois que esse percentual é excedido, a autoridade de certificação interrompe as operações. 45%
max-node-provision-time Tempo máximo que o autoscaler aguarda que um nó seja provisionado. 15 minutos
ok-total-unready-count Número de nós não prontos permitidos, independentemente da percentagem máxima total de não prontos. Três nós

Observação

Os parâmetros ignore-daemonsets-utilization, daemonset-eviction-for-empty-nodes e daemonset-eviction-for-occupied-nodes estão em Disponibilidade Geral (GA) a partir da versão 2024-05-01 da API.

Definir o perfil do autoscaler do cluster num novo cluster

Crie um cluster AKS usando o az aks create comando e defina o perfil do autoscaler do cluster usando o cluster-autoscaler-profile parâmetro.

az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-count 1 \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3 \
    --cluster-autoscaler-profile scan-interval=30s \
    --generate-ssh-keys

Definir o perfil do autoscaler do cluster em um cluster existente

Defina o autoscaler de cluster em um cluster existente usando o az aks update comando e o cluster-autoscaler-profile parâmetro. O exemplo a seguir define a configuração do intervalo de varredura como 30s:

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --cluster-autoscaler-profile scan-interval=30s

Configurar o perfil do escalonador automático do cluster para redução agressiva

Observação

A redução agressiva não é recomendada para clusters que experimentam escalonamentos expansivos e retrativos frequentes em intervalos curtos, pois isso poderia resultar em tempos prolongados de aprovisionamento de nós nessas circunstâncias. Aumentar scale-down-delay-after-add pode ajudar nessas circunstâncias, mantendo o nó por mais tempo para lidar com cargas de trabalho de entrada.

O comando seguinte configura um perfil agressivo de redução de escala. Varre o cluster a cada 30 segundos, retoma a avaliação de redução imediatamente após a adição de um nó e um minuto após uma falha, torna os nós desnecessários e não prontos elegíveis para redução após três minutos, limita a terminação graciosa a 30 segundos, permite eliminar até 1.000 nós vazios de uma só vez e eleva os limites de nós não prontos para 100 por cento ou 1.000 nós. Também preserva explicitamente o comportamento predefinido de não ignorar nós com armazenamento local e de esperar até 15 minutos até um nó ser provisionado.

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --cluster-autoscaler-profile scan-interval=30s,scale-down-delay-after-add=0m,scale-down-delay-after-failure=1m,scale-down-unneeded-time=3m,scale-down-unready-time=3m,max-graceful-termination-sec=30,skip-nodes-with-local-storage=false,max-empty-bulk-delete=1000,max-total-unready-percentage=100,ok-total-unready-count=1000,max-node-provision-time=15m

Configurar o perfil do autoscaler de cluster para cargas de trabalho intermitentes

O comando seguinte configura um perfil para cargas de trabalho em rajadas. Analisa o cluster a cada 20 segundos, suspende a avaliação da redução de escala durante 10 minutos após a adição de um nó para manter capacidade para picos súbitos de carga, retoma a avaliação um minuto após uma falha, torna os nós desnecessários e não operacionais elegíveis para redução de escala após cinco minutos, limita a terminação graciosa a 30 segundos, permite que até 100 nós vazios sejam eliminados de uma só vez e eleva os limites dos nós não operacionais para 100 por cento ou 1.000 nós. Também preserva explicitamente o comportamento predefinido de não ignorar nós com armazenamento local e de esperar até 15 minutos até um nó ser provisionado.

az aks update \
    --resource-group "myResourceGroup" \
    --name myAKSCluster \
    --cluster-autoscaler-profile scan-interval=20s,scale-down-delay-after-add=10m,scale-down-delay-after-failure=1m,scale-down-unneeded-time=5m,scale-down-unready-time=5m,max-graceful-termination-sec=30,skip-nodes-with-local-storage=false,max-empty-bulk-delete=100,max-total-unready-percentage=100,ok-total-unready-count=1000,max-node-provision-time=15m

Redefinir o perfil do autoscaler do cluster para valores padrão

Redefina o perfil do autoscaler do cluster usando o az aks update comando.

az aks update \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --cluster-autoscaler-profile ""

Utilize o ProvisioningRequest com o escalador automático do cluster

ProvisioningRequest é um recurso personalizado que podes usar para solicitar recursos para um grupo de pods relacionados. O escalador automático do cluster trata estes pods como uma única unidade. Com base na classe de provisionamento que especificar, o autoescalador do cluster pode reservar recursos existentes para os pods ou aumentar a escala do cluster.

Observação

  • ProvisioningRequest o suporte requer um cluster AKS a correr Kubernetes versão 1.33 ou posterior.
  • Considere usar um perfil agressivo de redução ao usar ProvisioningRequest, para que os nós não utilizados de aumentos de escala parciais ou não concretizados sejam removidos rapidamente.
Classe de aprovisionamento Descrição
check-capacity.autoscaling.x-k8s.io Verifica se o cluster tem recursos suficientes para os pods especificados. Se os recursos estiverem disponíveis, o autoscaler do cluster reserva-os para o ProvisioningRequest durante 10 minutos, para evitar que outros ProvisioningRequests reservem os mesmos recursos.
best-effort-atomic-scale-up.autoscaling.x-k8s.io O autoscalador do cluster tenta, na medida do possível, aprovisionar a totalidade dos recursos solicitados numa única operação de expansão. Se não conseguir aprovisionar tudo, o ProvisioningRequest falha, e o autoescalador do cluster tenta novamente após um período de back-off.

Para um exemplo de ponta a ponta que demonstre a integração do Kueue com o autoscaler do cluster e ProvisioningRequest, veja Usar Kueue gerido com o autoscaler do cluster no AKS.

Recuperar registos e estado do autoscaler do cluster

Você pode recuperar logs e atualizações de status do autoscaler do cluster para ajudar a diagnosticar e depurar eventos do autoscaler. O AKS gerencia o autoscaler do cluster em seu nome e o executa no plano de controle gerenciado. Para recolher os registos do plano de controlo, crie uma definição de diagnóstico do Azure Monitor para o cluster AKS no portal do Azure ou utilize az monitor diagnostic-settings create e ative a categoria de registo cluster-autoscaler.

  1. Configure uma regra de registos de recursos para enviar os registos do dimensionador automático de clusters para o Log Analytics, utilizando as instruções Configurar a recolha de registos de recursos para o plano de controlo do AKS. Certifique-se de marcar a caixa correspondente a cluster-autoscaler ao selecionar opções de Logs.

  2. Selecione a secção de Registos no seu cluster.

  3. Se as suas definições de diagnóstico utilizarem o modo de diagnóstico Azure, introduza a seguinte consulta no Log Analytics:

    AzureDiagnostics
    | where Category == "cluster-autoscaler"
    

    Se as suas definições de diagnóstico usarem o modo específico de um recurso, introduza a seguinte consulta:

    AKSControlPlane
    | where Category == "cluster-autoscaler"
    
  4. Visualize eventos de escalonamento automático de cluster não acionados na CLI.

    kubectl get events --field-selector source=cluster-autoscaler,reason=NotTriggerScaleUp
    
  5. Exiba eventos de aviso de alerta do autoscaler de cluster na interface da linha de comandos.

    kubectl get events --field-selector source=cluster-autoscaler,type=Warning
    
  6. O autoscaler de cluster também regista o estado de saúde em um configmap arquivo cluster-autoscaler-status. Pode obter este estado usando o seguinte kubectl comando:

    kubectl get configmap -n kube-system cluster-autoscaler-status -o yaml
    

Para obter mais informações, consulte as Perguntas frequentes sobre o projeto Kubernetes/autoscaler GitHub.

Métricas do escalador automático de clusters

Pode usar as métricas do plano de controlo (Preview) com o serviço gerido do Azure Monitor para Prometheus para recolher métricas do dimensionador automático do cluster. O controlplane-cluster-autoscaler alvo de raspagem está desativado por defeito, por isso tens de o ativar para recolher estas métricas.

As métricas disponíveis incluem cluster_autoscaler_unschedulable_pods_count e cluster_autoscaler_unneeded_nodes_count, que mostram o número de pods que não podem ser programados e de nós marcados como candidatos à remoção. Também pode monitorizar se é seguro aumentar ou diminuir automaticamente a escala do cluster com cluster_autoscaler_cluster_safe_to_autoscale e se a redução da escala está num período de arrefecimento com cluster_autoscaler_scale_down_in_cooldown.

Este artigo mostrou como dimensionar automaticamente o número de nós AKS. Você também pode usar o autoscaler horizontal de pods para ajustar automaticamente o número de pods que executam o seu aplicativo. Para conhecer as etapas de uso do autoscaler de pod horizontal, consulte Dimensionar aplicações no AKS.

Para ajudar ainda mais a melhorar a utilização de recursos de cluster e liberar CPU e memória para outros pods, consulte Vertical Pod Autoscaler.