Packaging & Config

KEDA

Kubernetes Event-Driven Autoscaling CNCF Graduated - scale à zéro, 60+ scalers Kafka/RabbitMQ/Redis/Prometheus/Cron, ScaledObject et ScaledJob. Apache 2.0.

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

ComposantValeur
CRDsScaledObject (Deployment/StatefulSet), ScaledJob (Jobs batch), TriggerAuthentication, ClusterTriggerAuthentication
Scalers60+ : Kafka, RabbitMQ, Redis, AWS SQS/Kinesis, Azure Queue/Service Bus, GCP Pub/Sub, Prometheus, Cron, NATS, MongoDB...
Scale à zéroOui - répliques minimum configurable à 0
Namespace installkeda

Prérequis

RessourceValeur
Kubernetes1.24+
Metrics ServerRecommandé (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

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic