Keda集成Prometheus时HPA指标值异常及数据转换疑问咨询
问题分析与解决方案
1. Keda是否会转换Prometheus返回的数据?
会。Keda的Prometheus触发器会自动将PromQL查询结果转换为HPA可识别的格式,你看到的3500m是HPA对小数的千分位表示(即3.5),和Prometheus里返回的单值是同一个数值,只是显示单位不同。
另外,HPA显示的34%/87% + 1 more...是Keda额外生成的资源利用率指标,和你自定义的Prometheus指标并存,这是Keda默认行为——它会同时维护自定义指标与基础资源指标的HPA配置。
2. 排查方向
- 查看HPA详细配置:执行
kubectl describe hpa keda-pythonb -n integration,重点看Metrics字段,确认自定义Prometheus指标的类型(Pods/Object)、目标值与单位是否符合预期。 - 验证PromQL返回值格式:在Prometheus中执行查询后,确认返回的
value是纯数值(如25.3),而非带单位的字符串(如25.3%),避免Keda解析异常。 - 检查Keda配置细节:确认
threshold为字符串类型(你的配置中'70'是正确的),serverAddress指向可正常访问的Prometheus实例,无网络权限问题。 - 查看Keda Operator日志:执行
kubectl logs -n keda deployment/keda-operator,搜索keda-pythonb关键字,排查指标获取、转换过程中的错误日志。
3. PromQL正确性验证
你的PromQL存在逻辑不规范问题,修正如下:
原查询问题
avg(floor((container_memory_usage_bytes{pod=~"pythonb-.*",container=~"proxy"} / container_spec_memory_limit_bytes != +Inf) * 100))
- 分母未做前置过滤:若
container_spec_memory_limit_bytes为0,除法会返回+Inf,虽然后续!= +Inf会排除,但写法不严谨,易引发不可预期的样本丢失。 - 无时间窗口:瞬时查询易受波动影响,导致扩缩容决策不稳定。
修正后的查询
avg_over_time( floor( container_memory_usage_bytes{pod=~"pythonb-.*",container=~"proxy"} / ignoring() (container_spec_memory_limit_bytes{pod=~"pythonb-.*",container=~"proxy"} > 0) * 100 )[1m:10s] )
- 先过滤分母大于0的样本,避免除法异常;
- 用
avg_over_time取最近1分钟的平均值,降低瞬时波动影响; - 保留
floor对结果取整,保证指标数值的可读性。
内容的提问来源于stack exchange,提问作者sush
相关产品推荐
相关产品推荐

