2. 核心组件与工作流:Activator、Queue-Proxy、Autoscaler 组件的角色与交互流程

Knative Serving 的自动扩缩容能力并非由单一组件完成,而是由三个核心组件——Activator、Queue-Proxy 和 Autoscaler——通过精密的协作流程共同实现。理解每个组件的职责以及它们之间的交互关系,是掌握 Knative 弹性伸缩机制的基础。

2.1 组件角色定义

下表从功能定位、部署位置和核心职责三个维度,对三个核心组件进行对比:

组件 部署位置 核心职责 关键特征
Activator 共享组件(全局部署) 流量拦截与冷启动缓冲 负责将流量路由到缩容至零的 Revision;作为请求缓冲区,等待 Pod 就绪
Queue-Proxy Sidecar(每个 Pod 内) 并发控制与指标采集 作为用户容器的代理,统计请求并发数、排队深度,并上报给 Autoscaler
Autoscaler 共享组件(全局部署) 扩缩容决策与执行 基于指标计算期望 Pod 数,通过调整 Deployment 的 replicas 实现扩缩容

2.2 组件交互流程全景

下图展示了从请求到达 Knative 服务到完成自动扩缩容的完整交互流程:

Knative 自动扩缩容组件交互流程 外部请求 Activator 流量拦截 / 缓冲 Queue-Proxy 并发控制 / 指标采集 User Container 指标上报 Autoscaler 扩缩容决策 调整 Deployment Kubernetes API Pod 扩缩 说明: 1. 当 Revision 缩容至 0 时,Activator 拦截所有请求并触发冷启动。 2. Queue-Proxy 在每个 Pod 内采集并发指标,周期性上报给 Autoscaler。

2.3 核心交互流程详解

Knative 的自动扩缩容交互流程可以分为以下四个关键阶段:

  1. 流量拦截与冷启动(缩容至零场景)
    • 当 Revision 的 Pod 数为 0 时,所有入站请求首先到达 Activator。
    • Activator 将请求暂存,同时通知 Autoscaler 需要扩容。
    • Autoscaler 通过 Kubernetes API 将 Deployment 的 replicas 调整为 1。
    • Pod 启动后,Queue-Proxy 和用户容器就绪,Activator 将请求转发至新 Pod。
  2. 并发控制与指标采集
    • 每个 Pod 内的 Queue-Proxy 作为 Sidecar 代理所有进出流量。
    • Queue-Proxy 维护一个请求队列,控制并发数不超过 containerConcurrency 设置。
    • Queue-Proxy 每秒采集以下指标:平均并发数、请求排队深度、请求延迟。
  3. 指标聚合与扩缩容决策
    • Autoscaler 通过 gRPC 或 HTTP 接口,从所有 Queue-Proxy 实例拉取指标。
    • Autoscaler 使用 Panic Window(6 秒) 和 Stable Window(60 秒) 两个时间窗口进行指标聚合。
    • 根据聚合后的并发数,计算期望 Pod 数:期望 Pod 数 = 当前总并发数 / 目标并发数。
  4. 扩缩容执行
    • Autoscaler 通过修改 Kubernetes Deployment 的 replicas 字段执行扩缩容。
    • 扩容时,Autoscaler 会考虑 冷却时间 和 最大扩容速率,避免过度扩容。
    • 缩容时,Autoscaler 会逐步减少 Pod 数,确保服务稳定性。

2.4 组件交互的三种工作模式

根据 Revision 的当前 Pod 数和流量状态,Knative 会在以下三种模式间切换:

模式 触发条件 Activator 角色 Queue-Proxy 角色 Autoscaler 角色
缩容至零模式 Pod 数 = 0,有请求到达 拦截请求,触发扩容 尚未启动 执行扩容决策
正常服务模式 Pod 数 > 0,流量正常 旁路(不参与流量路径) 代理流量,采集指标 持续监控,微调 Pod 数
突发流量模式 并发数超过 Panic 阈值 可能重新加入流量路径 上报高并发指标 进入 Panic 模式,快速扩容
关键理解: Activator 并非始终处于请求路径中。在正常服务模式下,流量直接由 Kourier/Istio 网关 路由到 Pod,Activator 处于旁路状态,避免成为性能瓶颈。只有当 Revision 缩容至零或突发流量导致需要快速扩容时,Activator 才会重新介入。

2.5 组件间通信协议

三个核心组件之间的通信采用以下协议和接口:

  • Activator ↔ Autoscaler: 通过 gRPC 协议通信。Activator 在拦截请求后,向 Autoscaler 发送 StatMessage,包含请求的统计信息。
  • Queue-Proxy ↔ Autoscaler: 通过 HTTP/1.1 协议通信。Queue-Proxy 在每个指标采集周期(默认 1 秒)向 Autoscaler 的 /metrics 端点上报指标数据。
  • Autoscaler ↔ Kubernetes API: 通过 Kubernetes API 调整 Deployment 的 replicas 字段。
性能关键点: Queue-Proxy 到 Autoscaler 的指标上报采用 Push 模式,而非 Autoscaler 主动 Pull。这种设计减少了 Autoscaler 的负载,使其能够水平扩展以支持大规模集群。每个 Queue-Proxy 实例每秒上报一次指标,Autoscaler 通过聚合所有实例的数据做出全局扩缩容决策。

2.6 组件交互的容错机制

Knative 在组件交互中设计了多层容错机制,确保自动扩缩容的可靠性:

  • Activator 高可用: Activator 以 Deployment 形式部署,支持多副本。当某个 Activator 实例故障时,流量自动切换到其他健康实例。
  • 指标上报超时: 如果 Queue-Proxy 在 2 秒内未收到 Autoscaler 的响应,会认为上报失败,并在下一个周期重试。
  • Autoscaler 无状态设计: Autoscaler 不持久化状态,所有决策基于当前指标。重启后可以从 Queue-Proxy 重新获取指标。
  • 降级策略: 如果 Autoscaler 无法获取指标(如网络分区),会保持当前 Pod 数不变,避免错误缩容导致服务不可用。
注意: 在 缩容至零模式 下,如果 Activator 故障,新请求将无法被正确处理,导致请求超时。因此,生产环境中建议将 Activator 的副本数设置为至少 2,并配置 Pod 反亲和性策略,确保高可用。