KEDA & Event-Driven Autoscaling: Solving Queue Backlogs in Kubernetes
If you've ever run Kafka or RabbitMQ consumers in Kubernetes, you know the pain: your consumers are either underutilized or overloaded, and CPU-based HPA just doesn’t cut it.
Enter KEDA — Kubernetes-based Event-Driven Autoscaling.
KEDA Github
What is KEDA?
KEDA is a lightweight autoscaler that scales your Kubernetes workloads based on external events or metrics, such as:
- Queue length in Kafka or RabbitMQ
- Prometheus metrics
- Cloud events (Azure, AWS, GCP)
Unlike HPA which scales on CPU/memory, KEDA lets your pods scale dynamically based on actual workload.
Important: KEDA itself runs as a Deployment in your Kubernetes cluster.
- It’s not a StatefulSet or a special Deployment of your app.
- It consumes CPU/memory like any other Deployment depending on the number of ScaledObjects and triggers you define.
- This means if you define many queues, KEDA’s own Deployment will grow in resource usage.
How KEDA Works
KEDA introduces a new Kubernetes object called a ScaledObject:
- ScaledObject → Deployment mapping: tells KEDA which workload to scale.
- Each ScaledObject can have one or more triggers.
-
Scaling logic:
- OR logic across triggers (if any trigger exceeds threshold → scale).
- Cannot independently scale subsets of pods within the same Deployment.
Example: RabbitMQ ScaledObject
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: orders-consumer-scaler
spec:
scaleTargetRef:
name: orders-consumer
minReplicaCount: 1
maxReplicaCount: 10
triggers:
- type: rabbitmq
metadata:
queueName: orders-queue
host: amqp://guest:guest@rabbitmq:5672/
queueLength: "100"
Explanation:
-
orders-consumer
Deployment will scale 1→10 pods depending on queue length. - Scaling happens if the queue length > 100.
KEDA & Event-Driven Autoscaling: Solving Queue Backlogs in Kubernetes
If you've ever run Kafka or RabbitMQ consumers in Kubernetes, you know the pain: your consumers are either underutilized or overloaded, and CPU-based HPA just doesn’t cut it.
Enter KEDA — Kubernetes-based Event-Driven Autoscaling.
How KEDA Determines the Number of Pods
KEDA computes desired replicas based on the queue metric and thresholds:
-
Threshold value (
queueLength
)- The metric KEDA monitors (queue depth).
Min and Max Replicas
minReplicaCount: 1
maxReplicaCount: 10
- **Desired replicas calculation (simplified):
desiredReplicas = ceil(currentQueueLength / queueLengthThreshold)
- **Scaling applied via HPA
KEDA updates the Deployment replicas between minReplicaCount
and maxReplicaCount
Visual Example
Imagine orders-queue has a threshold of 100 messages:
Queue Depth → Desired Replicas → Deployment Pods
------------------------------------------------
50 → 1 → 1 pod (minReplicaCount)
120 → 2 → 2 pods
250 → 3 → 3 pods
1050 → 11 → 10 pods (maxReplicaCount)
Diagram: Queue Depth → Desired Replicas → Deployment Scaling
[Queue Depth: 250]
│
▼
[Threshold: 100 per pod]
│
▼
[Desired Replicas: ceil(250/100) = 3]
│
▼
[orders-consumer Deployment scales to 3 pods]
Limitations of KEDA
While KEDA is powerful, it has some critical limitations:
N queues → N consumers is not supported natively
You cannot define multiple queues with different consumer Deployments in a single ScaledObject.
Scaling logic is OR across triggers; all pods scale together.
Not ideal for microservices with multiple queues and workflows
Example: if you have 10 queues with different processing logic/endpoints, KEDA alone cannot scale them independently.
You’d need multiple Deployments + multiple ScaledObjects, which becomes cumbersome.
Resource consumption
KEDA itself is a Deployment; each ScaledObject adds CPU/memory usage.
Scaling many queues can increase the resource footprint on the cluster.
Kubectl Example
After creating multiple ScaledObjects:
kubectl get scaledobjects
Example output:
NAME SCALETARGETKIND SCALETARGETNAME MIN MAX TRIGGERS
orders-consumer-scaler apps/v1.Deployment orders-consumer 1 10 rabbitmq
payments-consumer-scaler apps/v1.Deployment payments-consumer 1 5 rabbitmq
kafka-consumer-scaler apps/v1.Deployment kafka-consumer 1 15 kafka
Each ScaledObject
targets a single Deployment.
Multiple triggers for the same Deployment scale all pods together (OR logic).
Takeaways
- KEDA is great for simple event-driven scaling.
- Each ScaledObject → one Deployment.
- OR logic for multiple triggers → not suitable for microservices with multiple queues and workflows.
- KEDA computes replicas automatically using the metric and threshold, scaling Deployment pods between min and max.
- Resource footprint increases with more ScaledObjects and triggers.
Part 2 will show how to build a custom autoscaler that can handle multiple queues, multiple consumers, and independent scaling logic for complex microservices.
Pro Tip: Start with KEDA for simple queue scaling. For complex, multi-queue microservices, a custom HPA/KEDA solution is usually required.
Top comments (0)