首页 > 解决方案 > 不同端口上的重复抓取目标

问题描述

我使用的抓取配置与示例中建议的配置非常相似。出于某种原因,我有重复的抓取目标。我想知道为什么会这样

我的抓取配置:

  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [ __meta_kubernetes_pod_annotation_prometheus_io_scrape ]
        action: keep
        regex: true
      - source_labels: [ __meta_kubernetes_pod_annotation_prometheus_io_path ]
        action: replace
        target_label: __metrics_path__
        regex: (.+)
      - source_labels: [ __address__, __meta_kubernetes_pod_annotation_prometheus_io_port ]
        action: replace
        regex: (.+):(?:\d+);(\d+)
        replacement: ${1}:${2}
        target_label: __address__
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
      - action: labeldrop
        regex: statefulset_kubernetes_io_pod_name # This is duplicate because we already have the pod_name
      - source_labels: [ __meta_kubernetes_namespace ]
        action: replace
        target_label: kubernetes_namespace
      - source_labels: [ __meta_kubernetes_pod_name ]
        action: replace
        target_label: kubernetes_pod_name

因此,我在要抓取的 pod 上设置了注释:

metadata:
  annotations:
    checksum/config: "8755a7a06e8302a6861c536738da919828761d7c6a794b2c52c920b4ddae163e"
    cni.projectcalico.org/podIP: "172.22.130.165/32"
    kubernetes.io/psp: "prometheus"
    prometheus.io/path: "/metrics"
    prometheus.io/port: "9090"
    prometheus.io/scrape: "true"

现在由于某种原因,所有这些目标在抓取目标中出现两次(在不同的端口下),如 Prometheus UI 所示:

Prometheus 抓取目标

为什么会这样?为什么会出现在80端口下?带有端口的目标9090显示它从注释中读取端口的重新标记配置有效。

附加信息:

标签: prometheus

解决方案


Prometheus的pod服务发现角色为 Pod 的每个容器创建一个目标,包括 init 容器。您的 Pod 中有一个 init 容器,因此这会产生两个目标。

如果容器未声明端口(如您的 init 容器),则会创建一个无端口目标。这意味着,您replace设置的规则中的正则表达式__address__不匹配,然后 Prometheus 默认使用端口 80 作为该目标。

要删除 init 容器目标,请尝试添加以下规则:

- source_labels: [ __meta_kubernetes_pod_container_init ]
  regex: true
  action: drop

推荐阅读