DEV Community

Cover image for KEDA HTTP Add-on: Escalonamento Dinâmico por Volume de Requisições
jonas-elias
jonas-elias

Posted on

KEDA HTTP Add-on: Escalonamento Dinâmico por Volume de Requisições

Introdução

O escalonamento tradicional baseado em CPU ou memória atende bem a diversos cenários, mas pode apresentar limitações em aplicações que sofrem bursts de requisições ou que exibem padrões de tráfego irregulares. Nesses casos, é comum que a aplicação mantenha níveis estáveis de CPU e memória ao mesmo tempo que enfrenta pressão direta no atendimento HTTP, gerando aumento de latência, formação de filas e redução de throughput antes que o autoscaler identifique a necessidade de ajuste.

O KEDA HTTP Add-on foi desenvolvido para lidar com essas situações ao permitir que o escalonamento considere o volume de requisições como métrica primária. Essa abordagem oferece uma resposta mais alinhada ao comportamento real da carga, especialmente em serviços sensíveis a variações rápidas de demanda ou que dependem de tempo de reação reduzido.

Como o Keda HTTP Add-on funciona?

O Keda HTTP Add-on é composto por quatro elementos principais, cada um com responsabilidades específicas dentro do fluxo de escalonamento baseado em requisições HTTP.

Operador – Responsável por observar eventos relacionados a HTTPScaledObjects. A partir dessas mudanças, cria, ajusta ou remove os recursos internos necessários para manter o comportamento de escalonamento.

Interceptor – Atua como ponto de entrada do tráfego HTTP. Ele recebe requisições externas, aplica o roteamento adequado e encaminha cada chamada para a aplicação interna correspondente.

Scaler – Monitora continuamente o volume de requisições pendentes associadas a uma aplicação. Com base nessa observação, reporta métricas para o KEDA utilizando o mecanismo de external scaler, permitindo que a decisão de escalonamento seja baseada diretamente no acúmulo de requisições.

KEDA – Opera como o escalador responsável por ajustar a quantidade de réplicas da aplicação HTTP. Ele utiliza os dados fornecidos pelo scaler para determinar quando aumentar ou reduzir o número de instâncias.

Como utilizar o componente?

A utilização do KEDA HTTP Add-on envolve alguns elementos dentro do ambiente Kubernetes. No contexto deste artigo, trabalharemos com o seguinte conjunto:

  • Aplicação PHP executando em Kubernetes
    Uma aplicação HTTP, empacotada em container e implantada como um Deployment, servindo como base para observar o comportamento do escalonamento.

  • Deployment configurado para scale-to-zero
    A configuração define que a aplicação pode ser reduzida a zero réplicas quando o tráfego estiver ocioso, permitindo observar o comportamento de inicialização sob demanda.

  • KEDA HTTP Add-on como ponto de interceptação
    O add-on recebe o tráfego externo, gerencia a fila de requisições e garante que chamadas sejam corretamente encaminhadas ao serviço, independentemente do estado atual das réplicas.

  • Escalonamento orientado à demanda
    Com o scaler monitorando as requisições pendentes, o KEDA ajusta o número de réplicas conforme o acúmulo ou redução do tráfego.

  • Atendimento de requisições mesmo com a aplicação inativa
    O interceptor mantém uma fila temporária, permitindo que requisições recebam resposta mesmo quando o Deployment está em zero réplicas, enquanto o sistema inicia automaticamente novas instâncias.

Temos também alguns pré-requisitos a nível de ferramentas:

  • Docker (Desktop ou Engine)
  • Kubernetes configurado (kind ou Minikube)
  • Kubectl instalado
  • Helm instalado

Após todas instaladas e configuradas corretamente, é possível prosseguir.

1 - Criar a aplicação PHP

Crie um arquivo index.php

<?php

if ($_SERVER['REQUEST_URI'] === '/ping') {
    echo "pong";
    exit;
}

echo "Hello from PHP!";
Enter fullscreen mode Exit fullscreen mode

Crie o Dockerfile:

FROM php:8.3-cli
COPY index.php /var/www/html/index.php
CMD ["php", "-S", "0.0.0.0:8080", "-t", "/var/www/html"]
Enter fullscreen mode Exit fullscreen mode

Faça o build localmente:

eval $(minikube docker-env) # caso esteja utilizando o minikube
docker build -t keda-php-demo:latest .
Enter fullscreen mode Exit fullscreen mode

2 - Criar o Deployment + Service

Arquivo deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: keda-php-demo
spec:
  replicas: 0
  selector:
    matchLabels:
      app: keda-php-demo
  template:
    metadata:
      labels:
        app: keda-php-demo
    spec:
      containers:
        - name: keda-php-demo
          image: keda-php-demo:latest
          imagePullPolicy: Never
          ports:
            - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: keda-php-demo
spec:
  selector:
    app: keda-php-demo
  ports:
    - port: 80
      targetPort: 8080
Enter fullscreen mode Exit fullscreen mode

Aplicar:

kubectl apply -f deployment.yaml
Enter fullscreen mode Exit fullscreen mode

3 - Instalar o KEDA

helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda --namespace keda --create-namespace
Enter fullscreen mode Exit fullscreen mode

4 - Instalar o HTTP Add-on

helm install keda-addons-http kedacore/keda-add-ons-http \
  --namespace keda
Enter fullscreen mode Exit fullscreen mode

Isso instala:

  • HTTP operator
  • Interceptor Proxy (responsável por receber requisições)
  • Scalers

5 - Criar o HTTPScaledObject

Arquivo http-scaledobject.yaml:

apiVersion: http.keda.sh/v1alpha1
kind: HTTPScaledObject
metadata:
  name: keda-php-demo
spec:
  hosts:
    - php-demo.local
  pathPrefixes:
    - /
  scaleTargetRef:
    name: keda-php-demo
    kind: Deployment
    apiVersion: apps/v1
    service: keda-php-demo
    port: 80
  replicas:
    min: 1
    max: 10
  scaledownPeriod: 30
  scalingMetric:
    requestRate:
      granularity: 1s
      targetValue: 10
      window: 1m
Enter fullscreen mode Exit fullscreen mode

Aplicar:

kubectl apply -f http-scaledobject.yaml
Enter fullscreen mode Exit fullscreen mode

6 - Testando a aplicação

Fazer port-forward do interceptor para acessar na máquina local:

kubectl port-forward svc/keda-add-ons-http-interceptor-proxy -n keda 8081:8080
Enter fullscreen mode Exit fullscreen mode

Enviar requisição:

curl -H "Host: php-demo.local" http://localhost:8081/ping
Enter fullscreen mode Exit fullscreen mode

Deve receber a resposta

pong

Mesmo com réplicas = 0.

O KEDA:

  • Intercepta a requisição
  • Sobe o pod automaticamente
  • Encaminha a requisição quando o pod está pronto
  • Escala conforme a fila de requisições
  • Derruba tudo após scaledownPeriod: 30 segundos

OBS: É recomendável manter sempre réplicas ativas em ambientes de alto volume. Caso todas as réplicas cheguem a zero, o tempo necessário para que um novo POD/máquina fique saudável pode levar o solicitante a receber um Bad Gateway, o que acaba sendo contabilizado como indisponibilidade.

Analisando o dashboard do minikube

Caso tenha optado pelo minikube, é possível observar o comportamento no dashboard através do comando:

minikube dashboard
Enter fullscreen mode Exit fullscreen mode

Após isso a seguinte página com os componentes do K8S será apresentada no navegador:

Como o scaling realmente funciona?

O HTTP Add-on não escala baseado em CPU e não escala baseado em RPS (Requests por Segundo).
Ele usa o número de requisições pendentes na fila interna mantida pelo interceptor.

Esse número representa quantas requisições ainda estão esperando ser atendidas pelos pods.

O algoritmo usado é o mesmo algoritmo oficial do Kubernetes HPA, só que aplicado à métrica de requisições pendentes.

A fórmula do HPA é:

desiredReplicas = ceil(
    currentReplicas * ( pendingRequests / targetPendingRequests )
)
Enter fullscreen mode Exit fullscreen mode

Onde:

pendingRequests -> tamanho da fila interna
targetPendingRequests -> quantas requisições 1 pod deve conseguir suportar sem saturar
currentReplicas -> número atual de pods
desiredReplicas -> número final de pods após cálculo

Suponha:

  • pendingRequests = 25
  • targetPendingRequests = 10
  • currentReplicas = 1

Aplicando a fórmula:

desiredReplicas = ceil(1 * (25 / 10))
desiredReplicas = ceil(2.5)
desiredReplicas = 3
Enter fullscreen mode Exit fullscreen mode

Ou seja: 3 réplicas são necessárias para esvaziar a fila mantendo ~10 requisições por pod.

Esse comportamento é consistente, previsível e resistente a bursts.

Considerações finais

Esse setup demonstra como o KEDA HTTP Add-on permite construir serviços:

  • Eficientes e responsivos
  • Econômicos (scale-to-zero real)
  • Independentes de métricas como CPU e memória

Além disso, demonstra como é possível montar um ambiente completo em máquina local sem complexidade.

O único ponto de atenção é que o componente ainda está em beta release (data de publicação do artigo 11/2025), ou seja, os mantenedores não garantem um funcionamento 100% confiável em ambientes produtivos. Todavia o projeto se mostra muito promissor e logo logo (assim esperamos) estará production ready.

Referências

Top comments (0)