Knative Serving 核心资源模型详解

Knative Serving 定义了四个核心资源对象:Service、Route、Configuration 和 Revision。这四个资源构成了 Knative Serverless 工作负载的完整生命周期管理模型,也是后续进行容量参数配置与网络瓶颈诊断的基础。

2.1 四层资源模型概述

Knative Serving 采用分层抽象的设计思想,将用户请求的流量管理、配置管理和版本管理解耦为独立的资源对象。下表总结了每个资源的核心职责与关键属性:

资源对象 缩写 核心职责 关键属性
Service ksvc 用户入口,自动管理 Route 和 Configuration spec.template(Revision 模板)、spec.traffic(流量分配)
Route route 流量路由与灰度发布 spec.traffic(目标 Revision + 百分比)
Configuration config 部署配置与版本追踪 spec.template(PodSpec)、status.latestCreatedRevisionName
Revision rev 不可变快照,代表一个特定版本的代码+配置 spec.containerConcurrency、spec.timeoutSeconds
关键理解:Service 是用户最常操作的资源,它自动创建 Route 和 Configuration。当用户更新 Service 的 template 时,Knative 会生成新的 Revision,并默认将 100% 流量指向最新 Revision。

2.2 资源模型工作流程

下图展示了 Knative Serving 四层资源模型在用户部署一个 Serverless 应用时的完整工作流程:

Knative Serving 四层资源模型工作流程 用户:kubectl apply -f service.yaml Service (ksvc) 用户入口,自动编排下层资源 Configuration (config) 管理部署模板与版本历史 Route (route) 流量路由与灰度策略 生成新版本 Revision (rev) 不可变快照:代码 + 配置 流量分配 实例化 Pod (User Container) 实际运行的工作负载 工作流程说明: 1. Service 接收用户请求,创建 Configuration 和 Route 2. Configuration 生成新的 Revision(不可变快照) 3. Route 根据流量规则将请求路由到指定 Revision 4. Revision 通过 KPA 自动扩缩容为实际 Pod

2.3 各资源模型深度解析

2.3.1 Revision — 不可变版本快照

Revision 是 Knative Serving 中最核心的底层资源,代表一个特定版本的代码、配置和运行时环境的不可变快照。每次用户修改 Service 或 Configuration 的 template 时,Knative 都会创建一个新的 Revision。

Revision 的关键特性:
  • 不可变性:一旦创建,Revision 的 spec 不可修改。任何变更都会生成新的 Revision。
  • 自动扩缩容:每个 Revision 关联一个 KPA(Knative Pod Autoscaler),根据并发请求数自动调整 Pod 副本数。
  • 版本追踪:Configuration 维护所有 Revision 的历史记录,支持回滚到任意旧版本。
  • 流量目标:Route 可以指定将流量发送到特定 Revision,实现灰度发布和蓝绿部署。

以下是一个 Revision 的 YAML 示例,展示了关键的容量参数配置:

apiVersion: serving.knative.dev/v1
kind: Revision
metadata:
  name: helloworld-go-00001
  namespace: default
spec:
  containerConcurrency: 50          # 每个 Pod 最大并发请求数
  timeoutSeconds: 300               # 请求超时时间
  podAutoscaler:
    class: kpa.autoscaling.knative.dev
    metrics: concurrency            # 基于并发数扩缩容
    target: 10                      # 每个 Pod 目标并发数
  containers:
  - image: gcr.io/knative-samples/helloworld-go
    resources:
      requests:
        cpu: 250m
        memory: 128Mi
      limits:
        cpu: 500m
        memory: 256Mi

2.3.2 Configuration — 部署配置与版本管理

Configuration 负责管理部署模板和版本历史。它定义了 Pod 的期望状态(容器镜像、环境变量、资源限制等),并自动追踪每次变更生成的 Revision。

Configuration 字段 说明 对容量的影响
spec.template Revision 的 PodSpec 模板 定义容器资源 request/limit
status.latestCreatedRevisionName 最新创建的 Revision 名称 用于追踪当前活跃版本
status.latestReadyRevisionName 已就绪的最新 Revision 名称 确认版本是否可接收流量
status.generation 配置的迭代版本号 用于检测配置变更

2.3.3 Route — 流量路由与灰度发布

Route 负责将外部请求按照配置的流量规则分发到不同的 Revision。它是实现灰度发布、蓝绿部署和流量回滚的核心组件。

Route 的流量分配规则支持两种模式:

  • 按百分比分配:将流量按百分比拆分到多个 Revision,适用于 A/B 测试和金丝雀发布。
  • 按标签分配:通过 HTTP Header 或 URL 参数将特定流量路由到指定 Revision,适用于内部测试。
apiVersion: serving.knative.dev/v1
kind: Route
metadata:
  name: helloworld-go
  namespace: default
spec:
  traffic:
  - revisionName: helloworld-go-00001
    percent: 90                    # 90% 流量到稳定版本
  - revisionName: helloworld-go-00002
    percent: 10                    # 10% 流量到新版本(金丝雀)
  - revisionName: helloworld-go-00003
    tag: latest                    # 通过标签访问,不参与百分比分配

2.3.4 Service — 用户统一入口

Service 是用户最常操作的资源,它自动管理 Route 和 Configuration 的生命周期。当用户创建或更新 Service 时,Knative 控制器会自动完成以下操作:

  1. 更新 Configuration 的 template,触发新 Revision 的创建。
  2. 更新 Route 的流量规则,默认将 100% 流量指向最新就绪的 Revision。
  3. 自动创建 Knative 内部的 Cluster Local 域名,格式为:{service}.{namespace}.svc.cluster.local。
常见误区:很多用户直接操作 Route 和 Configuration 来管理流量,但 Knative 官方推荐始终通过 Service 进行操作。直接修改 Route 或 Configuration 可能导致 Service 控制器覆盖你的手动变更。

2.4 资源模型之间的协作关系

下图展示了 Service、Route、Configuration 和 Revision 之间的完整协作关系,以及它们如何共同实现 Serverless 工作负载的自动部署、流量管理和版本控制:

Knative Serving 资源协作关系图 Service 用户统一入口 Configuration 部署模板 + 版本历史 Route 流量路由 + 灰度策略 管理 管理 生成 Revision 版本链 rev-00001 (v1) rev-00002 (v2) ← 最新 rev-00003 (v3) ← 金丝雀 流量分配 流量分配示例 rev-00001: 90% rev-00003: 10% rev-00002: tag=latest

2.5 资源模型与容量参数的关系

理解四层资源模型是进行容量参数配置的前提。下表总结了每个资源层面对容量配置的影响:

资源层 容量相关参数 配置位置 对性能的影响
Revision containerConcurrency, timeoutSeconds, resources spec.containerConcurrency, spec.containers[].resources 直接决定 Pod 的处理能力和并发上限
Configuration template 中的资源定义 spec.template.spec.containers[].resources 影响 Pod 的 CPU/Memory 分配
Route 流量分配比例 spec.traffic[].percent 影响各 Revision 的负载分布
Service 自动扩缩容配置 spec.template.metadata.annotations 影响扩缩容策略和响应速度
最佳实践:在进行容量规划时,建议从 Revision 层开始配置。先确定单个 Pod 的目标并发数(containerConcurrency)和资源限制,然后通过 Service 的 annotations 配置全局扩缩容策略。Route 层的流量分配主要用于灰度发布场景,不应作为容量调整的手段。