在不同端口上重复抓取目标
Duplicate scrape targets on different ports
我使用的抓取配置与示例中建议的配置非常相似。出于某种原因,我有重复的抓取目标。我想知道为什么会这样
我的抓取配置:
- 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: :
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
因此我设置了要抓取的注释pods:
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:
为什么会这样?为什么会出现在80端口下?端口为 9090
的目标表明它从注释中读取端口的重新标记配置有效。
附加信息:
- prometheus pod 是有状态集的一部分
- 它只定义了一个(未命名的)端口 9090
- 它有一个不暴露端口的初始化容器
- 显然,屏幕截图仅显示了
kubernetes-pods
作业中的抓取目标
- 这只是 prometheus (v2.22.0),不受 prometheus operator 管理
Prometheus 的 pod
服务发现角色为 Pod 的每个容器创建一个目标,包括初始化容器。您的 Pod 中有一个初始化容器,因此这会产生两个目标。
如果容器未声明端口(如您的初始容器),则会创建 port-free 目标。这意味着,设置 __address__
的 replace
规则中的正则表达式不匹配,然后 Prometheus 默认为此目标使用端口 80。
要删除初始容器目标,请尝试添加以下规则:
- source_labels: [ __meta_kubernetes_pod_container_init ]
regex: true
action: drop
我使用的抓取配置与示例中建议的配置非常相似。出于某种原因,我有重复的抓取目标。我想知道为什么会这样
我的抓取配置:
- 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: :
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
因此我设置了要抓取的注释pods:
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:
为什么会这样?为什么会出现在80端口下?端口为 9090
的目标表明它从注释中读取端口的重新标记配置有效。
附加信息:
- prometheus pod 是有状态集的一部分
- 它只定义了一个(未命名的)端口 9090
- 它有一个不暴露端口的初始化容器
- 显然,屏幕截图仅显示了
kubernetes-pods
作业中的抓取目标 - 这只是 prometheus (v2.22.0),不受 prometheus operator 管理
Prometheus 的 pod
服务发现角色为 Pod 的每个容器创建一个目标,包括初始化容器。您的 Pod 中有一个初始化容器,因此这会产生两个目标。
如果容器未声明端口(如您的初始容器),则会创建 port-free 目标。这意味着,设置 __address__
的 replace
规则中的正则表达式不匹配,然后 Prometheus 默认为此目标使用端口 80。
要删除初始容器目标,请尝试添加以下规则:
- source_labels: [ __meta_kubernetes_pod_container_init ]
regex: true
action: drop