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

Para acompanhar as demandas de aplicativos no AKS, talvez seja necessário ajustar o número de nós que executam suas cargas de trabalho. O componente autoscaler do cluster procura pods no 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. Ele também verifica regularmente os nós quanto à falta de pods em execução e reduz o número de nós conforme necessário.

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, veja Install Azure CLI (Instalar o Azure CLI).

Usar o autoscaler de cluster em um cluster AKS

Importante

O autoscaler de cluster é um componente do Kubernetes. Embora o cluster AKS use um conjunto de escala de máquina virtual para os nós, não habilite ou edite manualmente as configurações para o dimensionamento automático do conjunto de escalas. 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 az group create comando.

    az group create --name myResourceGroup --location eastus
    
  2. Crie um cluster AKS usando o az aks create comando e habilite e configure o autoscaler do cluster no pool de nós para o cluster usando o --enable-cluster-autoscaler parâmetro e especificando um nó --min-count e --max-count. O comando de exemplo a seguir cria um cluster com um único nó apoiado por um conjunto de escala de máquina virtual, habilita o autoscaler do cluster, define um mínimo de um e 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
    

    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 usando o az aks update comando e habilite e configure o autoscaler do cluster no pool de nós usando o --enable-cluster-autoscaler parâmetro 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.

Nota

Você pode dimensionar manualmente o cluster depois de desativar o autoscaler do cluster usando o az aks scale comando. 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 az aks update comando e especificando os --enable-cluster-autoscalerparâmetros , --min-counte --max-count .

Usar o autoscaler de cluster em pools de nós

Usar o autoscaler de cluster em vários pools de nós

Você pode usar o autoscaler de cluster com vários pools de nós e pode habilitar o autoscaler de cluster em cada pool de nós individuais e passar regras de dimensionamento automático exclusivas para eles.

  • 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 autoscaler de cluster em um pool de nós usando o az aks nodepool update comando e o --disable-cluster-autoscaler parâmetro.

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

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

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

Nota

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 az aks update comando e atualize o autoscaler do cluster usando o --update-cluster-autoscaler parâmetro e especificando seu nó --min-count atualizado e --max-count.

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

Nota

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.

Usar 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 autoscaler de cluster

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

Definição Descrição Default value
scan-interval Com que frequência o cluster é reavaliado para aumentar ou diminuir a escala. 10 segundos
scale-down-delay-after-add Quanto tempo depois de aumentar essa escala para baixo a avaliação é retomada. 10 minutos
scale-down-delay-after-delete Quanto tempo após a exclusão do nó que reduz a avaliaçã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 ser desnecessário antes de ser elegível para redução. 10 minutos
scale-down-unready-time Por quanto tempo um nó despronto deve ser desnecessário antes de ser elegível para redução. 20 minutos
ignore-daemonsets-utilization (Pré-visualização) 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 (Pré-visualização) Se os pods DaemonSet serão terminados graciosamente a partir de nós vazios. false
daemonset-eviction-for-occupied-nodes (Pré-visualização) Se os pods DaemonSet serão terminados graciosamente a partir de nós não vazios. true
scale-down-utilization-threshold Nível de utilização do nó, definido como a soma dos recursos solicitados divididos pela capacidade, na 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 o encerramento do pod ao tentar reduzir a escala de um nó. 600 segundos
balance-similar-node-groups Deteta pools de nós semelhantes e equilibra o número de nós entre eles. false
expander Tipo de expansor de pool de nós usado no aumento de escala. Os valores possíveis incluem most-pods, random, least-waste, e priority. random
skip-nodes-with-local-storage Se trueo autoscaler do cluster não excluir nós com 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 você não quer que a CA aja antes que o agendador do Kubernetes possa agendar todos os pods, você pode dizer à CA para ignorar pods não programados antes que eles atinjam uma certa idade. 0 segundos
max-total-unready-percentage Porcentagem máxima de nós desprontos 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-despronto. Três nós

Definir o perfil do autoscaler do cluster em um 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
    

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 autoscaler de cluster para redução agressiva

Nota

A redução agressiva não é recomendada para clusters que experimentam scale-outs e scale-ins frequentes em intervalos curtos, pois isso poderia resultar em tempos de provisionamento de nó estendidos 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.

 az aks update \
     --resource-group myResourceGroup \
     --name myAKSCluster \
     --cluster-autoscaler-profile scan-interval=30s, scale-down-delay-after-add=0s,scale-down-delay-after-failure=30s,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

 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 ""
    

Recuperar logs e status 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. Você pode habilitar o nó do plano de controle para ver os logs e as operações do autoscaler do cluster.

  1. Configure uma regra para que os logs de recursos enviem os logs do autoscaler do cluster para o Log Analytics usando as instruções aqui. Certifique-se de marcar a caixa ao selecionar opções para cluster-autoscalerLogs.

  2. Selecione a seção Log no cluster.

  3. Insira o seguinte exemplo de consulta no Log Analytics:

    AzureDiagnostics
    | where Category == "cluster-autoscaler"
    

    Contanto que haja logs para recuperar, você verá logs semelhantes aos seguintes logs:

    Captura de ecrã dos registos do Log Analytics.

  4. Exibir eventos de escalonamento automático do cluster não acionados na CLI

    kubectl get events --field-selector source=cluster-autoscaler,reason=NotTriggerScaleUp
    
  5. Exibir eventos de aviso do autoscaler de cluster na CLI

    kubectl get events --field-selector source=cluster-autoscaler,type=Warning
    
  6. O autoscaler de cluster também grava o status de integridade em um configmap arquivo cluster-autoscaler-status. Você pode recuperar esses logs 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 Autoscaler de Cluster

Você pode habilitar as métricas do plano de controle (Visualização) para ver os logs e as operações do autoscaler de cluster com o complemento Azure Monitor managed service for Prometheus

Próximos passos

Este artigo mostrou como dimensionar automaticamente o número de nós AKS. Você também pode usar o autoscaler pod horizontal para ajustar automaticamente o número de pods que executam seu aplicativo. Para conhecer as etapas de uso do autoscaler de pod horizontal, consulte Dimensionar aplicativos 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.