HPA – Aprenda a configurar um autoscaling no Kubernetes

O HPA é um recurso muito importante quando falamos de aplicações sendo executadas no Kubernetes, pois quando utilizamos um ambiente tão poderoso quanto o Kubernetes é porque estamos construindo ou hospedando uma aplicação que provavelmente deve trabalhar de maneira escalável.

O HPA trabalha controlando o número de réplicas de um Pod com base em uma métrica, basicamente o seu funcionamento consiste em comandar a criação de mais Pods caso o número da métrica ultrapasse o desejado, ou destruir alguns quando o recurso está pouco utilizado, o comum é que ele utilize a métrica de CPU utilizada pelo Pod, então basicamente na criação de um HPA você vai definir o número que ele deve considerar de cpu para começar a escalar, o número mínimo de Pods que ele deve manter e o número máximo que ele deve escalar.

Seu uso é bem simples de ser implementado, ele precisa ser acoplado a um deployment ou replicaset, após isso ele se encarregará de buscar as métricas desses recursos e começará a controlar o número de Pods, a seguir detalhes o seu uso.

Como construir um HPA

Há mais de uma maneira de você construir um Horizontal Pod Autoscaling, a mais simples delas é definir suas configurações na própria linha de comando utilizando o kubectl, segue um exemplo:

Construir pela linha de comando

kubectl autoscale deployment “nome-do-deployment” --cpu-percent=50 --min=1 --max=10
Terminal

Esse comando cria automaticamente um HPA que controlará o deployment definido, para isso deve ser ajustado o nome do deployment que você está utilizando, também é possível alterar as métricas de porcentagem de cpu, min e max. É importante ajustar esses valores para os utilizados no seu ambiente.

Para utilizar o comando mas com um replicaset, basta substituir o tipo que será alvo, como no exemplo a seguir:

kubectl autoscale replicaset “nome-do-replicaset” --cpu-percent=50 --min=1 --max=10
Terminal

Construir por manifesto YAML

Também é possível construir a partir de um arquivo manifesto YAML, abaixo mostramos um exemplo:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nome-do-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nome-do-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
hpa.yml

Também é possível utilizar a métrica de memória para o auto scaling:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nome-do-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nome-do-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 50
hpa.yml

Essa é geralmente a maneira mais utilizadas em pipelines do tipo CI/CD, aqui basta substituir o “nome-do-hpa” e “nome-do-deployment”, e as métricas que deseja utilizar, assim como o número de Pods mínimo e máximo, nas chaves minReplicas e maxReplicas respectivamente, atente-se também com o valor de targetCPUUtilizationPercentage, esse valor é que define a média utilizada de cpu para que o recurso comece a escalar ou desescalar.

O uso acima demonstra a aplicação em um Deployment, para utilizar com um replicaset, basta substituir o kind da linha 10 por Replicaset.

Exibindo informações

Como todos os recursos do Kubernetes, podemos utilizar alguns comandos que já são padrão da API com o Horizontal Pod Autoscaling.

Listar

O comando abaixo irá mostrar todos os Horizontal Pod Autoscaling que estão disponíveis no seu namespace.

kubectl get hpa
Terminal

Caso queira aplicar esse comando em um outro namespace a partir do atual pode acrescentar o parâmetro –namespace=”nome-do-namespace”, como no exemplo a seguir:

kubectl get hpa --namespace=application
Terminal

Exibir detalhes

Com esse comando é possível ver os detalhes do seu HPA construído.

kubectl describe hpa "nome-do-hpa"
Terminal

Demonstramos o quanto é simples trabalhar com escalonamento horizontal no Kubernetes, de fato ele já nos entrega um recurso muito poderoso de fácil uso e de fácil entendimento, após criado o HPA você não precisa se preocupar mais com o gerenciamento do número de Pods necessário para atender a demanda.

Importante lembrar que é interessante tentar buscar uma métrica mais assertiva quanto ao número de utilização de cpu para que o HPA se torne mais otimizado, pois esse número além de controlar a criação de novos Pods para atender o escalonamento também destrói Pods existentes quando a média no número de cpu está abaixo do definido.

Links uteis

Mauricio Lima
Mauricio Lima

Bacharel em Ciência da Computação, profissional dedicado ao desenvolvimento de software e entusiasta da tecnologia.

Artigos: 65