2. Knative 核心架构:Serving 与 Eventing 组件、Revision 与 Route 模型、自动扩缩容机制

Knative 建立在 Kubernetes 之上,通过 Serving 和 Eventing 两大核心组件,为无服务器工作负载提供部署、路由、自动扩缩容以及事件驱动能力。理解这两个组件的协作关系,是掌握流量镜像与调试的前提。

2.1 Knative Serving:无服务器工作负载的运行时引擎

Knative Serving 负责管理容器化应用的部署、路由和自动扩缩容。它通过几个关键的自定义资源(CRD)来抽象无服务器应用的完整生命周期。

2.1.1 核心资源模型

资源 作用 关键属性
Service 用户入口,管理应用整个生命周期。自动创建 Route 和 Configuration。 自动管理流量路由与配置更新。
Configuration 描述应用的期望配置(镜像、环境变量等)。每次更新都会生成一个新的 Revision。 不可变配置快照的生成器。
Revision Configuration 每次变更产生的不可变快照,代表一个特定版本的代码和配置。 自动扩缩容的最小单元;每个 Revision 拥有独立的实例集合。
Route 管理流量分发策略,将请求映射到指定的 Revision。 支持蓝绿部署、灰度发布(Canary)、按标签路由。
调试要点: 在流量镜像场景中,Route 是配置镜像流量的关键点。你可以通过修改 Route 的流量规则,将一份请求副本发送到指定的 Revision(例如调试版本),而不影响主 Revision 的生产流量。

2.1.2 Revision 与 Route 模型:流量管理的基石

Revision 和 Route 构成了 Knative Serving 的流量路由模型。Revision 是不可变的,保证了每次部署的可追溯性;Route 则提供了灵活的流量分发能力。

核心关系: Configuration 每更新一次 → 生成一个新的 Revision → Route 根据规则将流量分配到不同 Revision(如 90% 流量到 v1,10% 到 v2)。
Knative Revision 与 Route 流量分发模型 Revision 与 Route 流量分发模型 用户请求 Route (流量规则) Revision v1 (稳定版) 流量: 90% Revision v2 (金丝雀) 流量: 10% Revision debug (镜像) 流量: 镜像 (0%) 镜像流量:请求被复制一份发送到 debug Revision,主请求不受影响,响应被丢弃。

2.2 Knative Eventing:事件驱动架构的核心

Knative Eventing 提供了一套完整的事件管理框架,用于连接事件生产者(Broker)和事件消费者(Trigger、Sink)。它解耦了事件的产生与处理,使得服务可以响应外部事件(如 Kafka 消息、GitHub Webhook)或内部事件(如服务状态变更)。

2.2.1 核心组件与事件流

  • Broker:事件网格的入口,负责接收和转发事件。每个 Broker 对应一个事件通道(如 InMemoryChannel、KafkaChannel)。
  • Trigger:定义事件过滤规则(基于事件类型、来源等),将匹配的事件从 Broker 转发到特定的 Sink(如 Knative Service、Kubernetes Service)。
  • Sink:事件的最终消费者,通常是 Knative Service 或任何实现了 Addressable 接口的资源。
  • Source:事件的生产者,如 ApiServerSource、PingSource、KafkaSource。
调试注意: 在 Eventing 调试中,流量镜像通常用于捕获 Broker 内部的事件流。你可以通过配置一个“影子 Trigger”,将事件副本发送到调试服务,从而在不影响主事件流的情况下分析事件内容。
Knative Eventing 事件流与镜像调试 Knative Eventing 事件流与镜像调试 事件源 (Source) Broker (事件网格) Trigger (主) Sink (主服务) Trigger (镜像) Sink (调试服务) 镜像 Trigger 复制事件流到调试服务,主事件流不受影响。

2.3 自动扩缩容机制:KPA(Knative Pod Autoscaler)

Knative Serving 内置了基于请求驱动的自动扩缩容机制,核心是 KPA(Knative Pod Autoscaler)。与传统的 CPU/内存指标不同,KPA 根据并发请求数(Concurrency)或 RPS(每秒请求数)进行扩缩容,实现从零到 N 的弹性伸缩。

2.3.1 关键参数与行为

参数 默认值 说明
container-concurrency 0(无限制) 每个 Pod 实例能同时处理的最大并发请求数。设为 5 表示每个 Pod 最多同时处理 5 个请求。
target 100 KPA 期望维持的并发目标值。当并发超过 target 时,KPA 会扩容 Pod。
stable-window 60s 稳定窗口期,KPA 在此窗口内观察指标,避免频繁抖动。
panic-window 6s 恐慌窗口期,当并发突然飙升时,KPA 进入恐慌模式,快速扩容。
scale-to-zero-grace-period 30s 缩容到零前的等待时间,确保没有新请求涌入。
调试场景: 在流量镜像调试中,如果镜像流量导致目标 Revision 的并发数升高,可能会触发不必要的扩容。建议将镜像流量的目标 Revision 的 container-concurrency 设置为一个较大的值(如 1000),或使用独立的 Revision 专门用于调试,避免干扰主 Revision 的扩缩容行为。

2.3.2 扩缩容流程

  1. 请求到达:请求通过 Route 进入 Revision 的 Pod。
  2. 指标采集:Queue-Proxy(每个 Pod 内的 Sidecar 代理)采集并发请求数。
  3. KPA 决策:KPA 根据采集到的指标与 target 值对比,计算期望的 Pod 副本数。
  4. 调整副本:KPA 通过调整 Deployment 的 replicas 字段来扩缩容。
  5. 缩容到零:当无请求时,KPA 在 scale-to-zero-grace-period 后将副本数降为 0,释放资源。
重要提示: 缩容到零(Scale to Zero)是 Knative 的核心特性,但也会带来冷启动延迟。在调试环境中,如果频繁进行流量镜像,建议通过设置 minScale: 1 来保持至少一个 Pod 运行,避免每次调试都经历冷启动。