Skip to main content

KEDA — Event-Driven Autoscaling on Azure

KEDA (Kubernetes Event-Driven Autoscaling) extends the Kubernetes HPA to scale workloads based on external metrics — Azure Service Bus queue depth, Event Hubs lag, Azure Monitor metrics, or any custom source.

Installing KEDA

helm repo add kedacore https://kedacore.github.io/charts
helm repo update

helm install keda kedacore/keda \
--namespace keda \
--create-namespace \
--version 2.13.0 \
--set watchNamespace="" \
--set operator.replicaCount=2

Scale on Azure Service Bus

kubernetes/keda/payments-worker-scaler.yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: payments-worker
namespace: team-payments
spec:
scaleTargetRef:
name: payments-worker
pollingInterval: 15
cooldownPeriod: 120
minReplicaCount: 1
maxReplicaCount: 50
triggers:
- type: azure-servicebus
metadata:
queueName: payment-events
namespace: devopsgenie-production
# Scale 1 replica per 20 messages in the queue
messageCount: "20"
authenticationRef:
name: keda-service-bus-auth
---
# TriggerAuthentication using Workload Identity
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: keda-service-bus-auth
namespace: team-payments
spec:
podIdentity:
provider: azure-workload
identityId: "<MANAGED_IDENTITY_CLIENT_ID>"

Scale on Azure Event Hubs

triggers:
- type: azure-event-hub
metadata:
eventHubName: telemetry-events
eventHubNamespace: devopsgenie-production
consumerGroup: payments-consumer
unprocessedEventThreshold: "100"
authenticationRef:
name: keda-eventhub-auth

Scale on Azure Monitor Metrics

triggers:
- type: azure-monitor
metadata:
resourceURI: /subscriptions/<SUB>/resourceGroups/<RG>/providers/Microsoft.Sql/servers/<SERVER>/databases/<DB>
tenantId: "<TENANT_ID>"
subscriptionId: "<SUB_ID>"
resourceGroupName: devopsgenie-production
metricName: cpu_percent
targetValue: "70"
metricAggregationType: Average
authenticationRef:
name: keda-azure-monitor-auth

Verifying KEDA

# Check ScaledObject status
kubectl get scaledobject payments-worker -n team-payments

# Describe for events and status
kubectl describe scaledobject payments-worker -n team-payments

# Watch replicas change in response to queue depth
kubectl get pods -n team-payments -l app=payments-worker --watch