Configurando o KEDA para autoescalar com base nas mensagens em uma fila do RabbitMQ
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:
- Kubernetes cluster configurado.
- kubectl instalado e configurado.
- Helm instalado e configurado.
- 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.