O objetivo desse post é abordar o uso do Cluster Autoscaler e sua relação com o Horizontal POD Autoscaler (HPA), Kube-scheduler e cloud-controller-manager.

Ao criar um cluster Kubernetes em uma plataforma de nuvem, a configuração inicial muitas vezes não inclui várias ferramentas importantes, como o Cluster Autoscaler e o metric-server. E não fazer isso há impactos diretos nos custos. Porém não basta só adicionar, é necessário também configurar o HPA. Entender como o HPA e o Cluster Autoscaler trabalham juntos é crucial, pois é a partir dos outputs gerados pelo HPA que o Cluster Autoscaler faz o trabalho dele.

Horizontal POD Autoscaler

O HPA ajusta automaticamente o número de réplicas de um POD que está sendo controlado por algum controller (geralmente o Deployment). O HPA vai analisar as métricas dos PODs em intervalos regulares, calculando o número de réplicas necessário de acordo com a métrica configurada (CPU, memória etc). Se ele identificar que é necessário ajustar o número de réplicas, vai ajustar o campo Replicas no recurso, seja ele um Deployment, ReplicaSet ou ReplicationController.

Entendendo o processo por debaixo do capô

O processo do HPA PODe ser dividido em três etapas:

  1. Obter as métricas de todos os PODs.
  2. Calcular o número de PODs necessário.
  3. Atualizar o campo de réplicas do controller.

O HPA não realiza por si só a coleta de métricas dos PODs. Ele obtém de uma outra fonte.

As métricas dos PODs e do node são coletadas por um componente chamado cAdvisor (Container advisor), é um agente do Kubelet. Lembrando que todo Worker Node do cluster possui um Kubelet rodando. Esses dados do cAdvisor são coletados por um outro componente, o metric-server (Antigo Heapster).

O HPA, por sua vez, faz uma consulta ao metric-server, por meio de chamadas REST, e obtem as métricas dos PODs do qual ele está monitorando. Uma vez em posse dessas métricas ele faz alguns cálculos para para determinar o número necessário de réplicas. Nesse momento entra em ação o Kube-scheduler, um outro componente do Kubernetes, que vai buscar um Node para agendar esse novo POD.

Cluster Autoscaler

O Cluster Autoscaler é uma ferramenta fundamental para o dimensionamento automático dos NODES em um cluster Kubernetes. Enquanto o Horizontal POD Autoscaler (HPA) foca no escalonamento dos PODS, o Cluster Autoscaler tem a responsabilidade de ajustar a quantidade de NODES. E é necessário entender a interdependência entre o HPA e o Cluster Autoscaler, pois o correto funcionamento de um, depende do outro.

Quando o HPA aumenta o número de PODs para atender à demanda, PODe ocorrer uma situação em que o kube-scheduler não encontra um Node com recursos suficientes, como CPU e memória, para hospedar a nova réplica. Nesse cenário, surge a seguinte mensagem de erro:

0/3 nodes are available: 3 Insufficient cpu, 3 Insufficient memory.

É neste ponto que o Cluster Autoscaler entra em ação. Ele detecta a falta de recursos e, baseado em suas configurações, inicia o processo para adicionar um novo Node ao cluster. Então, por debaixo do capô o cloud-controller-manager vai se comunicar com o provedor de nuvem (Azure ou AWS), iniciando o processo de provisionamento de um novo Node.

Dessa forma, o Cluster Autoscaler garante que o cluster sempre tenha recursos suficientes para atender às necessidades dos PODs, otimizando tanto o desempenho quanto a eficiência de custos. Além disso, ele também PODe remover Nodes desnecessários durante períodos de baixa demanda, contribuindo para uma gestão de recursos mais eficiente e econômica.

Definição de Resources e o uso do HPA

No Kubernetes, o comportamento de uma aplicação é definido por meio de manifestos. Para que o autoscaling, tanto de Nodes quanto de PODs, funcione adequadamente, é essencial configurar o Deployment ou ReplicaSet com valores apropriados de CPU e Memória na seção Resources, setando valores de Requests e Limits.

Requests e Limits são especificações que determinam a quantidade de recursos que um POD precisa. Enquanto Requests especifica o mínimo de recursos garantidos pelo Kubernetes para o POD, Limits estabelece o teto de recursos que o POD PODe utilizar. Essas definições não só otimizam o uso de recursos, mas também são fundamentais para o funcionamento eficiente do HPA, que baseia suas decisões de scaling nessas informações. Consequentemente, o Cluster Autoscaler também depende desses dados para sua operação.

É muito importante configurar corretamente os valores de CPU e memória. Nesse exemplo se sua aplicação utilizar mais que 150Mi de memória por padrão, o primeiro impacto é que eventualmente PODe ocorrer throttling. Segundo que isso vai impactar no uso do HPA, bem como haverá impacto no Cluster Autoscaler.

Conclusão

Ao criar um cluster, não basta adicionar o Cluster Autoscaler, configurar o HPA e incluir um metric-server. Estes itens são cruciais, mas tudo começa com a definição correta de CPU e Memória para cada aplicação.

É um tanto comum ver a configuração inadequada desses valores, algumas vezes até estabelecidas por padrão em um Chart Helm, e isso com certeza vai ser um obstáculo para o autoscaling eficiente do cluster. Tanto para adicionar recursos que não serão utilizados como também causar problemas de Throttling.

💡
Podemos te ajudar com uma revisão 100% gratuita do seu ambiente cloud.
Share this post