KEDA 是什么
KEDA(Kubernetes Event-driven Autoscaling)是 CNCF 项目里的事件驱动伸缩组件。它不替代 HPA,而是补上 HPA 拿不到的那部分指标:KEDA 通过 CRD 描述事件源(Kafka 积压、RabbitMQ 队列深度、SQS 消息数、Prometheus 查询等),以 external metrics 的形式暴露给 HPA 消费,并支持把工作负载缩到 0 副本。代价是要额外维护 KEDA 控制器、事件源凭据与对应 CRD,升级前需回归整条扩缩链路。
基本信息
| 适用平台 | Kubernetes,需先安装 KEDA 控制器(通常位于 keda 命名空间) |
|---|---|
| 主要 CRD | ScaledObject(长驻负载)、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:前者只在单一命名空间可用,后者跨命名空间共享,选后者时要评估凭据的横向影响面。