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

Prometheus忽略prometheus.io/port:http-metrics注解,错误抓取Pod所有端口

问题根源:正则表达式不支持端口名导致多端口抓取

你的判断完全正确,那个正则表达式就是问题的核心原因。

具体原因解析:

当你给Service配置prometheus.io/port: http-metrics注解后,Prometheus的relabel规则会执行以下操作:

  • 将__address__(格式为PodIP:端口)与注解值http-metrics用分号拼接,得到类似10.xx.xx.xx:8080;http-metrics的字符串
  • 尝试用正则([^:]+)(?::\d+)?;(\d+)匹配这个拼接后的字符串

但这个正则的最后一段(\d+)仅匹配纯数字,完全无法匹配包含字母和连字符的端口名http-metrics,导致整个replace动作执行失败。

一旦replace动作失效,Prometheus不会将目标地址替换为指定端口,而是默认抓取该Endpoints暴露的所有端口——也就是Pod的8080(Web应用端口)和8083(metrics端口),这就出现了你观察到的错误行为。

当你把注解改为prometheus.io/port: 8083时,拼接后的字符串为10.xx.xx.xx:8080;8083,完全符合正则的匹配规则,replace动作正常执行,将目标地址替换为10.xx.xx.xx:8083,自然就只抓取正确的metrics端口了。

可选修复方案:

如果想继续使用端口名而非数字端口,需要修改relabel规则的正则表达式,使其支持Kubernetes允许的端口名格式(字母开头,包含字母、数字、连字符):

- action: replace
  regex: ([^:]+)(?::\d+)?;([a-zA-Z][a-zA-Z0-9-]*)
  replacement: $1:$2
  source_labels:
  - __address__
  - __meta_kubernetes_service_annotation_prometheus_io_port
  target_label: __address__

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:35:19