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)。
关键原则: 每个 Traffic Target 要么是 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
实践要点: 百分比分配时,建议至少保留一个 Target 指向最新 Revision(即使百分比为 0),以便后续快速将流量切回最新版本。如果所有 Target 都指向固定 Revision,新创建的 Revision 将不会收到任何流量。

3.3 流量分配模型图解

下图展示了 Knative Service 流量管理的核心模型,包含三种路由模式及其与 Revision 的关系:

Knative Service 流量管理核心模型 Knative Service 流量管理核心模型 Ingress 流量入口 Traffic 路由决策(spec.traffic) 最新 Revision 路由 latestRevision: true 百分比分配路由 混合分配(80% + 20%) 固定 Revision 路由 revisionName: "xxx" Revision v2(最新) 自动跟随最新代码 100% 流量 Revision v1(固定) 80% 流量 Revision v2(最新)20% 流量 Revision v1(固定) 始终指向 v1 100% 流量 说明 • 最新 Revision 路由:动态指向最新版本,适合持续部署 • 固定 Revision 路由:锁定历史版本,适合稳定服务 • 百分比分配:支持灰度发布、A/B 测试、蓝绿部署

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 状态之间的转换关系:

流量分配与 Revision 状态转换 流量分配与 Revision 状态转换 活跃(Active) 备用(Standby) 孤立(Orphan) 流量降为 0% 从 traffic 移除 垃圾回收 重新分配流量 状态转换规则 • 活跃 → 备用:流量从 >0% 变为 0%,但仍在 traffic 中引用 • 备用 → 活跃:重新分配 >0% 的流量 • 备用 → 孤立:从 traffic 数组中移除该 Target • 孤立 → 删除:Knative 根据保留策略自动清理孤立 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 创建后,流量会自动指向最新版本,可能导致意外切流。