O Horizontal Pod Autoscaler (HPA) do Kubernetes mudou a forma como gerenciamos workloads: ele escala automaticamente os pods de deployments e statefulsets para mais ou para menos com base na utilização média de CPU, na utilização média de memória ou em qualquer outra métrica personalizada que você definir, acompanhando a demanda.
Implementação atual
No cálculo do uso de recursos dos pods, o valor total é obtido somando o consumo de cada container dentro do pod. Esse método, porém, pode não ser adequado para workloads em que o uso entre os containers não está diretamente relacionado ou não varia no mesmo ritmo.
Por exemplo, um container sidecar que processa logs pode consumir poucos recursos, enquanto o container principal da aplicação de blog concentra a maior parte do trabalho. Nesse cenário, o HPA não escalaria com base no uso do container crítico, já que a métrica média do pod pode não refletir o que realmente está acontecendo.

Escalonamento do HPA com base na utilização média de recursos de todos os pods de um deployment
Nova implementação
Introduzido no Kubernetes v1.20 e agora promovido a estável na v1.30, o recurso de Container resource metrics permite que o HPA mire as métricas individuais de cada container dentro de um pod. Você pode configurar o HPA para escalar com base na utilização de recursos (CPU, memória etc.) de um container específico do pod.
Esse recurso ajuda a alocar recursos com eficiência e evita escalonamentos desnecessários disparados pela alta utilização do pod por containers não críticos. Ao monitorar o consumo do container responsável pela funcionalidade principal, você foca no que de fato importa. O resultado são decisões melhores de escalonamento e menos gargalos de desempenho.

Escalonamento do HPA com base na utilização média de recursos do container alvo em todos os pods de um deployment
Neste post, vou mostrar como usar as container resource metrics para escalar seus deployments em pods com múltiplos containers.
Pré-requisitos
- Um cluster Kubernetes na versão 1.27 ou superior.
- Metrics Server implantado no cluster Kubernetes.
- Kubectl instalado na sua máquina.
Container resource metrics em ação
- Faça o deploy de um exemplo com múltiplos containers usando o manifesto abaixo. O
cpu-stressoré o container principal, criado para simular estresse de CPU em pods do Kubernetes. Veja o repositório no Github para mais detalhes sobre a ferramentacpu-stressor. Olog-generatoré um container secundário de exemplo no mesmo pod.
cat <<EOF | kubectl apply -f -
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: crm-scaling-demo
labels:
app: crm-scaling-demo
spec:
selector:
matchLabels:
app: crm-scaling-demo
template:
metadata:
labels:
app: crm-scaling-demo
spec:
containers:
- name: cpu-stressor
image: narmidm/k8s-pod-cpu-stressor:1.0.0
args:
- "-cpu=0.5"
- "-duration=3600s"
resources:
limits:
cpu: "200m"
requests:
cpu: "100m"
- name: log-generator
image: busybox:1.28
args: [/bin/sh, -c,\
'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
resources:
requests:
cpu: "100m"
EOF

Pod de exemplo e uso de recursos em todos os seus containers
- Crie um recurso
HorizontalPodAutoscalerque faça o escalonamento pelo uso de CPU do containercpu-stressor, e não pelas métricas do pod.
cat <<EOF | kubectl apply -f -
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: crm-scaling-demo
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: crm-scaling-demo
minReplicas: 1
maxReplicas: 10
metrics:
- type: ContainerResource #new-metrics-source
containerResource:
name: cpu
container: cpu-stressor #container-name
target:
type: Utilization
averageUtilization: 50
EOF

Exemplo de configuração do HPA com base nas métricas do container cpu-stressor
No exemplo acima, o controlador do HPA escala o alvo de forma que a utilização média de CPU no container cpu-stressor de todos os pods fique em 50%.
- Aguarde o container
cpu-stressorsimular o estresse de CPU e você verá o HPA recalcular o número de pods com base na utilização de CPU docpu-stressor.

Exemplo de escalonamento do HPA com base nas métricas do container cpu-stressor
Demonstração do escalonamento do HPA com container resource metrics
A captura de tela e o vídeo mostram o escalonamento bem-sucedido do HPA a partir do container cpu-stressor em um pod com múltiplos containers🚀.
Com as container resource metrics chegando ao status estável no Kubernetes v1.30, você atinge um novo patamar de precisão no autoscaling horizontal de pods e garante o melhor desempenho das suas aplicações.
Espero que este post tenha sido útil. Para se aprofundar, confira os recursos abaixo: