Kubernetes Horizontal Pod Autoscaler 进阶:自定义指标伸缩

在 Kubernetes 中,Horizontal Pod Autoscaler (HPA) 的进阶用法允许基于自定义指标实现精细化伸缩控制,突破默认 CPU/内存指标的限制。以下是完整实现路径:


一、前置条件
  1. 指标采集系统部署

    • 安装 Prometheus:helm install prometheus prometheus-community/prometheus
    • 部署指标导出器(如 Node Exporter 或应用自定义 exporter)
  2. 指标聚合层配置

    • 安装 Prometheus Adapter:
      # values.yaml 关键配置
      rules:
        custom:
          - seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
            resources:
              overrides: { namespace: { resource: "namespace" }, pod: { resource: "pod" } }
            name:
              matches: "^(.*)_total"
              as: "${1}_per_second"
            metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'
      

    • 验证指标:kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1

二、自定义指标伸缩实战

场景:根据应用的 HTTP 请求速率(QPS)自动伸缩

  1. 定义 HPA 资源

    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
      name: http-requests-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: my-app
      minReplicas: 2
      maxReplicas: 10
      metrics:
      - type: Pods
        pods:
          metric:
            name: http_requests_per_second  # 匹配 Prometheus Adapter 定义的指标名
          target:
            type: AverageValue
            averageValue: 100  # 目标值:每秒 100 个请求/Pod
    

  2. 关键参数解析

    • target.type 可选值:
      • AverageValue:指标平均值
      • Value:原始值(需配合绝对值使用)
    • 计算公式: $$ \text{期望副本数} = \left\lceil \frac{\text{当前指标值}}{\text{目标指标值}} \times \text{当前副本数} \right\rceil $$

三、高级调优策略
  1. 行为控制(behavior 字段)

    behavior:
      scaleDown:
        stabilizationWindowSeconds: 300  # 缩容冷却窗口
        policies: [{ type: Percent, value: 10, periodSeconds: 60 }] # 每分钟最多缩容10%
      scaleUp:
        stabilizationWindowSeconds: 0
        policies: [{ type: Percent, value: 100, periodSeconds: 10 }] # 允许100%快速扩容
    

  2. 多指标组合

    metrics:
    - type: Resource
      resource:
        name: cpu
        target: { type: Utilization, averageUtilization: 50 }
    - type: Pods
      pods:
        metric: { name: http_requests_per_second }
        target: { type: AverageValue, averageValue: 100 }
    

    HPA 将选择计算后副本数最大的指标执行伸缩


四、诊断命令
# 查看 HPA 状态
kubectl describe hpa http-requests-hpa

# 检查指标采集
kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1 | jq

# 模拟负载测试(压测工具)
kubectl run -it --rm load-generator --image=busybox -- sh
while true; do wget -qO- http://my-app-svc; done

注意事项

  1. 指标采集延迟可能导致伸缩滞后,建议指标时间窗口 ≥ 2 分钟
  2. 生产环境务必设置 stabilizationWindowSeconds 避免抖动
  3. 自定义指标需满足稳定性:$$ \text{指标方差} < 20% \times \text{目标值} $$

通过自定义指标,HPA 可实现对业务核心指标(如队列深度、事务延迟、gRPC 错误率等)的智能响应,实现真正的业务驱动扩缩容。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐