如何配置Prometheus仅抓取Kubernetes Pod的指定指标端口?
当然可以!你完全可以配置Prometheus只抓取Pod的3093和9113端口,避开不提供指标的80端口。下面给你几种实用的方案,根据你的场景选就行:
方案一:通过Pod注解指定多个目标端口
如果你的Prometheus配置支持解析多端口注解(比如主流的kube-prometheus-stack默认支持),直接在Pod的metadata里添加以下注解即可:
metadata: annotations: prometheus.io/scrape: "true" prometheus.io/ports: "3093,9113" # 用逗号分隔需要抓取的端口
这个注解会告诉Prometheus只针对这两个端口创建抓取目标,自动忽略80端口。
方案二:为指标端口创建独立Service
如果你的Prometheus是通过Service发现来抓取指标的(默认配置通常如此),可以给3093和9113端口分别创建单独的Service,每个Service只暴露一个指标端口,并添加抓取注解:
比如针对3093端口的Service:
apiVersion: v1 kind: Service metadata: name: my-app-metrics-3093 annotations: prometheus.io/scrape: "true" prometheus.io/port: "3093" spec: selector: app: my-app # 匹配你的Pod标签 ports: - name: metrics-3093 port: 3093 targetPort: 3093
同理再创建一个针对9113端口的Service。这样Prometheus会发现两个独立的抓取目标,完全不会涉及80端口。这种方式结构清晰,也方便后续单独调整某个端口的抓取配置。
方案三:修改Prometheus抓取配置的Relabel规则
如果需要全局统一控制,或者你的Prometheus不支持多端口注解,可以直接修改Pod抓取job的relabel规则,过滤掉80端口:
job_name: 'kubernetes-pods' kubernetes_sd_configs: - role: pod relabel_configs: # 保留开启了抓取注解的Pod - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] action: keep regex: true # 只保留3093和9113端口的目标 - source_labels: [__meta_kubernetes_pod_container_port_number] action: keep regex: ^(3093|9113)$ # 其他默认的relabel规则(比如路径、scheme等)继续保留 - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] action: replace target_label: __metrics_path__ regex: (.+) # ... 其他规则
这个规则会在服务发现阶段就过滤掉80端口的目标,只保留你需要的两个端口。
内容的提问来源于stack exchange,提问作者svenwltr
相关产品推荐
相关产品推荐

