3. Knative 自动扩缩容机制:KPA 与 HPA 对比、并发模型、缩容至零原理

3.1 自动扩缩容的核心目标与决策路径

Knative Serving 的自动扩缩容机制是 Serverless 平台实现“按需分配、按量计费”的基石。其核心目标是在保证服务质量(响应延迟、请求成功率)的前提下,最小化资源占用。当流量上升时,快速增加 Pod 副本;当流量下降时,回收空闲副本,直至缩容为零。

Knative 提供了两种扩缩容策略:Knative Pod Autoscaler (KPA) 和 Horizontal Pod Autoscaler (HPA)。KPA 是 Knative 原生的、基于请求并发数(Concurrency)的扩缩容方案;HPA 则是 Kubernetes 内置的、基于资源指标(CPU/内存)或自定义指标的方案。生产环境中,通常优先使用 KPA 以获得更快的响应速度和更精确的并发控制。

关键决策点: 选择 KPA 还是 HPA,取决于业务场景。对于延迟敏感、流量突发、需要快速缩容至零的 Serverless 工作负载,KPA 是首选。对于需要基于 CPU/内存等资源指标进行扩缩容的传统微服务,HPA 更合适。Knative 也支持同时启用两者,但需注意优先级和冲突。

3.2 KPA 与 HPA 对比分析

对比维度 KPA (Knative Pod Autoscaler) HPA (Horizontal Pod Autoscaler)
扩缩容依据 请求并发数(Concurrency)、每秒请求数(RPS) CPU 使用率、内存使用率、自定义指标(QPS、延迟等)
响应速度 极快(秒级),基于 Activator 实时观测 较慢(分钟级),依赖 Metrics Server 采集周期
缩容至零 原生支持,通过 Activator 代理空闲 Revision 不支持,最小副本数通常为 1
并发模型 严格限制每个 Pod 的并发请求数(containerConcurrency) 不直接控制并发,通过资源利用率间接影响
配置复杂度 低,主要配置 concurrency-target 和 containerConcurrency 中,需配置指标类型、目标值、稳定窗口等
适用场景 Serverless 工作负载、突发流量、延迟敏感型应用 传统微服务、有状态服务、需要基于资源指标的场景
性能验证要点: 在 Cilium 网络环境下,KPA 的快速扩缩容依赖于 Activator 与 Queue-Proxy 之间的高效网络通信。Cilium 的 eBPF 数据路径可以显著降低 Activator 代理请求的延迟,从而加速并发指标的采集和决策。

3.3 并发模型:从请求到 Pod 副本的映射

KPA 的并发模型是理解其扩缩容行为的关键。核心参数包括:

  • containerConcurrency:每个 Pod 实例允许的最大并发请求数。硬限制,超过此限制的请求会被排队或拒绝。
  • concurrency-target:KPA 期望每个 Pod 达到的目标并发数。软目标,KPA 会据此计算期望副本数。
  • concurrency-limit:可选,用于覆盖 containerConcurrency 的软限制。

扩缩容计算公式(简化):

期望副本数 = 当前总并发数 / concurrency-target

例如,设置 containerConcurrency=10,concurrency-target=5。当总并发数达到 100 时,KPA 会尝试扩容到 20 个 Pod(100 / 5 = 20)。每个 Pod 最多处理 10 个并发请求。

避坑指南: concurrency-target 不应设置得过高或过低。过高会导致 Pod 负载过重,增加延迟;过低会导致频繁扩缩容,造成资源浪费。建议根据实际压测结果,设置为 containerConcurrency 的 50%-70%。
KPA 并发模型与扩缩容决策流程 KPA 并发模型与扩缩容决策流程 用户请求 Activator Queue-Proxy 并发指标采集 KPA Autoscaler 期望副本数计算 扩缩容决策 关键参数 containerConcurrency: 10 concurrency-target: 5 期望副本 = 总并发 / 5

3.4 缩容至零原理

缩容至零是 Knative 区别于传统 Kubernetes 部署的核心特性。其实现依赖于两个关键组件:Activator 和 Queue-Proxy。

  1. 空闲检测: Queue-Proxy Sidecar 持续监控进入 Pod 的请求。当在 stable-window(默认 60 秒)内没有新请求到达时,Queue-Proxy 向 KPA 报告“空闲”状态。
  2. 缩容决策: KPA 收到空闲报告后,将期望副本数计算为 0,并通知 Knative Controller 执行缩容操作。
  3. 路由切换: 在缩容至零之前,Knative 将 Revision 的路由从直接指向 Pod 切换为指向 Activator。Activator 成为请求的代理入口。
  4. Pod 回收: Kubernetes Deployment 将副本数缩减至 0,所有 Pod 被回收。
  5. 冷启动: 当新请求到达 Activator 时,Activator 缓存请求,同时触发扩容流程。KPA 计算期望副本数,Kubernetes 创建新 Pod,Queue-Proxy 和用户容器启动,Activator 将缓存的请求转发至新 Pod。
性能验证关键指标:
  • 缩容至零延迟: 从最后一个请求结束到 Pod 完全回收的时间。
  • 冷启动延迟: 从请求到达 Activator 到第一个响应返回的时间。Cilium 的网络加速可以显著缩短冷启动过程中的网络路径延迟。
  • Activator 代理延迟: 请求经过 Activator 转发带来的额外延迟。
缩容至零与冷启动状态机 缩容至零与冷启动状态机 有流量 (Active) Pod 运行中 空闲检测 stable-window 缩容至零 Pod 已回收 冷启动 创建 Pod + 初始化 路由切换 指向 Activator 无新请求 超时 新请求到达 Activator 触发扩容 Pod 就绪,请求转发

3.5 关键配置参数速查

参数 所属组件 默认值 说明
containerConcurrency Revision (spec) 0 (无限制) 每个 Pod 的最大并发请求数。建议设置为一个合理值(如 10-100)以保护应用。
concurrency-target KPA ConfigMap 100 KPA 期望每个 Pod 达到的目标并发数。用于计算期望副本数。
stable-window KPA ConfigMap 60s 缩容稳定窗口。在此时间内无新请求,才允许缩容至零。
panic-window KPA ConfigMap 6s 恐慌模式窗口。当并发突增时,KPA 进入恐慌模式,加速扩容。
max-scale Revision (annotation) 无限制 最大副本数限制,防止无限扩容。
min-scale Revision (annotation) 0 最小副本数。设置为 0 允许缩容至零;设置为 >0 则保留常驻 Pod。
生产建议: 对于延迟敏感型应用,建议将 stable-window 缩短至 30s 以加快缩容响应,同时设置 min-scale: 1 保留一个常驻 Pod 以避免冷启动延迟。对于成本敏感型应用,保持 min-scale: 0 并优化冷启动速度(如使用 Cilium 加速网络、减小容器镜像体积)。