一、文档概述
本文档聚焦K8s下一代弹性伸缩组件KEDA(Kubernetes Event-driven Autoscaling),全方位梳理KEDA核心定位、与原生HPA差异化优势、四大核心工作组件原理、生产标准安装部署流程,同时收录企业最常用四大实战场景,包含周期性定时扩缩容、RabbitMQ消息队列扩缩容、MySQL业务数据扩缩容、Redis队列任务ScaledJob扩缩容。所有YAML配置文件均配备逐行中文注释。
二、KEDA核心基础介绍
2.1 KEDA核心定义
KEDA是云原生计算基金会CNCF毕业的开源轻量级事件驱动自动伸缩组件,专为Kubernetes集群设计。核心作用是基于各类外部事件源指标,而非仅依赖K8s原生CPU、内存资源指标,实现集群工作负载的精细化弹性扩缩容,支持常规副本扩容、缩容,且独家支持工作负载缩容至0副本,业务低峰期极致节省集群服务器资源。
KEDA不替代K8s原生HPA,而是深度兼容HPA、基于HPA底层能力做能力扩展。
2.2 KEDA与原生HPA核心差异化对比
| 对比维度 | K8s原生HPA | KEDA弹性伸缩 |
|---|---|---|
| 扩容指标来源 | 仅支持CPU、内存两类集群原生资源指标 | 支持70+内置触发器,涵盖消息队列、数据库、定时任务、监控指标、缓存等各类外部业务指标 |
| 缩容能力 | 最小副本数最低为1,无法缩容至0,低峰期资源闲置 | 支持配置最小副本数为0,业务无事件、无任务时自动缩容至0,极致降本 |
| 适配工作负载 | 仅支持Deployment、StatefulSet常驻业务服务 | 支持常驻服务Deployment、临时批量任务Job两类核心工作负载 |
| 触发模式 | 资源使用率被动触发扩缩容 | 事件驱动主动感知业务流量、任务量,精准实时扩缩容 |
2.3 KEDA核心适用业务场景
- 定时业务场景:仅早高峰、晚高峰需要运行的业务系统,其余时间缩容节省资源
- 消息消费场景:RabbitMQ、Kafka、Redis等消息队列堆积消息越多,消费者Pod自动扩容提速处理
- 数据处理场景:MySQL、PostgreSQL等数据库待处理业务订单、数据越多,处理服务自动扩容
- 批量任务场景:视频处理、数据同步、日志清洗等临时一次性任务,按需触发Job任务扩容,任务完成自动销毁
三、KEDA四大核心组件深度详解
KEDA所有弹性伸缩能力均依赖自定义CRD资源实现,核心包含四大核心组件,各司其职、协同工作,实现认证隔离、伸缩规则定义、工作负载绑定、事件指标采集全流程管控。
3.1 TriggerAuthentication 认证授权核心组件
核心作用:统一管理KEDA连接各类外部事件源(RabbitMQ、MySQL、Redis等)的账号、密码、连接地址等敏感认证信息,避免将明文账号密码写入伸缩配置文件,保障集群安全合规。
工作逻辑:提前将数据库、消息队列连接信息存入K8s原生Secret资源,再通过TriggerAuthentication关联Secret密钥,后续所有伸缩规则仅引用该认证资源,无需重复配置敏感信息,统一维护、统一更新。
适用场景:所有需要账号密码连接外部组件的KEDA伸缩场景,必配组件。
3.2 ScaledObject 常驻服务伸缩核心组件
核心作用:KEDA最常用核心资源,专门用于管控Deployment、StatefulSet这类长期运行的常驻业务服务,定义服务扩缩容阈值、冷却时间、最大/最小副本数、关联触发器及认证信息。
工作逻辑:绑定需要伸缩的目标常驻服务,配置扩缩容触发条件,KEDA自动监听外部事件指标,达标后自动调用底层HPA完成Pod副本扩缩,支持缩容至0。
适用场景:订单消费服务、后台常驻处理服务、定时运行业务服务等常驻类工作负载。
3.3 ScaledJob 临时任务伸缩核心组件
核心作用:专门用于管控K8s Job一次性临时批量任务,不管理常驻服务,仅在检测到有待处理任务、事件、消息时,自动创建Job及对应Pod处理任务,任务处理完成后自动销毁Pod及Job,无需人工干预。
工作逻辑:定义Job任务模板、任务重试次数、历史任务保留数量、最大并行任务数,监听外部任务指标,按需触发Job创建与扩容。
适用场景:视频转码、数据批量同步、日志清理、临时数据计算等一次性批量处理任务。
3.4 Scaler 内置事件触发器组件
核心作用:KEDA内置70+官方Scaler触发器,是KEDA采集外部各类指标的核心能力载体,每种外部组件对应专属Scaler,负责实时采集队列长度、数据条数、定时时间等核心伸缩指标。
常用核心Scaler:Cron定时触发器、RabbitMQ消息队列触发器、MySQL数据库触发器、Redis缓存队列触发器、Kafka消息队列触发器等。
四、KEDA安装流程
采用Helm包管理器安装KEDA,官方推荐生产部署方式,便于后续版本升级、配置修改、运维管理,全程一键执行,无复杂依赖。
4.1 添加KEDA官方Helm仓库
# 添加KEDA官方charts仓库
helm repo add kedacore https://kedacore.github.io/charts
# 更新本地helm仓库索引,同步最新版本
helm repo update
4.2 创建命名空间并安装KEDA核心组件
# 创建keda专属命名空间并安装KEDA,核心组件自动部署
helm install keda kedacore/keda --namespace keda --create-namespace
4.3 验证KEDA安装部署状态
# 查看keda命名空间下所有Pod,确保全部为Running运行状态
kubectl get po -n keda
# 查看KEDA所有自定义CRD资源,确认四大核心组件注册成功
kubectl api-resources | grep keda
预期结果:keda-admission-webhooks、keda-operator、keda-operator-metrics-apiserver三个核心Pod全部Running,TriggerAuthentication、ScaledObject、ScaledJob等CRD资源正常展示,即为安装成功。
五、核心场景
5.1 场景一:Cron周期性定时扩缩容
业务需求:业务仅每日早7点-9点为流量高峰,需要扩容至3个副本,其余时间维持1个基础副本。
5.1.1 带完整注释ScaledObject定时配置 cron.yaml
# KEDA核心伸缩资源API版本
apiVersion: keda.sh/v1alpha1
# 资源类型:常驻服务伸缩配置
kind: ScaledObject
# 资源元数据配置
metadata:
name: cron-scaledobject # 定时伸缩规则名称,自定义
namespace: default # 目标业务服务所在命名空间,按需修改
spec:
scaleTargetRef:
name: nginx-server # 绑定需要定时扩缩容的目标Deployment服务名称
minReplicaCount: 1 # 业务低峰期最小副本数,基础常驻数量
maxReplicaCount: 100 # 业务高峰期最大扩容副本数,限制扩容上限防资源打爆
cooldownPeriod: 300 # 冷却时间,单位秒,高峰期结束后5分钟再缩容,防止流量抖动频繁扩缩容
# 触发器配置:选用cron定时触发器
triggers:
- type: cron
metadata:
timezone: Asia/Shanghai # 定时时区,统一配置上海时区,避免时差偏差
start: 00 07 * * * # 扩容开始时间:每日早上7点整
end: 00 09 * * * # 缩容恢复时间:每日早上9点整
desiredReplicas: "3" # 高峰期扩容后的目标副本数量
5.1.2 实操创建、验证、清理命令
# 创建定时伸缩规则
kubectl create -f cron.yaml
# 查看ScaledObject伸缩规则运行状态
kubectl get so
# 查看KEDA自动生成的HPA资源
kubectl get hpa
# 测试完成后清理资源
kubectl delete -f cron.yaml
5.2 场景二:RabbitMQ消息队列扩缩容
业务需求:后端消费者服务监听RabbitMQ队列,队列堆积消息越多,消费者Pod自动扩容加速消费;
5.2.1 第一步:RabbitMQ服务基础配置 rabbitmq.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: rabbitmq
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: rabbitmq
template:
metadata:
labels:
app: rabbitmq
spec:
containers:
- name: rabbitmq
image: registry.cn-beijing.aliyuncs.com/dotbalo/rabbitmq:4.0.5-management-alpine
env:
- name: TZ
value: Asia/Shanghai
- name: RABBITMQ_DEFAULT_USER
value: user # RabbitMQ登录用户名
- name: RABBITMQ_DEFAULT_PASS
value: password # RabbitMQ登录密码
ports:
- containerPort: 5672 # 消息通信端口
- containerPort: 15672 # 管理后台端口
---
# RabbitMQ服务暴露配置
apiVersion: v1
kind: Service
metadata:
name: rabbitmq
spec:
type: NodePort
selector:
app: rabbitmq
ports:
- port: 5672
targetPort: 5672
name: web
- port: 15672
targetPort: 15672
name: http
5.2.2 第二步:认证资源配置(Secret+TriggerAuthentication)rabbitTriggerAuth.yaml
# 存储RabbitMQ连接敏感信息Secret配置
apiVersion: v1
kind: Secret
metadata:
name: keda-rabbitmq-secret # 密钥资源名称,后续认证引用
namespace: default
type: Opaque
stringData:
host: amqp://user:password@rabbitmq:5672 # RabbitMQ完整连接地址,账号密码对应上述配置
---
# KEDA认证绑定配置,关联Secret敏感信息
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: keda-trigger-auth-rabbitmq-conn # KEDA认证名称,伸缩规则引用
namespace: default
spec:
secretTargetRef:
- parameter: host # KEDA RabbitMQ触发器约定连接参数名
name: keda-rabbitmq-secret # 关联上述Secret资源名称
key: host # Secret中存储连接地址的键名
5.2.3 第三步:RabbitMQ伸缩核心配置 rabbitmq-so.yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: rabbitmq-scaledobject
namespace: default
spec:
scaleTargetRef:
name: rabbitmq-consumer # 绑定RabbitMQ消费者Deployment服务名称
pollingInterval: 5 # 每5秒轮询一次RabbitMQ队列消息数量,检测扩容条件
cooldownPeriod: 30 # 冷却时间30秒,消费完成后快速缩容
minReplicaCount: 1 # 最小常驻消费者副本数
maxReplicaCount: 30 # 最大扩容副本数,防止队列暴涨资源耗尽
# RabbitMQ消息队列触发器配置
triggers:
- type: rabbitmq
metadata:
protocol: amqp # RabbitMQ通信协议
queueName: hello # 监听的目标消息队列名称
mode: QueueLength # 扩缩容判断模式:按队列消息总长度
value: "50" # 队列消息超过50条即触发扩容
authenticationRef:
name: keda-trigger-auth-rabbitmq-conn # 引用上述KEDA认证资源
5.2.4 全套实操创建、压测、清理命令
# 1、创建RabbitMQ服务及消费者
kubectl create -f rabbitmq.yaml
kubectl create -f rabbitmq-consumer.yaml
# 2、创建认证资源及伸缩规则
kubectl create -f rabbitTriggerAuth.yaml
kubectl create -f rabbitmq-so.yaml
# 3、模拟写入大量消息,触发扩容测试
kubectl create -f rabbitmq-publish-job.yaml
# 4、查看HPA扩容状态及Pod副本变化
kubectl get hpa
kubectl get po
# 5、测试完成全套资源清理
kubectl delete -f rabbitmq-consumer.yaml -f rabbitmq-so.yaml -f rabbitTriggerAuth.yaml -f rabbitmq-publish-job.yaml
5.3 场景三:MySQL业务数据扩缩容
业务需求:数据库订单表存在大量待处理pending状态订单时,自动扩容订单处理Pod;
5.3.1 认证资源配置 mysqlTriggerAuth.yaml(带注释)
# 存储MySQL数据库连接账号密码密钥
apiVersion: v1
kind: Secret
metadata:
name: keda-mysql-secret
namespace: default
type: Opaque
stringData:
mysql_conn_str: root:password@tcp(mysql:3306)/dukuan # MySQL连接地址、账号、密码、库名
---
# KEDA MySQL触发器认证绑定配置
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: keda-trigger-auth-mysql-conn
namespace: default
spec:
secretTargetRef:
- parameter: connectionString # KEDA MySQL触发器约定参数名
name: keda-mysql-secret # 关联MySQL连接密钥名称
key: mysql_conn_str # 密钥中连接信息键名
5.3.2 MySQL伸缩核心配置 mysql-so.yaml(带注释)
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: mysql-scaledobject
namespace: default
spec:
scaleTargetRef:
name: update-orders # 绑定订单处理Deployment服务名称
pollingInterval: 5 # 每5秒查询一次MySQL待处理订单数量
cooldownPeriod: 30 # 订单处理完成30秒后缩容
minReplicaCount: 1 # 最小订单处理副本数
maxReplicaCount: 5 # 最大扩容副本数
# MySQL数据库触发器配置
triggers:
- type: mysql
metadata:
# 自定义SQL查询:统计待处理pending状态订单总数量
query: "SELECT COUNT(*) FROM orders WHERE status='pending'"
queryValue: "4.4" # 查询结果超过该数值即触发扩容
authenticationRef:
name: keda-trigger-auth-mysql-conn # 引用MySQL认证资源
5.4 场景四:Redis队列ScaledJob任务扩缩容
业务需求:Redis队列存在待处理数据时,自动创建Job临时Pod处理任务,任务处理完成后Job自动销毁,无需常驻服务,适配一次性批量数据处理。
5.4.1 Redis认证配置 redis-ta.yaml(带注释)
# Redis连接账号密码密钥配置
apiVersion: v1
kind: Secret
metadata:
name: redis-so-secret
namespace: default
type: Opaque
stringData:
redis_username: "" # Redis用户名(无则为空)
redis_password: "dukuan" # Redis登录密码
---
# KEDA Redis触发器认证绑定
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
name: redis-so-ta
namespace: default
spec:
secretTargetRef:
- parameter: username
name: redis-so-secret
key: redis_username
- parameter: password
name: redis-so-secret
key: redis_password
5.4.2 ScaledJob任务伸缩配置 redis-sj.yaml(带注释)
apiVersion: keda.sh/v1alpha1
kind: ScaledJob
metadata:
name: redis-queue-scaledjob
namespace: default
spec:
jobTargetRef:
parallelism: 1 # 每个Job同时运行1个Pod处理任务
completions: 1 # Job完成1次即为任务结束
backoffLimit: 4 # 任务失败最大重试4次
template:
spec:
containers:
- name: redis-queue-consumer
image: registry.cn-beijing.aliyuncs.com/dotbalo/redis:process # 任务处理业务镜像
restartPolicy: Never
pollingInterval: 30 # 每30秒检查一次Redis队列数据
successfulJobsHistoryLimit: 3 # 保留3个成功任务历史记录
failedJobsHistoryLimit: 3 # 保留3个失败任务历史记录
maxReplicaCount: 5 # 最大同时运行5个Job任务
# Redis队列触发器配置
triggers:
- type: redis
metadata:
address: redis-master.default.svc.cluster.local:6379 # Redis连接地址
listName: test_list # 监听的Redis队列名称
listLength: "5" # 队列数据超过5条触发创建Job任务
authenticationRef:
name: redis-so-ta # 引用Redis认证资源
六、KEDA生产运维核心注意事项
- 冷却时间合理配置:cooldownPeriod参数避免业务流量瞬间波动导致频繁扩缩容,生产常驻服务建议设置300秒,临时任务设置30秒。
- 敏感信息统一管理:所有数据库、消息队列账号密码必须存入Secret,通过TriggerAuthentication关联,禁止明文写入伸缩配置YAML。
- 副本上下限严格限制:maxReplicaCount务必设置合理数值,防止业务流量暴涨导致集群Pod过多,打爆服务器CPU、内存资源。
- 时区统一配置:定时Cron场景必须配置Asia/Shanghai时区,避免默认时区偏差导致定时扩容缩容时间不准。
- 资源及时清理:测试环境用完及时删除ScaledObject、ScaledJob、Secret资源,避免无效资源占用集群空间。