KEDA (Kubernetes Event-Driven Autoscaling) scales your Kubernetes workloads based on the number of events in queues, databases, or any external metric source. Scale from zero to thousands of pods automatically.
What Is KEDA?
KEDA is a CNCF graduated project that extends Kubernetes with event-driven autoscaling. Unlike HPA which only scales on CPU/memory, KEDA scales on external metrics like message queue depth, database rows, or HTTP request rate.
Key Features:
- Scale from/to zero pods
- 60+ built-in scalers
- Event-driven triggers
- Works alongside Kubernetes HPA
- Prometheus metrics
- ScaledObject and ScaledJob CRDs
- TriggerAuthentication for secure access
- Fallback configuration
Installation
helm repo add kedacore https://kedacore.github.io/charts
helm install keda kedacore/keda -n keda --create-namespace
KEDA ScaledObject Examples
Scale on RabbitMQ Queue Depth
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: rabbitmq-consumer
spec:
scaleTargetRef:
name: order-processor
minReplicaCount: 0 # Scale to zero!
maxReplicaCount: 50
pollingInterval: 15
cooldownPeriod: 300
triggers:
- type: rabbitmq
metadata:
queueName: orders
host: amqp://rabbitmq.default.svc.cluster.local
queueLength: "5" # 1 pod per 5 messages
Scale on Kafka Consumer Lag
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: kafka-consumer
spec:
scaleTargetRef:
name: event-processor
minReplicaCount: 1
maxReplicaCount: 100
triggers:
- type: kafka
metadata:
bootstrapServers: kafka:9092
consumerGroup: my-group
topic: events
lagThreshold: "100"
Scale on Prometheus Metric
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: http-scaler
spec:
scaleTargetRef:
name: web-api
minReplicaCount: 2
maxReplicaCount: 20
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus:9090
metricName: http_requests_per_second
query: sum(rate(http_requests_total{app="web-api"}[2m]))
threshold: "100" # Scale up at 100 rps per pod
Scale on PostgreSQL Row Count
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: pg-processor
spec:
scaleTargetRef:
name: task-worker
triggers:
- type: postgresql
metadata:
connectionFromEnv: PG_CONNECTION
query: "SELECT COUNT(*) FROM tasks WHERE status = 'pending'"
targetQueryValue: "10"
KEDA API: Programmatic Access
from kubernetes import client, config
config.load_kube_config()
custom = client.CustomObjectsApi()
# List all ScaledObjects
scaled_objects = custom.list_namespaced_custom_object(
group="keda.sh",
version="v1alpha1",
namespace="default",
plural="scaledobjects"
)
for so in scaled_objects["items"]:
target = so["spec"]["scaleTargetRef"]["name"]
min_r = so["spec"].get("minReplicaCount", 0)
max_r = so["spec"].get("maxReplicaCount", 100)
triggers = len(so["spec"].get("triggers", []))
print(f"ScaledObject: {so['metadata']['name']}, Target: {target}, Min: {min_r}, Max: {max_r}, Triggers: {triggers}")
# Create a ScaledObject
custom.create_namespaced_custom_object(
group="keda.sh",
version="v1alpha1",
namespace="default",
plural="scaledobjects",
body={
"apiVersion": "keda.sh/v1alpha1",
"kind": "ScaledObject",
"metadata": {"name": "my-scaler"},
"spec": {
"scaleTargetRef": {"name": "my-deployment"},
"minReplicaCount": 0,
"maxReplicaCount": 10,
"triggers": [{
"type": "cron",
"metadata": {
"timezone": "UTC",
"start": "0 8 * * *",
"end": "0 20 * * *",
"desiredReplicas": "5"
}
}]
}
}
)
ScaledJob for Batch Processing
apiVersion: keda.sh/v1alpha1
kind: ScaledJob
metadata:
name: batch-processor
spec:
jobTargetRef:
template:
spec:
containers:
- name: worker
image: batch-worker:latest
restartPolicy: Never
pollingInterval: 30
maxReplicaCount: 20
triggers:
- type: aws-sqs-queue
metadata:
queueURL: https://sqs.us-east-1.amazonaws.com/123456789/tasks
queueLength: "1"
Resources
- KEDA Docs
- KEDA GitHub — 8.5K+ stars
- Scalers List
Need to scrape web data for your event-driven apps? Check out my web scraping tools on Apify — production-ready actors for Reddit, Google Maps, and more. Questions? Email me at spinov001@gmail.com
Top comments (0)