2. Kubernetes HPA 基础回顾:HPA工作原理、Metrics Server与自定义指标、HPA v1/v2/v2beta2版本差异
2.1 HPA 核心工作原理
Horizontal Pod Autoscaler(HPA)是 Kubernetes 内置的弹性伸缩控制器,负责根据工作负载的实时资源使用率或自定义指标,自动调整 Deployment、StatefulSet 等 workload 的副本数。其核心是一个控制闭环,周期性地执行以下步骤:
- 采集指标:通过 Metrics Server 或自定义指标 API 获取目标 Pod 的当前指标值。
- 计算期望副本数:使用公式
desiredReplicas = ceil[currentReplicas × (currentMetricValue / desiredMetricValue)]。 - 更新 workload 副本数:调用 Kubernetes API 修改 workload 的
spec.replicas。 - 冷却与回退:通过
--horizontal-pod-autoscaler-downscale-stabilization等参数防止抖动。
关键公式解读:
当
当
currentMetricValue / desiredMetricValue 接近 1.0 时,副本数趋于稳定;比值大于 1.0 则扩容,小于 1.0 则缩容。HPA 默认每 15 秒评估一次指标(可通过 --horizontal-pod-autoscaler-sync-period 调整)。
2.2 Metrics Server:资源指标的基石
Metrics Server 是 Kubernetes 集群中资源指标(CPU、内存)的聚合器,通过 kubelet 的 Summary API 收集每个节点和 Pod 的实时资源使用数据,并暴露标准的 metrics.k8s.io API。HPA 默认依赖该 API 获取基础指标。
| 特性 | 说明 |
|---|---|
| 数据来源 | kubelet cAdvisor 接口,采集 CPU 使用率(核)、内存使用量(字节) |
| 存储方式 | 仅保留最近 1-2 分钟的数据,不提供历史查询 |
| 部署方式 | 作为集群插件(addon)运行,推荐使用 kubectl apply -f components.yaml 安装 |
| 资源消耗 | 极低,通常每个节点消耗 < 0.1 核 CPU 和 50 MB 内存 |
| API 版本 | metrics.k8s.io/v1beta1(稳定版) |
验证 Metrics Server 是否正常工作:
kubectl top nodes
kubectl top pods -n <namespace>
如果返回正常数据,说明 Metrics Server 已就绪,HPA 可以基于 CPU/内存进行自动伸缩。
2.3 自定义指标与外部指标
当业务场景需要基于 QPS、请求延迟、队列长度等非资源指标进行伸缩时,需要引入自定义指标 API(custom.metrics.k8s.io)或外部指标 API(external.metrics.k8s.io)。常见的实现方式包括:
- Prometheus Adapter:将 Prometheus 中的指标转换为 Kubernetes 标准指标 API。
- KEDA(Kubernetes Event-driven Autoscaling):支持从 Kafka、RabbitMQ、AWS SQS 等 50+ 事件源拉取指标。
- Datadog Cluster Agent:将 Datadog 指标暴露给 HPA。
注意: 使用自定义指标时,必须确保集群中已部署对应的 Adapter,并且 HPA 的
spec.metrics 字段正确引用了指标名称和类型。否则 HPA 会处于 Unknown 状态,无法进行伸缩决策。
2.4 HPA v1 / v2 / v2beta2 版本差异
Kubernetes 在演进过程中对 HPA API 进行了多次迭代,从最初的 autoscaling/v1 到功能更丰富的 autoscaling/v2(GA 于 v1.23)。下表总结了三个主要版本的核心差异:
| 特性 | autoscaling/v1 | autoscaling/v2beta2 | autoscaling/v2 (GA) |
|---|---|---|---|
| 稳定状态 | GA(稳定) | Beta(已弃用) | GA(v1.23+) |
| 支持的指标类型 | 仅 CPU 和内存(资源指标) | 资源指标 + 自定义指标 + 外部指标 | 资源指标 + 自定义指标 + 外部指标 |
| 多指标支持 | 不支持(只能指定一个指标) | 支持多个指标,取最大值作为伸缩依据 | 支持多个指标,取最大值作为伸缩依据 |
| 行为配置 (Behavior) | 不支持 | 支持(v1.18+ 引入) | 支持(稳定) |
| 指标选择器 | 不支持 | 支持(通过 metricSelector 过滤) |
支持 |
| 推荐使用场景 | 仅需 CPU/内存自动伸缩的简单场景 | 已迁移至 v2,不建议新部署 | 所有生产环境,特别是需要自定义指标和行为策略的场景 |
版本迁移建议:
如果当前集群版本 ≥ v1.23,应直接使用
如果当前集群版本 ≥ v1.23,应直接使用
autoscaling/v2。对于仍在使用 v1 的旧集群,建议通过 kubectl convert 命令将 HPA 资源转换为 v2 格式,以利用多指标和行为配置等高级特性。
2.5 实战:编写一个 v2 HPA 示例
以下是一个基于 CPU 利用率和自定义 QPS 指标的 HPA 配置,展示了 v2 API 的多指标与行为配置能力:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-app-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 2
maxReplicas: 20
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
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 10
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Pods
value: 4
periodSeconds: 60
- type: Percent
value: 100
periodSeconds: 60
selectPolicy: Max
关键配置解读:
- metrics 数组:同时定义了 CPU 利用率和 Pod 级别的 QPS 指标,HPA 会计算两个指标各自所需的副本数,取较大值执行。
- behavior.scaleDown:设置 300 秒的缩容稳定窗口,每分钟最多缩容 10% 的 Pod,防止频繁缩容。
- behavior.scaleUp:扩容无稳定窗口,支持每分钟最多增加 4 个 Pod 或 100% 的当前副本数(取两者中较大值),实现快速响应流量突增。