DEV Community

Alex Spinov
Alex Spinov

Posted on

KEDA Has a Free API: Event-Driven Autoscaling for Kubernetes Workloads

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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"
                }
            }]
        }
    }
)
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

Resources


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)