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
相关产品推荐
相关产品推荐

