Kubernetes HPA 基础回顾:HPA 工作原理、Metrics Server、自定义指标与聚合层
Horizontal Pod Autoscaler(HPA)是 Kubernetes 中实现工作负载弹性伸缩的核心控制器。它通过持续监测 Pod 的负载指标,自动调整副本数量,使应用在流量高峰时获得足够资源,在低谷时释放闲置资源。理解 HPA 的工作原理、指标来源以及聚合层机制,是构建可靠弹性基础设施的前提。
2.1 HPA 工作原理
HPA 以控制循环(Control Loop)方式运行,默认每 15 秒从指标源拉取数据,并根据当前指标值与目标值的比值计算期望副本数。其核心计算公式如下:
desiredReplicas = ceil[currentReplicas × (currentMetricValue / desiredMetricValue)]
HPA 控制器的工作流程分为四个阶段:
- 指标采集:通过 Metrics Server 或自定义指标 API 获取当前 Pod 的 CPU、内存或自定义指标值。
- 副本计算:根据公式计算期望副本数,并考虑冷却窗口(Cooldown)和容忍度(Tolerance)避免频繁抖动。
- 更新目标:调用 Kubernetes API 更新 Deployment/StatefulSet 的
replicas字段。 - 扩缩容执行:ReplicaSet 控制器根据新的副本数创建或删除 Pod。
冷却窗口说明: HPA 默认水平扩容冷却时间为 3 分钟,缩容冷却时间为 5 分钟。这是为了防止指标短暂波动导致副本数频繁变化,影响系统稳定性。
2.2 Metrics Server:资源指标的基石
Metrics Server 是 Kubernetes 集群中资源指标(CPU、内存)的聚合器。它从每个节点上的 kubelet 内置 cAdvisor 接口采集数据,通过 metrics.k8s.io API 对外暴露。Metrics Server 采用内存存储,不持久化历史数据,因此适合用于 HPA 等实时弹性场景。
| 特性 | 说明 |
|---|---|
| 数据来源 | 每个节点 kubelet 内置的 cAdvisor |
| API 组 | metrics.k8s.io |
| 存储方式 | 内存存储,无持久化 |
| 采集粒度 | 默认 60s 轮询一次 |
| 资源占用 | 极低,适合生产环境 |
| 支持的指标 | CPU 使用率(m)、内存使用量(Mi) |
注意: Metrics Server 不适用于监控告警或历史趋势分析。如果需要长期存储指标数据,应结合 Prometheus + Thanos 或 VictoriaMetrics 等方案。
2.3 自定义指标与聚合层
当业务需要基于 QPS、请求延迟、队列深度等自定义指标进行弹性伸缩时,仅靠 Metrics Server 的 CPU/内存指标是不够的。Kubernetes 通过 API 聚合层(API Aggregation Layer) 扩展了指标 API,支持三类指标来源:
- 资源指标(Resource Metrics):由 Metrics Server 提供,对应
metrics.k8s.ioAPI。 - 自定义指标(Custom Metrics):由用户部署的适配器提供,对应
custom.metrics.k8s.ioAPI,例如基于 Prometheus Adapter 暴露的应用指标。 - 外部指标(External Metrics):来自集群外部的指标源,对应
external.metrics.k8s.ioAPI,例如云厂商的负载均衡器连接数、消息队列积压量。
API 聚合层的工作原理如下:
- 用户部署一个实现了
/apis/custom.metrics.k8s.io/v1beta1或/apis/external.metrics.k8s.io/v1beta1的 API 服务(如 Prometheus Adapter、Kubernetes Metrics Adapter)。 - 该服务注册到 Kubernetes API Server 的聚合层中。
- HPA 控制器通过聚合层统一查询指标,无需关心底层数据源的具体实现。
2.4 HPA 配置示例
以下是一个基于 CPU 和自定义 QPS 指标的 HPA 配置示例:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 1000
关键配置说明:
autoscaling/v2:支持多指标组合,HPA 会选择所有指标中计算出的最大副本数。type: Resource:引用 Metrics Server 提供的资源指标。type: Pods:引用自定义指标,指标值按 Pod 平均计算。averageUtilization:目标使用率百分比,HPA 会根据当前 Pod 的 Request 值计算。
2.5 常见问题与最佳实践
| 问题 | 原因 | 解决方案 |
|---|---|---|
| HPA 无法获取指标 | Metrics Server 未部署或 Pod 未设置 Resource Request | 部署 Metrics Server,确保 Deployment 设置 CPU/Memory Request |
| 扩缩容抖动频繁 | 指标波动大,冷却窗口过短 | 调整 --horizontal-pod-autoscaler-downscale-stabilization 参数 |
| 自定义指标不生效 | API 聚合层未正确注册适配器 | 检查 APIService 状态,确认适配器 Pod 运行正常 |
| 缩容过慢导致资源浪费 | 默认缩容冷却 5 分钟过长 | 根据业务容忍度适当缩短冷却时间,或使用 KEDA 等高级方案 |