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 子资源。
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,释放资源。
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 取窗口内平均值) |