如何调试PodMonitor生成的规则?Prometheus无法抓取Pod指标排查
问题现象
所有Pod均正常运行,Prometheus实例无配置加载错误,但Prometheus GUI中无任何抓取目标,服务发现的所有目标状态均为dropped,包括匹配promfiber标签的Pod。
核心问题定位
查看生成的Prometheus抓取配置,其中一条relabel规则是关键:
- source_labels: [__meta_kubernetes_pod_container_port_name] separator: ; regex: "3000" replacement: $1 action: keep
这条规则要求保留端口名称为"3000"的容器端口,但从服务发现元数据可以看到,只有__meta_kubernetes_pod_container_port_number="3000"(端口号),完全没有__meta_kubernetes_pod_container_port_name字段——因为你的Pod部署配置里只定义了容器端口的数值,没有给端口设置名称。
而你的PodMonitor配置中,port字段填的是容器端口的数值3000,Prometheus Operator会默认把这个值当作端口名称去匹配,而不是端口号,这就导致这条relabel规则过滤掉了所有符合标签的Pod,最终所有目标被丢弃。
修复方案
有两种可行的解决方式:
方式1:给Pod端口命名,PodMonitor引用端口名称(推荐)
修改Pod部署的Terraform配置,给容器端口添加名称:
resource "kubernetes_deployment_v1" "promfiberdeploy" { metadata { name = "promfiberdeploy" namespace = var.nsname } spec { selector { match_labels = { app = "promfiber" } } replicas = "1" template { metadata { labels = { app = "promfiber" } annotations = { "prometheus.io/path" = "/metrics" "prometheus.io/scrape" = "true" "prometheus.io/port" = 3000 } } spec { container { name = "pf1" image = "kokizzu/pf1:v0001" port { container_port = 3000 name = "metrics" # 添加端口名称 } } } } } }
同步修改PodMonitor配置,引用这个端口名称:
resource "kubernetes_manifest" "pf1prompodmonitor" { manifest = { "apiVersion" = "monitoring.coreos.com/v1" "kind" = "PodMonitor" "metadata" = { "name" = "pf1prompodmonitor" "namespace" = var.nsname "labels" = { "name" = "pf1podmonitor" } } "spec" = { "selector" = { "matchLabels" = { "app" = kubernetes_deployment_v1.promfiberdeploy.spec.0.selector.0.match_labels.app } } "namespaceSelector" = { "matchNames" = [ var.nsname ] } "podMetricsEndpoints" = [ { "interval" = "5s" "port" = "metrics" # 引用端口名称而非数字 } ] } } }
方式2:PodMonitor使用targetPort指定端口号(临时方案)
如果不想修改Pod配置,可以在PodMonitor的podMetricsEndpoints中用targetPort指定端口号,替换原来的port字段:
resource "kubernetes_manifest" "pf1prompodmonitor" { manifest = { # ... 其他配置不变 "spec" = { # ... 其他配置不变 "podMetricsEndpoints" = [ { "interval" = "5s" "targetPort" = 3000 # 用targetPort指定端口号 } ] } } }
这种方式不需要修改Pod,但端口号变化时需要同步更新PodMonitor,维护性较差,不推荐长期使用。
验证修复
应用修改后,重新查看Prometheus生成的抓取配置,那条基于__meta_kubernetes_pod_container_port_name的keep规则会正确匹配(或不再存在错误的过滤规则),服务发现的目标将不再被丢弃,Prometheus即可正常抓取所有promfiber Pod的指标。
内容的提问来源于stack exchange,提问作者Kokizzu

