Prometheus Adapter自定义指标无值致Kubernetes HPA扩缩容异常
我来帮你梳理下问题的核心原因,以及对应的解决步骤:
核心问题分析
你遇到的新指标有名称但无数值的情况,大概率是指标聚合时丢失了Kubernetes资源关联标签,或者标签匹配条件不符合原指标的实际情况。具体来说:
1. 聚合查询丢失资源标签
你的metricsQuery直接用sum()做了全局聚合,没有保留namespace和pod标签:
metricsQuery: 'sum(event_subscription_current_message_lag{queue="webhooks", container_name!="POD"})'
这种聚合会把所有符合条件的时间序列合并成一个单一数值,丢失了和Kubernetes Pod/Namespace关联的关键标签。而Prometheus Adapter需要这些标签来把自定义指标映射到对应的K8s资源上,最终导致HPA查询时找不到匹配的资源条目。
2. 标签匹配条件验证
你需要先确认原指标event_subscription_current_message_lag是否真的带有queue="webhooks"、container_name!="POD"这些标签:
- 登录Prometheus UI,执行查询
event_subscription_current_message_lag,查看所有时间序列的标签集合,确认是否存在queue标签,且值包含webhooks/webhook_retries。 - 如果原指标没有
queue标签,那你的sum查询自然会返回空结果。
解决方案
步骤1:修改Adapter规则,保留资源标签
更新你的Prometheus Adapter Helm配置,在metricsQuery中添加by (namespace, pod)来保留资源关联标签:
logLevel: 1 metricsRelistInterval: 5s prometheus: url: 'http://<prometheus-url>' rules: custom: - seriesQuery: '{__name__="event_subscription_current_message_lag"}' name: matches: "(.*)" as: '${1}_webhooks' resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} metricsQuery: 'sum(event_subscription_current_message_lag{queue="webhooks", container_name!="POD"}) by (namespace, pod)' - seriesQuery: '{__name__="event_subscription_current_message_lag"}' name: matches: "(.*)" as: '${1}_webhook_retries' resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} metricsQuery: 'sum(event_subscription_current_message_lag{queue="webhook_retries", container_name!="POD"}) by (namespace, pod)'
步骤2:验证修改后的查询
- 先在Prometheus UI中执行修改后的
metricsQuery,确认能得到带有namespace和pod标签的结果,且数值正确。 - 重新部署Prometheus Adapter:
helm upgrade prometheus-adapter <你的Helm chart> -f <修改后的配置文件> -n <你的命名空间>
步骤3:验证自定义指标
执行以下命令查询新指标,确认是否有返回数值:
kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1/namespaces/<你的Deployment命名空间>/pods/*/event_subscription_current_message_lag_webhooks
如果返回结果中items字段包含数值,说明配置生效。
步骤4:检查HPA状态
最后查看HPA的运行状态,确认它能正确获取指标:
kubectl describe hpa <你的HPA名称>
在Events部分如果没有报错信息,且Target指标显示正常,就说明自动扩缩容可以正常工作了。
额外注意事项
确保你的指标推送服务在推送event_subscription_current_message_lag时,已经正确附加了namespace、pod和queue标签。如果这些标签缺失,即使修改了Adapter规则,也无法完成资源关联。
内容的提问来源于stack exchange,提问作者brad142

