Knative Serving 核心资源模型:Revision、Configuration、Route、Service

Knative Serving 的资源模型是理解自动扩缩与流量调度的基础。整个模型围绕四个核心 CRD(Custom Resource Definition)构建:Service、Configuration、Revision 和 Route。它们共同定义了从代码部署到流量路由的完整生命周期。

核心认知:Knative Service 是用户操作的唯一入口,它内部自动管理 Configuration、Revision 和 Route 的创建与联动。日常工作中,你只需要编写 Service YAML,其余资源由 Knative 控制器自动生成。

2.1 四层资源模型总览

下图展示了 Knative Serving 的四层资源模型及其关系。Service 作为顶层抽象,向下管理 Configuration 和 Route;Configuration 每次变更都会生成一个新的 Revision;Route 根据流量规则将请求分发到指定的 Revision。

Knative Serving 四层资源模型 Service(服务) Configuration(配置) Route(路由) Revision v1(修订版 v1) Revision v2(修订版 v2) Revision v3(修订版 v3) 流量分配示例 • Revision v1: 10% 流量(灰度) • Revision v2: 90% 流量(主版本) • Revision v3: 0% 流量(备用回滚) 用户只操作 Service,Knative 自动管理 Configuration → Revision → Route 的联动

2.2 四大资源详解

2.2.1 Revision(修订版)—— 不可变的快照

Revision 是 Knative Serving 中最核心的不可变资源。每次 Configuration 的 spec.template 发生变更(例如修改环境变量、镜像版本、资源请求/限制),Knative 都会自动创建一个新的 Revision。每个 Revision 代表一个特定配置的快照,包含完整的 PodTemplateSpec。

  • 不可变性:Revision 一旦创建,其 spec 不可修改。任何变更都只能通过创建新的 Revision 实现。
  • 自动扩缩单元:每个 Revision 可以独立进行自动扩缩(缩容到零、扩容到目标并发数)。
  • 版本管理:默认保留最近 N 个 Revision(可通过 revision-history-limit 配置)。
  • 流量目标:Route 可以将流量精确分配到任意 Revision,支持蓝绿部署、金丝雀发布。
关键指标:Revision 的 metadata.generation 与 status.observedGeneration 一致时,表示 Revision 已就绪。这是判断 Pod 是否完成启动的重要依据。

2.2.2 Configuration(配置)—— 期望状态的描述

Configuration 负责描述服务的“期望状态”。它定义了 Revision 的模板(spec.template),包括容器镜像、环境变量、资源配额、探针等。Configuration 的每次更新都会触发 Revision 的创建。

Configuration 字段 说明 典型值
spec.template Revision 的 PodTemplateSpec 模板 包含 containers、volumes、env 等
spec.template.spec.containerConcurrency 单个 Pod 最大并发请求数 0(无限制)或 10/50/100
spec.template.spec.timeoutSeconds 请求超时时间 300(默认)
status.latestCreatedRevisionName 最新创建的 Revision 名称 hello-world-00002
status.latestReadyRevisionName 最新就绪的 Revision 名称 hello-world-00002

2.2.3 Route(路由)—— 流量分发策略

Route 负责将外部请求按照配置的流量比例分发到不同的 Revision。它支持灵活的流量管理策略,是实现灰度发布、A/B 测试、蓝绿部署的核心组件。

  • 流量比例:通过 spec.traffic 字段定义每个 Revision 的流量百分比,总和必须为 100。
  • 默认目标:可以设置 @latest 指向 Configuration 的最新就绪 Revision,简化配置。
  • 命名 Revision:支持按 Revision 名称精确分配流量,例如 revisionName: "hello-world-00001"。
  • URL 分配:每个 Route 会生成一个唯一的 URL(如 http://hello-world.default.example.com),作为服务访问入口。
# Route 流量配置示例
apiVersion: serving.knative.dev/v1
kind: Route
metadata:
  name: hello-world
spec:
  traffic:
    - revisionName: hello-world-00001
      percent: 10        # 10% 流量到旧版本
    - revisionName: hello-world-00002
      percent: 90        # 90% 流量到新版本
    - latestRevision: true
      percent: 0         # 预留 0% 用于快速切换

2.2.4 Service(服务)—— 用户唯一操作入口

Service 是 Knative Serving 对用户暴露的最高层抽象。它自动管理 Configuration 和 Route 的生命周期。用户只需编写 Service YAML,Knative 控制器会自动创建对应的 Configuration 和 Route,并保持三者同步。

避坑指南:不要手动修改由 Service 自动生成的 Configuration 或 Route。任何手动修改都会被 Service 控制器覆盖回期望状态。如果需要精细控制,可以直接使用 Configuration + Route 组合,而不使用 Service 抽象。

2.3 资源模型工作流程

当用户提交一个 Service YAML 时,Knative Serving 内部执行以下步骤:

  1. Service 控制器接收到 Service 资源,检查 spec.template 是否变更。
  2. 如果 spec.template 有变化,Configuration 控制器创建一个新的 Revision,Revision 名称格式为 {service-name}-{递增序号}。
  3. 新 Revision 的 Pod 自动扩缩控制器(KPA/HA)开始工作:如果配置了缩容到零,且当前无请求,Pod 数量变为 0。
  4. Route 控制器更新路由规则,将 @latest 指向新 Revision,并根据 spec.traffic 分配流量。
  5. 当请求到达 Route 的 URL 时,Activator(如果 Pod 缩容到零)或 Queue Proxy(如果 Pod 运行中)将请求转发到目标 Revision 的 Pod。
Service 提交后的资源创建流程 1. 提交 Service 2. 创建 Revision 3. 启动 Pod 4. 更新路由 关键时间点说明 • T0:用户提交 Service YAML,Knative 控制器开始协调 • T1:Configuration 检测到 template 变更,创建新 Revision(状态为 Unknown) • T2:Revision 控制器创建 Pod,Pod 进入 Running 状态 • T3:Pod 通过就绪探针,Revision 状态变为 Ready • T4:Route 将流量切换到新 Revision,旧 Revision 根据保留策略保留或删除

2.4 资源模型对比总结

资源 职责 是否可变 用户直接操作 自动扩缩范围
Service 顶层抽象,管理 Configuration + Route 可变 是(推荐) 间接管理
Configuration 定义 Revision 模板,管理版本 可变 可(高级场景) 无
Revision 不可变快照,包含 PodTemplateSpec 不可变 否 每个 Revision 独立扩缩
Route 流量分发,支持灰度/蓝绿 可变 可(高级场景) 无
最佳实践:在 CI/CD 流水线中,每次代码提交触发 Service YAML 更新时,Knative 自动创建新 Revision。流水线可以利用 kubectl wait --for=condition=Ready revision/hello-world-00003 等待新版本就绪,然后通过 Route 的流量配置逐步切流,实现零停机发布。