Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Autoscaling Horizontal de Pods no Kubernetes com Métricas por Container

By Chimbu ChinnaduraiMay 2, 20244 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

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 ferramenta cpu-stressor. O log-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 HorizontalPodAutoscaler que faça o escalonamento pelo uso de CPU do container cpu-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-stressor simular o estresse de CPU e você verá o HPA recalcular o número de pods com base na utilização de CPU do cpu-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: