Configurando o KEDA para autoescalar com base nas mensagens em uma fila do RabbitMQ

Ricardo Baltazar
Juntos Somos Mais
Published in
3 min readMar 26, 2023
Photo by Growtika on Unsplash

O KEDA (Kubernetes Event-driven Autoscaling) é um projeto de código aberto que oferece escalabilidade baseada em eventos para aplicativos Kubernetes. Neste post, mostraremos como configurar o KEDA para autoescalar um consumidor com base no número de mensagens em uma fila do RabbitMQ. O objetivo é ter um consumidor em espera (sem instâncias) até que uma mensagem seja enfileirada.

Pré-requisitos:

  1. Kubernetes cluster configurado.
  2. kubectl instalado e configurado.
  3. Helm instalado e configurado.
  4. Acesso ao RabbitMQ (local ou remoto).

Passo 1: Instalar o KEDA usando Helm

Para instalar o KEDA usando o Helm, execute o seguinte comando:

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

Passo 2: Criar um consumidor

Crie um arquivo chamado consumer.yaml com o seguinte conteúdo:

apiVersion: apps/v1
kind: Deployment
metadata:
name: rabbitmq-consumer
spec:
replicas: 0
selector:
matchLabels:
app: rabbitmq-consumer
template:
metadata:
labels:
app: rabbitmq-consumer
spec:
containers:
- name: consumer
image: <SUA_IMAGEM_DO_CONSUMIDOR>
env:
- name: RABBITMQ_CONNECTIONSTRING
valueFrom:
secretKeyRef:
name: rabbitmq-secret
key: connectionString
---
apiVersion: v1
kind: Secret
metadata:
name: rabbitmq-secret
type: Opaque
stringData:
connectionString: <SUA_STRING_DE_CONEXÃO_DO_RABBITMQ>

Substitua <SUA_IMAGEM_DO_CONSUMIDOR> pela imagem do seu consumidor e <SUA_STRING_DE_CONEXÃO_DO_RABBITMQ> pela string de conexão do RabbitMQ.

Passo 3: Configurar o ScaledObject

Crie um arquivo chamado scaledobject.yaml com o seguinte conteúdo:

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: rabbitmq-scaledobject
spec:
scaleTargetRef:
name: rabbitmq-consumer
minReplicaCount: 0
maxReplicaCount: 10
triggers:
- type: rabbitmq
metadata:
queueName: <NOME_DA_FILA>
queueLength: '1'
hostFromEnv: RABBITMQ_CONNECTIONSTRING

Substitua <NOME_DA_FILA> pelo nome da fila do RabbitMQ que você deseja monitorar.

Passo 4: Aplicar as configurações

Execute os seguintes comandos para aplicar as configurações:

kubectl apply -f consumer.yaml
kubectl apply -f scaledobject.yaml

Agora, o KEDA monitorará a fila do RabbitMQ e ajustará o número de réplicas do consumidor com base no número de mensagens na fila. Quando a fila estiver vazia, não haverá instâncias do consumidor em execução. Quando uma mensagem chegar à fila, o KEDA escalará o consumidor

Para monitorar os logs do KEDA e verificar se o autoescalonamento está funcionando corretamente, você pode verificar os logs do pod do operador KEDA. Siga os passos abaixo:

Passo 1: Liste os pods no namespace do KEDA

Execute o seguinte comando para listar todos os pods no namespace do KEDA:

kubectl get pods -n keda

Você verá uma saída semelhante a esta:

NAME                                      READY   STATUS    RESTARTS   AGE
keda-6d869d66bd-5ht5j 1/1 Running 0 1d
keda-operator-7c87884b75-4vwmn 1/1 Running 0 1d

Passo 2: Verifique os logs do operador KEDA

Para verificar os logs do operador KEDA, execute o seguinte comando substituindo <KEDA_OPERATOR_POD> pelo nome do pod do operador KEDA obtido no passo anterior:

kubectl logs -f <KEDA_OPERATOR_POD> -n keda

Por exemplo:

kubectl logs -f keda-operator-7c87884b75-4vwmn -n keda

Você verá logs semelhantes a estes ao monitorar o autoescalonamento:

{"level":"info","ts":...,"logger":"scalehandler","msg":"Scaling","ScaledObject.Namespace":"default","ScaledObject.Name":"rabbitmq-scaledobject","ScaledObject.ScaleType":"deployment","ScaledObject.Scaler":{},"ScaledObject.MinReplicas":0,"ScaledObject.MaxReplicas":10,"ScaledObject.Replicas":0}
{"level":"info","ts":...,"logger":"controllers.ScaledObject","msg":"Successfully updated status","ScaledObject.Namespace":"default","ScaledObject.Name":"rabbitmq-scaledobject"}
{"level":"info","ts":...,"logger":"scalehandler","msg":"Scaling","ScaledObject.Namespace":"default","ScaledObject.Name":"rabbitmq-scaledobject","ScaledObject.ScaleType":"deployment","ScaledObject.Scaler":{},"ScaledObject.MinReplicas":0,"ScaledObject.MaxReplicas":10,"ScaledObject.Replicas":1}

Agora você pode monitorar os logs do KEDA e ver o autoescalonamento em ação. Verifique se o número de réplicas aumenta e diminui com base no número de mensagens na fila do RabbitMQ.

--

--