2. Knative 核心概念回顾:Service、Revision、Configuration、Route 的关系与职责
在深入探讨生命周期漂移复测之前,必须重新校准对 Knative 核心原语的理解。Knative Serving 通过四个紧密协作的抽象层——Service、Revision、Configuration 和 Route——来定义、部署、版本化并路由 Serverless 工作负载。这四个资源共同构成了一个声明式的、自动化的生命周期管理模型。
2.1 四原语的职责与定位
每个原语在生命周期中承担不可替代的角色,下表清晰划分了它们的职责边界:
| 原语 | 核心职责 | 生命周期阶段 | 是否直接管理 Pod |
|---|---|---|---|
| Service | 用户入口,自动管理 Configuration 与 Route 的创建与同步 | 全生命周期(创建、更新、回滚) | 否(委托下层) |
| Configuration | 定义期望的 Revision 模板,驱动 Revision 的滚动更新 | 配置变更、版本生成 | 否(仅定义模板) |
| Revision | 不可变的快照,包含代码、配置、环境变量与资源限制 | 版本固化、扩缩容、流量目标 | 是(通过 Deployment/KSVC) |
| Route | 流量分发策略,将请求按比例路由到不同 Revision | 流量管理、灰度发布、蓝绿部署 | 否(仅网络规则) |
关键认知:Service 是面向用户的“全权代理”,而 Configuration 和 Route 是内部的“左右手”。Revision 是真正承载工作负载的不可变单元,任何配置变更都会产生新的 Revision,而非原地修改。
2.2 四原语的协作关系与生命周期流程
下图展示了四个原语在 Serverless 工作负载从创建到流量切换的完整协作链路:
协作流程解读:
- Service 接收用户 YAML 变更,自动更新 Configuration 和 Route。
- Configuration 根据新配置生成一个不可变的 Revision(如 rev-002)。
- Route 根据流量规则(traffic 字段)将外部请求按比例分发到不同的 Revision。
- 每个 Revision 独立管理其 Pod 的扩缩容(从 0 到 N),互不干扰。
2.3 四原语如何共同管理生命周期
Knative 的生命周期管理并非简单的“创建-运行-删除”,而是一个持续协调的闭环。四个原语通过以下机制实现协同:
- 声明式驱动:用户只修改 Service 的期望状态(如镜像版本、环境变量),Knative 控制器自动计算差异并驱动 Configuration 和 Route 执行变更。
- 版本链与回滚:Configuration 维护一个 Revision 列表,每个 Revision 是历史快照。回滚时只需将 Route 的流量指向旧 Revision,无需重新构建。
- 流量解耦:Route 不关心 Revision 内部的 Pod 状态,只负责流量转发。Revision 的扩缩容由 Autoscaler 独立处理,两者通过 Service 的端点信息间接通信。
- 生命周期漂移的检测基础:当 Revision 的实际 Pod 状态(如就绪副本数、镜像拉取失败)与 Configuration 定义的期望状态不一致时,即产生“生命周期漂移”。Service 的 Status 字段会聚合这些差异,为复测提供数据源。
常见误解澄清:不要将 Knative Service 等同于 Kubernetes Service。Knative Service 是一个高层抽象,内部包含 Configuration 和 Route;而 Kubernetes Service 仅用于网络负载均衡。在生命周期漂移复测中,我们关注的是 Knative Service 的
status.conditions 和 Revision 的 status,而非底层 K8s Service。
2.4 核心原语在生命周期漂移复测中的角色
在后续章节的漂移复测场景中,每个原语都承担特定的检测与修复职责:
| 原语 | 漂移检测点 | 复测关注字段 |
|---|---|---|
| Service | 整体就绪状态、配置一致性 | status.conditions[?(@.type=='Ready')].status |
| Configuration | 最新 Revision 是否已生成、是否与期望配置一致 | status.latestCreatedRevisionName vs status.latestReadyRevisionName |
| Revision | Pod 副本数、镜像拉取、容器启动、就绪探针 | status.conditions、status.actualReplicas、status.desiredReplicas |
| Route | 流量分配是否生效、目标 Revision 是否可路由 | status.traffic 中每个目标的 revisionName 与 percent |