2. HPA 架构解析:HPA 控制器、Metrics Server、目标工作负载之间的数据流与交互逻辑

Horizontal Pod Autoscaler(HPA)是 Kubernetes 实现工作负载弹性伸缩的核心组件。理解 HPA 的内部数据流与交互逻辑,是进行参数调优与压测验证的前提。本章从组件职责、数据采集链路、决策循环三个维度,拆解 HPA 的完整架构。

2.1 核心组件与职责

HPA 的运作依赖三个关键角色:HPA 控制器、Metrics Server 和 目标工作负载(Deployment / StatefulSet)。三者通过标准的 Kubernetes API 与指标管道协作。

组件 运行位置 核心职责 数据来源
HPA 控制器 kube-controller-manager 内 定期执行扩缩容算法,计算期望副本数,更新目标工作负载的 replicas 字段 Metrics Server 提供的 Pod 指标;自定义/外部指标 API
Metrics Server 集群内独立 Pod(kube-system) 从 kubelet 的 cAdvisor 接口采集 Pod 资源指标(CPU / 内存),聚合后通过 metrics.k8s.io API 暴露 kubelet / cAdvisor
目标工作负载 集群内业务命名空间 运行业务容器,暴露 Pod 标签与资源请求/限制;HPA 通过 scale 子资源调整其副本数 自身 Pod 状态
关键认知:Metrics Server 仅提供实时快照数据,不存储历史指标。HPA 控制器每次评估时都会重新拉取最新指标,因此 Metrics Server 的响应延迟直接影响 HPA 决策的时效性。

2.2 数据流与交互逻辑

HPA 的完整数据流遵循一个闭环周期:指标采集 → 指标暴露 → 控制器拉取 → 算法计算 → 副本调整 → 状态反馈。下图展示了这一交互逻辑。

HPA 数据流与交互逻辑架构图 HPA 数据流与交互逻辑 kubelet cAdvisor 指标采集 Metrics Server 聚合 /metrics.k8s.io HPA 控制器 扩缩容算法 目标工作负载 Deployment / StatefulSet API Server scale 子资源 采集 Pod 指标 拉取指标 更新 replicas 调整 Pod 数量 新 Pod 启动 数据流说明 ① kubelet 采集 Pod 资源使用量 ② Metrics Server 聚合为集群指标 ③ HPA 控制器周期性拉取并计算 控制流说明 ④ HPA 通过 API Server 更新 replicas ⑤ 工作负载控制器创建/删除 Pod ⑥ 新 Pod 被 kubelet 纳入指标采集

2.3 指标采集与暴露链路

Metrics Server 是 HPA 获取资源指标的唯一标准来源。其内部工作流程如下:

  1. kubelet 内置 cAdvisor:每个节点上的 kubelet 内嵌 cAdvisor,以 15s 为周期采集本地 Pod 的 CPU 和内存使用数据。
  2. Metrics Server 拉取:Metrics Server 通过 kubelet 的 /metrics/resource 端点,以 --kubelet-use-node-status-port 方式获取每个节点的 Pod 指标。
  3. 聚合与暴露:Metrics Server 将原始指标按 Pod 维度聚合,通过 metrics.k8s.io API 对外暴露。HPA 控制器通过 APIService 注册的路径 /apis/metrics.k8s.io/v1beta1 拉取数据。
性能要点:Metrics Server 默认每 15s 从 kubelet 拉取一次指标,HPA 控制器默认每 15s 评估一次。这意味着从指标产生到 HPA 做出决策,理论最大延迟为 30s(15s 采集间隔 + 15s 评估间隔)。在压测场景中,这一延迟直接影响扩容响应速度。

2.4 HPA 控制器决策循环

HPA 控制器内部运行一个定时循环,每次迭代执行以下步骤:

步骤 操作 涉及 API 关键参数
1 获取目标工作负载的当前副本数 /apis/apps/v1/namespaces/{ns}/deployments/{name}/scale spec.replicas
2 拉取所有关联 Pod 的当前指标 /apis/metrics.k8s.io/v1beta1/namespaces/{ns}/pods Pod 标签选择器
3 计算当前指标平均值(总指标 / 副本数) 内部计算 忽略未就绪 Pod
4 执行扩缩容算法:
desiredReplicas = ceil[currentReplicas × (currentMetric / desiredMetric)]
内部计算 --horizontal-pod-autoscaler-tolerance(默认 0.1)
5 检查是否满足冷却/稳定窗口 内部状态 --horizontal-pod-autoscaler-downscale-stabilization-window(默认 5m)
6 更新目标工作负载的 spec.replicas PUT /apis/apps/v1/namespaces/{ns}/deployments/{name}/scale 新副本数

2.5 关键交互细节

  • Pod 就绪状态过滤:HPA 在计算指标平均值时,默认只统计 status.conditions[type=Ready].status=True 的 Pod。未就绪 Pod 的指标会被忽略,避免扩容期间指标被稀释。
  • 指标缺失处理:如果某个 Pod 的指标完全缺失(例如刚启动),HPA 会将其视为 0 值参与平均计算。这可能导致扩容不足,因此生产环境建议配合 --horizontal-pod-autoscaler-initial-readiness-delay 参数(默认 30s)延迟纳入。
  • 并发与一致性:HPA 控制器通过 resourceVersion 乐观锁更新 scale 子资源,避免多个 HPA 对象或手动调整副本数时产生冲突。
常见陷阱:如果 Metrics Server 响应缓慢或 Pod 指标采集超时,HPA 控制器会跳过本次评估周期,并在日志中记录 failed to get metrics。压测时务必监控 Metrics Server 的 metrics_server_scraper_duration_seconds 指标,确保采集延迟在 5s 以内。

2.6 架构总结

HPA 的架构设计遵循“松耦合、标准接口”原则:

  • 数据面:kubelet → Metrics Server → HPA 控制器,形成单向指标流。
  • 控制面:HPA 控制器 → API Server → 工作负载控制器,形成副本调整闭环。
  • 关键约束:指标采集周期、评估周期、冷却窗口共同决定了弹性伸缩的响应速度与稳定性。