周顺的技术博客

  • 一、文档概述
  • 二、KEDA核心基础介绍
  • 2.1 KEDA核心定义
  • 2.2 KEDA与原生HPA核心差异化对比
  • 2.3 KEDA核心适用业务场景
  • 三、KEDA四大核心组件深度详解
  • 3.1 TriggerAuthentication 认证授权核心组件
  • 3.2 ScaledObject 常驻服务伸缩核心组件
  • 3.3 ScaledJob 临时任务伸缩核心组件
  • 3.4 Scaler 内置事件触发器组件
  • 四、KEDA安装流程
  • 4.1 添加KEDA官方Helm仓库
  • 4.2 创建命名空间并安装KEDA核心组件
  • 4.3 验证KEDA安装部署状态
  • 五、核心场景
  • 5.1 场景一:Cron周期性定时扩缩容
  • 5.1.1 带完整注释ScaledObject定时配置 cron.yaml
  • 5.1.2 实操创建、验证、清理命令
  • 5.2 场景二:RabbitMQ消息队列扩缩容
  • 5.2.1 第一步:RabbitMQ服务基础配置 rabbitmq.yaml
  • 5.2.2 第二步:认证资源配置(Secret+TriggerAuthentication)rabbitTriggerAuth.yaml
  • 5.2.3 第三步:RabbitMQ伸缩核心配置 rabbitmq-so.yaml
  • 5.2.4 全套实操创建、压测、清理命令
  • 5.3 场景三:MySQL业务数据扩缩容
  • 5.3.1 认证资源配置 mysqlTriggerAuth.yaml(带注释)
  • 5.3.2 MySQL伸缩核心配置 mysql-so.yaml(带注释)
  • 5.4 场景四:Redis队列ScaledJob任务扩缩容
  • 5.4.1 Redis认证配置 redis-ta.yaml(带注释)
  • 5.4.2 ScaledJob任务伸缩配置 redis-sj.yaml(带注释)
  • 六、KEDA生产运维核心注意事项
  • 首页
  • 榜上有名
  • 文章归档
  • 读者排行
  • 豆瓣书影
  • 友情链接
  • DevOps (4)
  • Docker (4)
  • k8s (9)
  • linux (11)
  • Mysql (9)
  • Python (2)
  • Redis (1)
  • Shell (6)
  • 主题 (0)
  • 未分类 (0)

KEDA核心基础介绍

  • xiaoteng
  • 2026-04-11
  • 0

一、文档概述

本文档聚焦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原生HPAKEDA弹性伸缩
扩容指标来源仅支持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生产运维核心注意事项

  1. 冷却时间合理配置:cooldownPeriod参数避免业务流量瞬间波动导致频繁扩缩容,生产常驻服务建议设置300秒,临时任务设置30秒。
  2. 敏感信息统一管理:所有数据库、消息队列账号密码必须存入Secret,通过TriggerAuthentication关联,禁止明文写入伸缩配置YAML。
  3. 副本上下限严格限制:maxReplicaCount务必设置合理数值,防止业务流量暴涨导致集群Pod过多,打爆服务器CPU、内存资源。
  4. 时区统一配置:定时Cron场景必须配置Asia/Shanghai时区,避免默认时区偏差导致定时扩容缩容时间不准。
  5. 资源及时清理:测试环境用完及时删除ScaledObject、ScaledJob、Secret资源,避免无效资源占用集群空间。
© 2026 周顺的技术博客
Theme by Wing
  • {{ item.name }}
  • {{ item.name }}