You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

K8s HPA对接Prometheus自定义指标带m单位显示问题咨询

后缀m的本质说明

Kubernetes 为了避免浮点运算的精度误差,所有数值型指标(包括自定义指标)的展示和计算默认采用毫单位(milli) 规范:1 单位 = 1000m,你看到的7700m等价于实际值7.7,这个格式是K8s的通用规则,并不是系统把你的任务数指标错误识别成了CPU类资源。

过度扩容的原因

你配置的HPA阈值averageValue: 5会被系统默认解析为5个完整单位,也就是5000m,7700m确实已经超过阈值会触发扩容。如果实际平均任务数只有7.7的情况下直接扩容到10副本,大概率是Prometheus-adapter返回给HPA的指标值和你应用暴露的原始值不匹配,常见原因是Prometheus-adapter的自定义指标规则中没有指定正确的单位,导致指标值被自动放大了1000倍,或者指标聚合规则错误(比如用sum求和而不是avg求平均计算Pod指标)。

你可以执行以下命令查看Prometheus-adapter返回的真实指标值,和Prometheus中查到的应用原始指标做对比:

kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1/namespaces/<你的命名空间>/pods/*/jobs_executing
解决方法

方案1:直接调整HPA阈值格式(无需改适配器配置)

直接把阈值按照毫单位规范填写,比如你期望平均任务数到5触发扩容,就把阈值写为5000m,和系统展示格式完全对齐,避免解析歧义:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: "myapp"
spec:
  scaleTargetRef:
    apiVersion: "apps/v1"
    kind: "Deployment"
    name: "myapp"
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Pods
    pods:
      metric:
        name: "jobs_executing"
      target:
        type: AverageValue
        averageValue: 5000m

方案2:修正Prometheus-adapter指标配置(推荐)

在Prometheus-adapter的ConfigMap规则中,给jobs_executing指标指定为无量纲类型,避免适配器自动做单位转换:

rules:
- seriesQuery: 'jobs_executing{job!=""}'
  resources:
    overrides:
      namespace: {resource: "namespace"}
      pod: {resource: "pod"}
  name:
    matches: "jobs_executing"
    as: "jobs_executing"
  metricsQuery: <<.Series>>{<<.LabelMatchers>>}
  # 关键配置:指定指标为无量纲,禁用毫单位转换
  unit: ""

配置后HPA拿到的就是应用暴露的原始整数值,直接写averageValue: 5就会按照5个任务的阈值正常计算,展示时也不会出现m后缀。

额外说明

K8s HPA本身原生支持浮点型阈值计算,不需要额外开启配置,你不需要担心浮点精度问题。如果确认指标值正确还是出现异常扩容,可以检查HPA的扩容冷却窗口配置,默认的扩容冷却时间是5分钟,避免短时间指标波动导致频繁扩缩容。

内容的提问来源于stack exchange,提问作者Ahsan Nasir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:18:00