1. 课程导学:KEDA是什么、为什么需要自定义Metric触发器、课程目标与前置知识
1.1 KEDA 是什么?—— Kubernetes 事件驱动自动缩放器
KEDA(Kubernetes Event-Driven Autoscaling)是一个轻量级的开源组件,它扩展了 Kubernetes 原生的 Horizontal Pod Autoscaler(HPA),使得 Pod 的弹性伸缩不再局限于 CPU / 内存等资源指标,而是可以基于 外部事件源(如消息队列长度、数据库连接数、HTTP 请求速率、自定义业务指标)进行实时、精准的伸缩决策。
KEDA 的核心价值在于:
- 事件驱动:当事件源有负载时,KEDA 激活工作负载(从 0 到 1);当事件源空闲时,KEDA 将工作负载缩回 0(从 1 到 0)。
- 与 HPA 深度集成:KEDA 本身不直接管理 Pod 副本数,而是作为 HPA 的“指标提供者”,将外部事件数据转换为 HPA 可消费的指标。
- 丰富的 Scaler 生态:内置 50+ 官方 Scaler(Kafka、RabbitMQ、Prometheus、AWS SQS、Azure Queue 等),同时支持自定义 Scaler 开发。
一句话总结:KEDA 让 Kubernetes 工作负载能够根据任何外部事件源的负载情况自动伸缩,实现真正的“按需计算”。
1.2 为什么需要自定义 Metric 触发器?
虽然 KEDA 内置了丰富的 Scaler,但在实际生产环境中,我们经常会遇到以下场景:
| 场景 | 内置 Scaler 是否满足 | 说明 |
|---|---|---|
| 基于 Redis 流(Stream)长度伸缩 | ❌ 不满足 | 内置 Scaler 仅支持 Redis List,不支持 Stream 的消费者组待处理消息数 |
| 基于 MongoDB 聚合管道结果伸缩 | ❌ 不满足 | 内置 Scaler 仅支持简单的文档计数,无法执行复杂聚合 |
| 基于内部业务 API 的排队任务数伸缩 | ❌ 不满足 | 需要调用公司内部 HTTP API 获取指标,无现成 Scaler |
| 基于 Prometheus 自定义 PromQL 查询结果伸缩 | ✅ 部分满足 | 内置 Prometheus Scaler 支持 PromQL,但无法处理认证、分片等复杂场景 |
| 基于 Kafka 消费者 Lag 伸缩 | ✅ 满足 | 内置 Kafka Scaler 已支持,无需自定义 |
从表格可以看出,自定义 Metric 触发器(Custom Scaler) 是解决“长尾需求”的关键能力。通过开发自定义 Scaler,你可以:
- 接入任何能够返回数值指标的数据源(数据库、API、文件、硬件传感器等)。
- 实现业务级别的精细伸缩策略(如:仅当“待处理订单数 > 100 且 平均处理时间 > 5s”时扩容)。
- 复用公司已有的监控基础设施,避免引入额外组件。
课程核心观点:掌握自定义 Scaler 开发,意味着你不再受限于 KEDA 官方生态,可以自由地将任何业务指标转化为弹性伸缩决策。
1.3 KEDA 架构与自定义 Scaler 位置
下图展示了 KEDA 的核心架构以及自定义 Scaler 在整个系统中的位置:
从架构图可以看出,自定义 Scaler 位于 Scaler 层,与内置 Scaler 平级。KEDA 核心通过统一的 Scaler 接口调用自定义 Scaler,获取指标值,然后通过 Metric Adapter 暴露给 HPA。整个链路清晰且可扩展。
1.4 课程目标与学习路径
本课程旨在帮助你从零到一掌握 KEDA 自定义 Scaler 的开发、测试与部署。完成本课程后,你将能够:
- 理解 KEDA 核心概念:ScaledObject、Trigger、Scaler 接口、Metric Adapter 的工作原理。
- 掌握自定义 Scaler 开发流程:使用 Go 语言实现
Scaler接口(GetMetrics、GetMetricSpecForScaling、Close)。 - 对接真实数据源:以 Redis Stream、MongoDB、HTTP API 为例,开发可投产的自定义 Scaler。
- 测试与调试:编写单元测试、集成测试,使用 KEDA 本地开发环境进行端到端验证。
- 部署与运维:将自定义 Scaler 打包为容器镜像,部署到生产集群,并配置监控告警。
| 章节模块 | 核心内容 | 实战产出 |
|---|---|---|
| 第 1-3 章 | KEDA 基础、ScaledObject 配置、内置 Scaler 实战 | 使用内置 Scaler 完成 Kafka 消费者自动伸缩 |
| 第 4-6 章 | 自定义 Scaler 接口详解、Go 语言开发环境搭建 | 实现一个“Hello World”级别的自定义 Scaler |
| 第 7-10 章 | 对接 Redis Stream、MongoDB、HTTP API 数据源 | 三个可复用的生产级自定义 Scaler |
| 第 11-12 章 | 测试、调试、性能优化与安全 | 完整的测试套件与安全加固方案 |
| 第 13-15 章 | 容器化部署、Helm Chart、生产运维 | 自动化 CI/CD 流水线与生产部署手册 |
1.5 前置知识要求
为了确保学习效果,建议你具备以下基础:
⚠️ 重要提示:本课程不是零基础入门课。如果你对以下知识点不熟悉,建议先花 1-2 周时间补齐基础。
| 知识领域 | 具体要求 | 推荐学习资源 |
|---|---|---|
| Kubernetes 基础 | 熟悉 Pod、Deployment、Service、HPA 概念;能使用 kubectl 操作集群 | Kubernetes 官方文档“入门”部分 |
| Go 语言基础 | 掌握 Go 语法、接口、结构体、错误处理;能编写简单的 HTTP 客户端 | 《Go 语言程序设计》前 8 章 |
| Docker 基础 | 能编写 Dockerfile 并构建镜像 | Docker 官方快速入门 |
| 消息队列 / 数据库基础 | 了解 Redis、MongoDB、Kafka 的基本概念和常用操作 | 各产品官方 5 分钟快速开始 |
1.6 课程技术栈总览
本课程涉及的技术栈与版本如下(建议保持一致以避免兼容性问题):
1.7 学习建议与课程约定
- 动手实践:每章都配有可运行的代码示例,请务必在本地或测试集群中跟随操作。
- 版本对齐:使用课程推荐的版本号,避免因版本差异导致 API 不兼容。
- 代码仓库:所有代码均托管在课程配套仓库,每章末尾会标注对应代码目录。
- 提问方式:遇到问题时,请提供
kubectl get scaledobject -o yaml输出、KEDA Operator 日志以及自定义 Scaler 的日志,以便快速定位。
💡 学习心态:自定义 Scaler 开发并不复杂——你只需要实现 3 个方法。真正的挑战在于理解数据源的业务语义,并将其转化为合理的伸缩策略。本课程会带你逐一攻克这些挑战。