首页/云/Kubernetes 速查/KEDA 事件驱动伸缩
调度与资源52 条

KEDA 事件驱动伸缩

KEDA 在 HPA 之上提供事件源驱动伸缩(队列长度、Kafka lag 等),并支持缩到 0 副本;需要部署 KEDA 控制器与对应伸缩对象。

Kubernetes 速查云更新于 2026-10-13

KEDA 是什么

KEDA(Kubernetes Event-driven Autoscaling)是 CNCF 项目里的事件驱动伸缩组件。它不替代 HPA,而是补上 HPA 拿不到的那部分指标:KEDA 通过 CRD 描述事件源(Kafka 积压、RabbitMQ 队列深度、SQS 消息数、Prometheus 查询等),以 external metrics 的形式暴露给 HPA 消费,并支持把工作负载缩到 0 副本。代价是要额外维护 KEDA 控制器、事件源凭据与对应 CRD,升级前需回归整条扩缩链路。

基本信息

适用平台Kubernetes,需先安装 KEDA 控制器(通常位于 keda 命名空间)
主要 CRDScaledObject(长驻负载)、ScaledJob(批处理)、TriggerAuthentication
API 组keda.sh/v1alpha1
内置默认值minReplicaCount 0、maxReplicaCount 100、pollingInterval 30 秒、cooldownPeriod 300 秒
指标通道每个 ScaledObject 生成一个 keda-hpa-* 的 HPA,指标走 external.metrics.k8s.io
依赖组件CPU/内存类触发器需要 metrics-server;事件源凭据建议用 TriggerAuthentication 引用 Secret

典型使用场景

  • 队列长度驱动伸缩:Kafka lag、RabbitMQ 队列深度、Redis list 长度比 CPU 更贴近真实压力
  • 低谷缩到零:夜间无事件时把消费者缩到 0 省资源,事件到达后由 KEDA 唤醒
  • 批处理与 ETL:ScaledJob 让每个事件起一个 Job 实例,任务结束即释放资源
  • 在线服务按业务指标扩缩:用 Prometheus 查询或 HTTP 请求量作为触发器
  • 与 cluster-autoscaler 配合:KEDA 拉起副本,节点容量不足时由 autoscaler 补节点

ScaledObject 完整片段

ScaledObject 完整片段
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: worker-scaler
  namespace: prod
spec:
  scaleTargetRef:
    name: worker            # 目标 Deployment / StatefulSet 名称
  minReplicaCount: 0        # 允许缩到零,由 KEDA 唤醒后再交给 HPA
  maxReplicaCount: 20
  pollingInterval: 30       # 每 30 秒取一次事件源指标
  cooldownPeriod: 300       # 无事件后持续 5 分钟才缩回下限
  fallback:
    failureThreshold: 3     # 连续 3 次取指标失败
    replicas: 2             # 兜底副本数,避免事件源故障时缩到零
  triggers:
    - type: kafka
      metadata:
        bootstrapServers: kafka.prod:9092
        consumerGroup: workers
        topic: jobs
        lagThreshold: "50"  # 积压超过 50 条开始扩
      authenticationRef:
        name: kafka-auth    # 凭据放在 TriggerAuthentication 引用的 Secret 里

部署后核对

部署后核对
kubectl get scaledobject,scaledjob -A          # 确认目标负载已被 KEDA 接管
kubectl describe scaledobject worker-scaler -n prod   # Conditions 里看 Ready / Active / Fallback
kubectl get hpa -A | grep -i keda               # KEDA 生成的配套 HPA
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/prod"   # 列出该命名空间可用的外部指标名
kubectl get pods -n keda                        # keda-operator 与 metrics-apiserver 是否正常

关键字段读法

字段作用取值提示
minReplicaCount缩容下限,0 表示允许缩到零面向用户的同步接口不要设 0
idleReplicaCount无事件时维持的闲置副本数想省资源又不想完全冷启动时使用
pollingInterval取事件源指标的间隔(秒)调小更灵敏,但事件源压力上升
cooldownPeriod从高位缩回下限前的等待时间(秒)指标抖动大的负载适当加大
fallback取数失败时的兜底副本数不配则取数失败可能一路缩到零
HPA 本身无法从 0 副本扩起,KEDA 的做法是判定触发器活跃后由 operator 先把工作负载从 0 拉起(激活),超过阈值之后的扩缩再交给生成的 HPA。所以 keda 命名空间里的 operator 一旦不可用,所有缩到零的负载都不会被唤醒。
缩到零意味着首个事件要承担完整冷启动:镜像拉取、依赖初始化、缓存预热的时间都会算进端到端延迟。在线服务应保留最小副本或设置闲置副本数,把缩到零留给可以接受排队延迟的消费者和批处理。
触发器凭据不要明文写在 ScaledObject 里,改用 TriggerAuthentication / ClusterTriggerAuthentication 引用 Secret:前者只在单一命名空间可用,后者跨命名空间共享,选后者时要评估凭据的横向影响面。

易错点

  • minReplicaCount 设 0 又没配 fallback:事件源短暂不可用时取不到指标,工作负载缩到零,等事件源恢复后积压集中爆发
  • 只扩副本不看节点容量:maxReplicaCount 调得远超节点池上限,副本扩出来长期 Pending,容易被误判为 KEDA 没有工作
  • 凭据写在 ScaledObject 的 metadata 里(明文密码):轮换后忘记同步,扩缩静默失效,排障要先看 ScaledObject 的 Conditions
  • 用 CPU/内存类触发器却没装 metrics-server:HPA 指标为空并报 unknown,KEDA 侧看不出异常
  • 对冷启动敏感的在线服务直接缩到零:首个请求超时,用户侧表现为间歇性 5xx,需要保留最小副本或提前预热

数据来源与参考

  • KEDA 官方文档 · ScaledObject 与事件源
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌