如何配置 Horizontal Pod Autoscaler (HPA)

Horizontal Pod Autoscaler (HPA) 配置指南

一、HPA 核心原理

HPA 动态调整 Pod 数量,需满足以下条件:

  1. 依赖监控指标:基于 CPU、内存、自定义指标等资源/业务指标。

  2. 阈值规则 :定义触发扩缩容的具体条件(如 average CPU > 70%)。

  3. 时间窗口 :统计指标数据的持续时间(如 last 5 minutes)。


二、配置 HPA 的 4 种方式

方式 1:基于 CPU 使用率的 HPA(推荐)
步骤 1:安装 Metrics Server
复制代码
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
步骤 2:创建 HPA 资源
复制代码
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70  # CPU 使用率 >70% 时扩容
步骤 3:应用配置
复制代码
kubectl apply -f hpa.yaml

方式 2:基于自定义指标的 HPA
步骤 1:部署自定义指标适配器(以 Prometheus 为例)
复制代码
# 示例:部署指标导出器
kubectl create deployment prometheus-adapter --image quay.io/prometheus adapter:v1.12.0
kubectl expose deployment prometheus-adapter --port 9464 --type=LoadBalancer
步骤 2:定义 HPA 使用自定义指标
复制代码
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: custom-metric-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Custom
    custom:
      name: my_custom_metric  # 需适配器支持的指标名称
      target:
        type: AverageValue
        averageValue: 100  # 当指标值 >100 时扩容

方式 3:基于内存使用率的 HPA
复制代码
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: memory-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

方式 4:基于多个指标的复合策略
复制代码
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: multi-metric-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        averageUtilization: 70
  - type: Custom
    custom:
      name: request_count
      target:
        type: AverageValue
        averageValue: 500

三、HPA 支持的指标类型

指标类型 描述
Resource 系统资源(CPU、内存),需通过 Metrics Server 监控
Custom 自定义业务指标(如请求量、错误率),需对接 Prometheus Adapter 等适配器
Object 针对特定对象的数量(如 Ingress 访问量),需自定义适配器

四、关键参数详解

字段 作用
minReplicas 最小副本数(不可低于此值)
maxReplicas 最大副本数(不可超过此值)
targetRef 指定要自动缩放的目标资源(Deployment/StatefulSet/CronJob)
averageUtilization 资源利用率阈值(百分比)

五、验证 HPA 是否生效

  1. 查看 HPA 状态

    复制代码
    kubectl get hpa -n default
    # 输出示例:
    # NAME       REFERENCE               TARGETS          CURRENT REPLICAS   DESIRED REPLICAS
    # my-hpa     deployment/my-app      cpu=75%/100ms   1                3
  2. 模拟触发条件

    复制代码
    # 人工增加 CPU 负载(需安装 loadgen 工具)
    kubectl run -i --tty loadgen --image=busybox --rm sleep 3600
    while true; do curl http://my-app:8080; done

六、高级配置技巧

1. 阶梯式扩缩容(Stepwise Scaling)
复制代码
# 配置文件片段
behavior:
  scaleUp:
    steps:
    - duration: 30s
      targetSize: 2
    - duration: 60s
      targetSize: 5
  scaleDown:
    steps:
    - duration: 30s
      targetSize: 3
2. 基于队列长度的扩缩容(适用于消息队列)
复制代码
# 自定义指标示例(需适配器支持)
metric:
  name: queue_length
  type: Gauge
target:
  type: AverageValue
  averageValue: 100

七、常见问题排查

现象 解决方案
HPA 无反应 1. 检查 Metrics Server 是否正常运行 2. 确认 RBAC 权限(HPA 需要访问 metrics-server)
扩缩容不生效 1. 验证指标是否达到阈值 2. 检查目标资源的 autoscaling 注解是否正确
频繁抖动 调整 hysteresis 参数(如 5% 缓冲)或增大 evaluation-period 时间窗口

总结

通过合理配置 HPA,可实现:

成本优化:低负载时减少 Pod 数量降低资源消耗。

弹性伸缩:高负载时自动扩容保障服务稳定性。

业务适配:基于业务指标(如 QPS)实现精准扩缩容。

相关推荐
Lupino3 小时前
我把 OpenClaw 装到服务器上后,才明白它真正该装在哪里(实战复盘)
运维
数据智能老司机4 小时前
Kubernetes 上的生成式 AI——模型定制化
kubernetes·llm
数据智能老司机1 天前
Kubernetes 上的生成式 AI——模型数据
kubernetes·llm·agent
数据智能老司机1 天前
Kubernetes 上的生成式 AI——部署模型
kubernetes·aigc
Java陈序员2 天前
轻量强大!一款现代化的 Kubernetes 集群管理与监控工具!
云原生·容器·kubernetes
爱吃橘子橙子柚子3 天前
3CPU性能排查总结(超详细)【Linux性能优化】
运维·cpu
Johny_Zhao3 天前
OpenClaw中级到高级教程
linux·人工智能·信息安全·kubernetes·云计算·yum源·系统运维·openclaw
舒一笑5 天前
程序员效率神器:一文掌握 tmux(服务器开发必备工具)
运维·后端·程序员
NineData5 天前
数据库管理工具NineData,一年进化成为数万+开发者的首选数据库工具?
运维·数据结构·数据库
梦想很大很大6 天前
拒绝“盲猜式”调优:在 Go Gin 项目中落地 OpenTelemetry 链路追踪
运维·后端·go