2. Knative 核心资源模型概述:Service、Configuration、Revision、Route 的关系

Knative Serving 控制面的故障恢复能力,根植于其精心设计的资源模型。理解 Service(服务)、Configuration(配置)、Revision(修订版) 和 Route(路由) 四个核心资源的关系,是掌握故障隔离、版本回滚与流量迁移的基础。这四个资源构成了一个分层、解耦的声明式模型,使得控制面在部分组件失效时仍能维持关键决策。

2.1 四元组角色与职责

每个资源承担独立的职责,通过 Kubernetes 控制器进行协调。下表总结了各资源的角色与关键属性:

资源名称 缩写 核心职责 故障恢复关键属性
Service ksvc 用户入口,自动管理 Configuration 和 Route 的生命周期 作为单一抽象,屏蔽底层资源变更;故障时自动协调子资源状态
Configuration config 定义期望的部署配置(镜像、环境变量、资源限制),每次变更生成新 Revision 不可变 Revision 链,支持快速回滚到任意历史配置
Revision rev 不可变的部署快照,包含代码和配置的冻结版本 作为故障恢复的最小单元,支持按版本独立扩缩容和健康检查
Route route 流量分发策略,将请求映射到指定 Revision 或百分比分配 流量规则与部署解耦,控制面故障时流量仍按最后有效规则转发
关键设计原则: Service 是用户唯一需要关心的资源,它自动创建 Configuration 和 Route。Configuration 负责“版本管理”,Route 负责“流量管理”,两者通过 Revision 桥接。这种分离使得控制面在 Route 控制器故障时,Configuration 控制器仍能正常创建 Revision;反之亦然。

2.2 资源关系与生命周期流程

下图展示了四个资源在正常部署和版本更新时的交互流程。箭头方向表示资源的创建或引用关系。

Knative 核心资源关系与生命周期流程 Knative 核心资源关系与生命周期流程 用户创建/更新 Service Configuration 记录期望配置,生成新 Revision Revision(不可变快照) rev-1(当前) | rev-2(回滚目标) Route 流量 100% → rev-1 外部请求 故障恢复要点 • Service 故障 → 子资源独立运行 • Configuration 故障 → Revision 不变 • Route 故障 → 流量保持最后规则

2.3 版本更新与回滚机制

当用户更新 Service 的镜像或环境变量时,Knative 执行以下原子化流程,确保故障恢复的可追溯性:

  1. Configuration 生成新 Revision: 控制器检测到 Configuration 的 spec.template 变更,自动创建新的 Revision(如 rev-2),并保留所有历史 Revision(rev-1、rev-0)。
  2. Route 流量切换: 默认情况下,Route 将 traffic.latestRevision 设置为 true,流量自动指向最新 Revision。用户也可手动指定百分比分配。
  3. 回滚操作: 只需修改 Service 的 spec.template 指向历史 Revision 的配置,或直接修改 Route 的流量规则,将 100% 流量指向 rev-1。
工程经验: 在控制面故障场景下,Revision 的不可变性是最大的安全保障。即使 Configuration 控制器宕机,已存在的 Revision 仍可被 Route 引用并正常服务。建议在生产环境中保留至少 3 个历史 Revision,以应对连续故障。

2.4 资源状态与故障域隔离

每个资源维护独立的状态字段,故障不会跨资源传播。下表展示了各资源在故障时的状态表现:

故障场景 Service 状态 Configuration 状态 Revision 状态 Route 状态
Revision 健康检查失败 Ready=False Ready=True(配置有效) Ready=False Ready=True(流量切到其他 Revision)
Configuration 控制器故障 Unknown Unknown Ready=True(已有 Revision 不变) Ready=True(流量规则不变)
Route 控制器故障 Unknown Ready=True Ready=True Unknown(但流量仍按最后规则转发)
Service 控制器故障 Unknown Ready=True(独立运行) Ready=True Ready=True(独立运行)
注意: 虽然资源状态相互独立,但 Service 的 Ready 条件是所有子资源状态的聚合。当子资源故障时,Service 会报告 Ready=False,但不会级联删除或修改子资源。这是控制面故障恢复的核心设计——故障被“观察”而非“传播”。

2.5 资源模型在故障恢复中的价值总结

Knative 的四元组资源模型通过以下机制支撑控制面故障恢复:

  • 声明式状态解耦: 每个资源只负责自己的期望状态,控制器独立调谐。一个控制器的故障不会阻塞其他控制器的调谐循环。
  • 不可变 Revision 链: 提供确定性的回滚目标,避免因配置漂移导致恢复失败。
  • 流量与部署分离: Route 的流量规则独立于 Revision 的部署状态,即使 Revision 正在重启,Route 仍可保持流量转发策略。
  • Service 作为故障屏障: 用户只与 Service 交互,底层资源变更对用户透明,简化了故障恢复的操作面。