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:基于集群外部系统的指标(如消息队列长度)。
避坑提示:HPA 默认有 5 分钟的冷却窗口(--horizontal-pod-autoscaler-downscale-stabilization-window),防止频繁抖动。在测试验证时,建议将此值调小或使用 Prometheus Adapter 的即时指标。
HPA 控制循环流程图 HPA 控制循环流程图 Metrics Server CPU / 内存指标 HPA Controller 计算期望副本数 Deployment 更新 replicas ReplicaSet 管理 Pod 副本 Pod 副本组 运行工作负载 拉取指标 更新 replicas 指标上报(cAdvisor / kubelet)

2. ReplicaSet 与 Deployment 的关系

在 Kubernetes 中,Deployment 是更高层次的控制器,它管理 ReplicaSet,而 ReplicaSet 负责确保指定数量的 Pod 副本始终运行。HPA 通常作用于 Deployment,因为 Deployment 提供了滚动更新、回滚等高级功能。

控制器 职责 与 HPA 的关系
Deployment 声明式更新、滚动发布、回滚 HPA 直接修改其 replicas 字段
ReplicaSet 确保 Pod 副本数恒定 由 Deployment 自动创建和管理,HPA 不直接操作
Pod 运行容器化应用 HPA 通过增减 Pod 数量实现弹性
关键理解:HPA 不会直接操作 ReplicaSet,而是通过 Deployment 间接控制。当 HPA 修改 Deployment 的 replicas 后,Deployment 会更新其下管理的 ReplicaSet 的 replicas,最终由 ReplicaSet 创建或删除 Pod。这种分层设计保证了滚动更新与弹性伸缩的兼容性。
Deployment、ReplicaSet、Pod 层级关系图 Deployment → ReplicaSet → Pod 层级关系 Deployment ReplicaSet Pod A Pod B Pod C

3. Metrics Server 的作用

Metrics Server 是 Kubernetes 集群范围内的资源使用率数据聚合器。它从每个节点上的 kubelet(通过 cAdvisor)收集 Pod 和节点的 CPU、内存指标,并通过 metrics.k8s.io API 对外暴露。HPA 默认使用该 API 获取资源指标。

Metrics Server 关键特性:
  • 轻量级:仅保留最近 1-2 分钟的数据,不存储历史。
  • 自动发现:通过 kubelet 自动发现所有节点和 Pod。
  • 标准 API:提供 /apis/metrics.k8s.io/v1beta1 端点。
  • 无持久化:数据仅存在于内存中,重启后丢失。

在 HPA 弹性伸缩测试验证中,Metrics Server 的可用性和准确性直接影响测试结果。常见问题包括:

  • Metrics Server 未安装或未运行:HPA 无法获取 CPU/内存指标,导致无法扩缩容。
  • 指标延迟:Metrics Server 默认 15 秒采集一次,可能导致 HPA 响应滞后。
  • 资源限制:Metrics Server 本身需要足够的资源,否则会成为性能瓶颈。
测试验证建议:在开始 Prometheus 驱动控制面弹性伸缩测试前,先通过 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/内存弹性 业务级、复杂指标弹性