2. Knative Service 基础回顾:Service、Configuration、Revision 核心概念与关系
在深入流量管理与集群升级兼容性测试之前,必须重新建立对 Knative Service 核心资源模型的精确理解。Knative Serving 的资源模型由三个核心 CRD(自定义资源定义)构成:Service、Configuration 和 Revision。它们之间通过 Route 资源形成一套完整的“声明-构建-路由”生命周期。
2.1 核心资源定义与职责
| 资源名称 | API 版本(典型) | 核心职责 | 是否直接管理 Pod |
|---|---|---|---|
| Service (ksvc) | serving.knative.dev/v1 | 用户入口,自动管理 Configuration 和 Route 的生命周期 | 否 |
| Configuration (config) | serving.knative.dev/v1 | 定义期望的部署配置(镜像、环境变量、资源限制),每次 spec 变更生成新 Revision | 否 |
| Revision (rev) | serving.knative.dev/v1 | 不可变的快照,对应一个特定的代码版本和配置,实际驱动 Pod 的创建 | 是(通过 Deployment) |
关键认知: 用户通常只操作
Service 对象,Knative 控制器会自动创建 Configuration 和 Route。但在流量拆分、灰度发布和回滚场景中,直接理解 Revision 和 Configuration 的关系是避免配置错误的前提。
2.2 三者的层级关系与数据流
下图展示了 Knative Service 内部资源的创建与引用关系。用户提交 Service YAML 后,Controller 将其拆解为 Configuration 和 Route,Configuration 每次 spec 变更都会生成一个不可变的 Revision。
2.3 核心概念详解
2.3.1 Service — 用户操作的唯一入口
Knative Service 是对 Deployment、Service、Ingress 等 Kubernetes 原生资源的高层抽象。用户只需定义 spec.template 中的 PodSpec(容器镜像、端口、环境变量等),Knative 自动完成以下工作:
- 创建 Configuration 来追踪配置版本。
- 创建 Route 来管理流量路由。
- 根据流量规则自动调整 Pod 副本数(缩零能力)。
升级兼容性关注点: 当集群升级时,Service 的
spec.template 中引用的 API 版本或字段可能被弃用。例如,从 Knative v1.10 升级到 v1.12 时,containerConcurrency 的默认行为可能变化,导致新创建的 Revision 行为异常。
2.3.2 Configuration — 配置版本的管理者
Configuration 是 Knative 实现“不可变部署”的核心。每次用户更新 Service 的 spec.template,Configuration 都会创建一个新的 Revision。关键特性:
- 自动版本号递增: 每次变更生成
revision-001、revision-002等。 - 回滚能力: 通过
spec.template.metadata.annotations中的knative.dev/rollout或直接修改 Configuration 的spec.template指向旧 Revision 的配置。 - 状态追踪:
status.latestReadyRevisionName指示当前可用的最新 Revision。
# 查看 Configuration 状态示例
kubectl get configuration <service-name> -o jsonpath='{.status.latestReadyRevisionName}'
2.3.3 Revision — 不可变的部署快照
Revision 是 Knative 中最底层的部署单元,它直接对应一个 Kubernetes Deployment。每个 Revision 包含:
- 完整的 PodSpec 快照(镜像、命令、环境变量、资源限制)。
- 自动生成的 Revision 名称(如
helloworld-v1-abc123)。 - 独立的端点状态,供 Route 进行流量分发。
升级兼容性陷阱: Revision 一旦创建即不可变。集群升级后,旧 Revision 的 Pod 可能因底层 API 变更(如 PodSecurityPolicy 移除、CRD 版本迁移)而无法正常启动。这是兼容性测试必须覆盖的场景。
2.4 三者的生命周期交互流程
以下流程描述了一个典型的 Knative Service 从创建到更新的完整生命周期:
- 创建 Service: 用户提交
ksvcYAML,Knative 控制器创建 Configuration 和 Route。 - Configuration 生成 Revision: Configuration 根据
spec.template创建第一个 Revision(rev-001),并启动 Pod。 - Route 路由流量: Route 默认将 100% 流量指向
status.latestReadyRevisionName(即 rev-001)。 - 更新 Service: 用户修改镜像版本,Service 更新 Configuration 的
spec.template。 - 生成新 Revision: Configuration 创建 rev-002,新 Pod 启动,旧 Pod 保持运行。
- 流量切换: 用户通过 Route 的
spec.traffic逐步将流量从 rev-001 切到 rev-002(灰度发布)。 - 回收旧 Revision: 当 rev-002 稳定后,用户可移除 rev-001 的流量条目,Knative 自动缩容旧 Pod。
2.5 流量管理中的角色分配
在流量管理与集群升级兼容性测试的上下文中,三个资源的分工如下:
| 场景 | Service 角色 | Configuration 角色 | Revision 角色 |
|---|---|---|---|
| 灰度发布 | 触发新配置 | 生成新 Revision | 承载不同版本的 Pod |
| 流量回滚 | 修改 Route 流量规则 | 保留旧 Revision 配置 | 旧版本 Pod 保持运行 |
| 集群升级验证 | 保持 YAML 不变 | 检查新 Revision 是否正常创建 | 验证旧 Revision Pod 是否兼容 |
| 缩零与冷启动 | 定义缩零策略 | 记录最后配置 | Pod 被回收,Revision 元数据保留 |
测试策略提示: 在集群升级前,应保留至少两个不同配置的 Revision(如 rev-001 和 rev-002),并分别分配流量。升级后观察:1) 旧 Revision 的 Pod 能否正常提供服务;2) 新创建的 Revision 是否使用升级后的 API 版本。