Kubernetes HPA 基础:工作原理、ReplicaSet 与 Deployment 的关系、Metrics Server 的作用
在云原生弹性伸缩体系中,Horizontal Pod Autoscaler(HPA) 是 Kubernetes 内置的核心控制器,负责根据工作负载的实时指标自动调整 Pod 副本数。理解 HPA 的工作原理、它与 ReplicaSet 及 Deployment 的协作关系,以及 Metrics Server 作为数据源的关键作用,是构建 Prometheus 驱动控制面弹性伸缩测试验证的基石。
1. HPA 工作原理
HPA 是一个控制循环组件,默认每 15 秒(由 --horizontal-pod-autoscaler-sync-period 控制)从 Metrics Server 或自定义指标 API 获取目标工作负载的当前指标值,然后根据预设的目标值与当前值的比率计算期望副本数,最后通过更新 Deployment 或 ReplicaSet 的 replicas 字段来触发扩缩容。
desiredReplicas = ceil[currentReplicas × (currentMetricValue / desiredMetricValue)]
HPA 支持三种指标类型:
- Resource Metrics:基于 Pod 的 CPU 或内存利用率(需 Metrics Server)。
- Custom Metrics:基于 Kubernetes 对象自定义指标(如 QPS、请求延迟)。
- External Metrics:基于集群外部系统的指标(如消息队列长度)。
--horizontal-pod-autoscaler-downscale-stabilization-window),防止频繁抖动。在测试验证时,建议将此值调小或使用 Prometheus Adapter 的即时指标。
2. ReplicaSet 与 Deployment 的关系
在 Kubernetes 中,Deployment 是更高层次的控制器,它管理 ReplicaSet,而 ReplicaSet 负责确保指定数量的 Pod 副本始终运行。HPA 通常作用于 Deployment,因为 Deployment 提供了滚动更新、回滚等高级功能。
| 控制器 | 职责 | 与 HPA 的关系 |
|---|---|---|
| Deployment | 声明式更新、滚动发布、回滚 | HPA 直接修改其 replicas 字段 |
| ReplicaSet | 确保 Pod 副本数恒定 | 由 Deployment 自动创建和管理,HPA 不直接操作 |
| Pod | 运行容器化应用 | HPA 通过增减 Pod 数量实现弹性 |
replicas 后,Deployment 会更新其下管理的 ReplicaSet 的 replicas,最终由 ReplicaSet 创建或删除 Pod。这种分层设计保证了滚动更新与弹性伸缩的兼容性。
3. Metrics Server 的作用
Metrics Server 是 Kubernetes 集群范围内的资源使用率数据聚合器。它从每个节点上的 kubelet(通过 cAdvisor)收集 Pod 和节点的 CPU、内存指标,并通过 metrics.k8s.io API 对外暴露。HPA 默认使用该 API 获取资源指标。
- 轻量级:仅保留最近 1-2 分钟的数据,不存储历史。
- 自动发现:通过 kubelet 自动发现所有节点和 Pod。
- 标准 API:提供
/apis/metrics.k8s.io/v1beta1端点。 - 无持久化:数据仅存在于内存中,重启后丢失。
在 HPA 弹性伸缩测试验证中,Metrics Server 的可用性和准确性直接影响测试结果。常见问题包括:
- Metrics Server 未安装或未运行:HPA 无法获取 CPU/内存指标,导致无法扩缩容。
- 指标延迟:Metrics Server 默认 15 秒采集一次,可能导致 HPA 响应滞后。
- 资源限制:Metrics Server 本身需要足够的资源,否则会成为性能瓶颈。
kubectl top pods 命令验证 Metrics Server 是否正常工作。如果该命令返回 Pod 的 CPU/内存使用率,说明 Metrics Server 已就绪。
下表总结了 Metrics Server 与 Prometheus 在弹性伸缩场景中的定位差异:
| 特性 | Metrics Server | Prometheus + Adapter |
|---|---|---|
| 数据源 | kubelet / cAdvisor | 任意 exporter 或 Pushgateway |
| 指标类型 | CPU、内存(资源指标) | 自定义指标、外部指标 |
| 数据持久化 | 无(仅内存) | 有(TSDB 存储) |
| HPA 集成方式 | 原生支持(resource) | 通过 Custom/External Metrics API |
| 适用场景 | 基础 CPU/内存弹性 | 业务级、复杂指标弹性 |