KEDA (Kubernetes Event-Driven Autoscaling) est un autoscaler Kubernetes, CNCF Graduated, développé initialement par Microsoft et Red Hat. Il étend le HPA (Horizontal Pod Autoscaler) natif de Kubernetes avec la capacité de scaler les workloads sur la base de métriques externes : profondeur d'une file Kafka, longueur d'une queue RabbitMQ ou SQS, nombre de messages Redis, requêtes Prometheus, planification cron - et surtout, de descendre jusqu'à zéro répliques quand la source est vide. Il supporte plus de 60 scalers.
Informations essentielles
Origine : Microsoft / Red Hat → CNCF Graduated · Licence : Apache 2.0 · Architectures : x86_64, ARM64
Liens : Site officiel · Documentation · GitHub · Scalers
Support : CNCF Graduated. Communauté très active, releases fréquentes.
Stack par défaut
| Composant | Valeur |
|---|---|
| CRDs | ScaledObject (Deployment/StatefulSet), ScaledJob (Jobs batch), TriggerAuthentication, ClusterTriggerAuthentication |
| Scalers | 60+ : Kafka, RabbitMQ, Redis, AWS SQS/Kinesis, Azure Queue/Service Bus, GCP Pub/Sub, Prometheus, Cron, NATS, MongoDB... |
| Scale à zéro | Oui - répliques minimum configurable à 0 |
| Namespace install | keda |
Prérequis
| Ressource | Valeur |
|---|---|
| Kubernetes | 1.24+ |
| Metrics Server | Recommandé (pour les métriques HPA internes) |
Installation
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
helm install keda kedacore/keda \
--namespace keda \
--create-namespace
# Vérifier
kubectl get pods -n keda
# keda-operator, keda-operator-metrics-apiserver Running
ScaledObject - scaler un Deployment
Kafka
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: kafka-consumer-scaler
namespace: production
spec:
scaleTargetRef:
name: kafka-consumer # Nom du Deployment à scaler
pollingInterval: 15 # Vérifier toutes les 15s
cooldownPeriod: 60 # Attendre 60s avant de scale down
minReplicaCount: 0 # Peut descendre à 0 (scale to zero)
maxReplicaCount: 20
triggers:
- type: kafka
metadata:
bootstrapServers: kafka.messaging:9092
consumerGroup: my-consumer-group
topic: my-topic
lagThreshold: "100" # 1 réplique par 100 messages en lag
offsetResetPolicy: latest
RabbitMQ
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: rabbitmq-scaler
namespace: production
spec:
scaleTargetRef:
name: message-processor
minReplicaCount: 0
maxReplicaCount: 10
triggers:
- type: rabbitmq
metadata:
host: amqp://rabbitmq.messaging:5672/
queueName: tasks
mode: QueueLength
value: "50" # 1 réplique par 50 messages dans la queue
authenticationRef:
name: rabbitmq-auth
Prometheus
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: prometheus-scaler
namespace: production
spec:
scaleTargetRef:
name: api-server
minReplicaCount: 1
maxReplicaCount: 50
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus.monitoring:9090
metricName: http_requests_per_second
threshold: "100" # Scale si > 100 req/s par réplique
query: |
sum(rate(http_requests_total{namespace="production"}[2m]))
Cron (planification)
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: cron-scaler
namespace: production
spec:
scaleTargetRef:
name: batch-worker
triggers:
- type: cron
metadata:
timezone: Europe/Paris
start: "0 8 * * 1-5" # Lun-Ven à 8h
end: "0 20 * * 1-5" # Lun-Ven à 20h
desiredReplicas: "5" # 5 répliques pendant les heures ouvrées
TriggerAuthentication - credentials
# Secret contenant les credentials
apiVersion: v1
kind: Secret
metadata:
name: rabbitmq-credentials
namespace: production
type: Opaque
stringData:
password: "mypassword"
---
# TriggerAuthentication - référencer le secret
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: rabbitmq-auth
namespace: production
spec:
secretTargetRef:
- parameter: password
name: rabbitmq-credentials
key: password
ScaledJob - scaler des Jobs batch
Pour les workloads one-shot (traitement d'un message = un Job Kubernetes) :
apiVersion: keda.sh/v1alpha1
kind: ScaledJob
metadata:
name: sqs-processor
namespace: production
spec:
jobTargetRef:
template:
spec:
containers:
- name: processor
image: ghcr.io/org/processor:latest
restartPolicy: Never
pollingInterval: 30
maxReplicaCount: 20
triggers:
- type: aws-sqs-queue
metadata:
queueURL: https://sqs.eu-west-1.amazonaws.com/123456789/my-queue
queueLength: "1" # 1 job par message dans la queue
awsRegion: eu-west-1
authenticationRef:
name: aws-auth
Mise à jour
helm repo update
helm upgrade keda kedacore/keda \
--namespace keda \
--reuse-values
Troubleshooting
# État des ScaledObjects
kubectl get scaledobjects -A
# Détails d'un ScaledObject (métriques et events)
kubectl describe scaledobject kafka-consumer-scaler -n production
# Logs KEDA operator
kubectl logs -n keda -l app=keda-operator --tail=50
# Logs metrics adapter
kubectl logs -n keda -l app=keda-operator-metrics-apiserver --tail=50
# Vérifier les métriques collectées
kubectl get --raw \
"/apis/external.metrics.k8s.io/v1beta1/namespaces/production/kafka-consumer-scaler" \
| jq .
# ScaledObject ne scale pas
# 1. Vérifier la connexion à la source (credentials, réseau)
# 2. Vérifier que le Deployment cible existe
# 3. Regarder les events du ScaledObject
kubectl get events -n production | grep ScaledObject
Ressources
- Site officiel : https://keda.sh
- Documentation : https://keda.sh/docs/
- Catalogue des scalers : https://keda.sh/docs/latest/scalers/
- GitHub : https://github.com/kedacore/keda
- Releases : https://github.com/kedacore/keda/releases