3、流量管理核心模型:Traffic 目标、百分比分配、最新 Revision 与固定 Revision 路由
Knative Service 的流量管理模型是 Serverless 灰度发布与版本控制的核心。它通过 Traffic 目标(Traffic Target) 将流量精确分配到不同的 Revision 上,支持按百分比分配、按最新 Revision 路由以及按固定 Revision 路由三种模式。理解这一模型是掌握 Knative 流量治理的基础。
3.1 核心概念:Traffic Target
在 Knative Service 的 YAML 配置中,spec.traffic 字段是一个数组,每个元素定义了一个 Traffic Target。每个 Target 必须指定一个 Revision(最新或固定)以及对应的 流量百分比。所有 Target 的百分比之和必须为 100。
| 字段 | 类型 | 说明 |
|---|---|---|
latestRevision |
bool | 是否指向当前 Service 的最新 Revision。为 true 时,revisionName 字段被忽略。 |
revisionName |
string | 指定一个具体的 Revision 名称。仅当 latestRevision 为 false 时生效。 |
percent |
int | 分配给该 Target 的流量百分比(0-100)。所有 Target 的 percent 之和必须等于 100。 |
tag |
string | 可选。为该 Target 分配一个自定义标签,用于生成独立的访问 URL(如 tag-based-host)。 |
latestRevision: true(动态指向最新 Revision),要么是 revisionName: "xxx"(固定指向某个历史 Revision)。两者不能同时设置。
3.2 三种路由模式详解
3.2.1 最新 Revision 路由(Latest Revision)
当 latestRevision: true 时,流量会自动指向当前 Service 的最新 Revision。每次代码更新或配置变更生成新 Revision 后,流量会无缝切换到新版本。这是最常用的默认模式。
spec:
traffic:
- latestRevision: true
percent: 100
3.2.2 固定 Revision 路由(Fixed Revision)
通过 revisionName 指定一个具体的 Revision,流量将始终指向该固定版本,不会随新 Revision 的创建而改变。适用于需要锁定某个稳定版本进行长期服务的场景。
spec:
traffic:
- revisionName: "hello-world-00001"
percent: 100
3.2.3 百分比分配路由(Percentage Split)
将流量按比例分配到多个 Revision 上,支持最新 Revision 与固定 Revision 的混合分配。这是实现灰度发布、蓝绿部署、A/B 测试的核心手段。
spec:
traffic:
- revisionName: "hello-world-00001"
percent: 80
- latestRevision: true
percent: 20
3.3 流量分配模型图解
下图展示了 Knative Service 流量管理的核心模型,包含三种路由模式及其与 Revision 的关系:
3.4 流量分配策略对比
| 策略 | 配置方式 | 适用场景 | 风险等级 |
|---|---|---|---|
| 全量最新 | latestRevision: true, percent: 100 |
开发环境、快速迭代 | 低(自动回滚) |
| 全量固定 | revisionName: "v1", percent: 100 |
生产环境稳定版本 | 低(版本锁定) |
| 金丝雀发布 | revisionName: "v1", percent: 90 + latestRevision: true, percent: 10 |
灰度验证新版本 | 中(需监控) |
| 蓝绿部署 | revisionName: "blue", percent: 100 → 切换为 revisionName: "green", percent: 100 |
零停机版本切换 | 低(全量切换) |
| A/B 测试 | revisionName: "A", percent: 50 + revisionName: "B", percent: 50 |
功能对比实验 | 中(需分流标识) |
3.5 流量配置的原子操作
Knative 提供 kn service update 命令来管理流量分配,以下是常用操作示例:
# 将 100% 流量指向最新 Revision
kn service update <service-name> --traffic @latest=100
# 将 80% 流量指向 v1,20% 指向最新 Revision
kn service update <service-name> --traffic v1=80,@latest=20
# 将 100% 流量指向固定 Revision v1
kn service update <service-name> --traffic v1=100
# 为特定 Revision 打标签,生成独立访问 URL
kn service update <service-name> --tag v1=stable
--traffic 更新流量分配时,如果省略了某个已有的 Revision,该 Revision 的流量会被自动置为 0。务必确保所有 Target 的百分比之和为 100,否则命令会报错。
3.6 流量分配与 Revision 生命周期
Revision 的流量分配状态直接影响其生命周期:
- 活跃 Revision: 至少收到 1% 流量的 Revision 会保持活跃状态,Pod 持续运行。
- 备用 Revision: 流量为 0% 但被
traffic引用的 Revision 会进入备用状态,Pod 可能被缩容至 0,但配置保留。 - 孤立 Revision: 未被任何 Traffic Target 引用的 Revision 会被标记为孤立,最终可能被垃圾回收。
下图展示了流量分配与 Revision 状态之间的转换关系:
3.7 最佳实践与避坑指南
- 始终保留一个
@latest的 Traffic Target(即使百分比为 0),以便快速切流。 - 使用
--tag为不同 Revision 打标签,方便通过独立 URL 直接访问特定版本进行测试。 - 在灰度发布时,从 1%-5% 的小流量开始,逐步增加比例,并配合监控指标决定是否全量。
- 使用
kn revision list查看所有 Revision 的流量分配状态,确保没有意外孤立。
- 百分比之和不为 100: Knative 会拒绝配置更新,必须确保所有 Target 的 percent 之和等于 100。
- 同时设置 latestRevision 和 revisionName: 同一个 Target 中两者互斥,只能设置其中一个。
- 流量切到孤立 Revision: 如果 Revision 已被垃圾回收,分配流量会导致 404 错误。
- 忽略 @latest 的自动更新: 当
latestRevision: true的 Target 存在时,每次新 Revision 创建后,流量会自动指向最新版本,可能导致意外切流。