K8s HPA对接Prometheus自定义指标带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

