3. 自动扩缩基础:Knative Pod Autoscaler(KPA)工作原理、并发模型与目标利用率

Knative Pod Autoscaler(KPA)是 Knative Serving 内置的、基于请求驱动的自动扩缩组件。与 Kubernetes 原生的 HPA(基于 CPU/内存指标)不同,KPA 直接以并发请求数(Concurrency)作为核心指标,实现从零到 N 的平滑扩缩。理解 KPA 的工作原理、并发模型以及目标利用率(Target Utilization)是优化 Serverless 工作负载资源成本与响应延迟的基础。

3.1 KPA 核心工作原理

KPA 通过一个数据面 + 控制面的闭环架构实现自动扩缩。数据面的 Activator 和 Queue-Proxy 负责采集请求指标,控制面的 Autoscaler 组件负责计算期望 Pod 数并调整 Deployment 的副本数。

核心流程:请求到达 → Queue-Proxy 统计并发数 → Autoscaler 每 2 秒拉取指标 → 计算期望副本数 → 调整 Deployment 的 Scale 子资源。
KPA 工作原理架构图 KPA 数据面与控制面闭环架构 外部请求 Activator (缓冲/转发) Queue-Proxy (并发统计) User Container (业务逻辑) 并发指标(每 2s) Autoscaler (计算期望副本) Deployment (调整副本数) 说明: 当 Pod 数从 0 扩到 1 时,Activator 参与流量转发;当 Pod 数 ≥ 2 时,Activator 退出数据路径,请求直达 Pod。

3.2 并发模型:单 Pod 并发上限与统计方式

KPA 的并发模型基于“软限制(Soft Limit)”与“硬限制(Hard Limit)”两个维度进行控制。Queue-Proxy 容器会拦截所有进出流量,实时统计当前正在处理的请求数(In-Flight Requests)。

参数 配置项 默认值 说明
软限制(Soft Limit) container-concurrency-target 100 KPA 期望每个 Pod 达到的目标并发数,用于扩缩计算
硬限制(Hard Limit) container-concurrency 0(无限制) Pod 允许的最大并发请求数,超过时请求排队或拒绝
目标利用率(TU) autoscaling.knative.dev/target-utilization-percentage 70% 实际并发达到软限制的百分比时触发扩缩
最佳实践:对于 CPU 密集型服务,建议将 container-concurrency-target 设置为 10~30,避免高并发导致请求延迟飙升;对于 I/O 密集型服务(如代理、网关),可适当提高至 100~200。

3.3 目标利用率(Target Utilization)与扩缩决策

目标利用率(TU)是 KPA 扩缩决策的“触发器”。KPA 不会等到 Pod 并发达到软限制才扩容,而是当平均并发 / 软限制 ≥ TU 时开始扩容。计算公式如下:

期望副本数 = ceil( 当前总并发数 / (软限制 × 目标利用率) )

示例:
- 当前总并发数 = 350
- 软限制 = 100
- 目标利用率 = 70%(即 0.7)
- 期望副本数 = ceil( 350 / (100 × 0.7) ) = ceil( 350 / 70 ) = 5

KPA 的扩缩决策遵循“稳定窗口”机制,避免因瞬时抖动导致频繁扩缩:

  • 扩容(Scale Up):立即响应,无稳定窗口,只要指标超过阈值就扩容。
  • 缩容(Scale Down):默认 60 秒稳定窗口(可通过 scale-down-delay 配置),确保流量下降趋势稳定后再缩容。
  • 缩容至零:当稳定窗口内无请求到达时,KPA 将 Pod 数缩至 0,释放资源。
目标利用率与扩缩决策流程 目标利用率驱动的扩缩决策流程 并发指标输入 (Queue-Proxy 采集) 计算期望副本数 (ceil(并发/TU×软限制)) 判断扩缩方向 (扩容/缩容/保持) 扩容 (立即执行) 缩容 (等待稳定窗口) 保持 (不做调整) 关键点: 扩容无稳定窗口,缩容默认 60s 稳定窗口。目标利用率越低,预留的缓冲容量越大,但资源利用率也越低。

3.4 并发模型与目标利用率的协同配置

在实际生产环境中,软限制与目标利用率需要根据业务特征协同调整。以下表格展示了不同场景下的推荐配置:

业务场景 软限制 目标利用率 预期效果
低延迟 API(< 50ms) 50 70% 每个 Pod 预留 30% 缓冲,应对突发流量
高吞吐批处理 200 90% 最大化资源利用率,允许一定排队
WebSocket 长连接 10 60% 避免单个 Pod 承载过多长连接导致内存溢出
混合负载(CPU+IO) 30 75% 平衡响应时间与资源成本
注意:目标利用率设置过高(如 95% 以上)会导致 Pod 在流量突增时立即过载,造成请求排队或超时;设置过低(如 30%)则会导致 Pod 数量过多,资源浪费严重。建议从 70% 开始,通过压测逐步调整。

3.5 关键参数速查表

以下为 KPA 自动扩缩相关的核心配置参数,可在 Knative Service YAML 的 metadata.annotations 中设置:

Annotation 键 值类型 默认值 作用
autoscaling.knative.dev/class string kpa.autoscaling.knative.dev 指定使用 KPA 还是 HPA
autoscaling.knative.dev/metric string concurrency 扩缩指标(concurrency / rps / cpu / memory)
autoscaling.knative.dev/target int 100 软限制(container-concurrency-target)
autoscaling.knative.dev/target-utilization-percentage int 70 目标利用率百分比
autoscaling.knative.dev/scale-down-delay duration 60s 缩容稳定窗口
autoscaling.knative.dev/window duration 60s 指标计算窗口(KPA 取窗口内平均值)