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

如何调试PodMonitor生成的规则?Prometheus无法抓取Pod指标排查

问题分析:Prometheus Operator PodMonitor导致抓取目标被丢弃

问题现象

所有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:40:39