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

如何让Prometheus动态配置可伸缩Kubernetes Pod的IP以抓取指标?

Kubernetes中实现Prometheus动态抓取扩缩容Pod的指标方法

在Kubernetes环境中,要让Prometheus自动追踪扩缩容的Pod并抓取指标,核心是利用Prometheus的Kubernetes服务发现机制,以下是几种实用方案:

方案1:通过Service + Endpoints动态发现(最常用)

这种方案依赖Kubernetes Service的Endpoints自动更新特性,当Pod扩缩容时,Endpoints会同步新增/删除Pod IP,Prometheus通过监听Endpoints实现动态抓取。

  1. 给目标Pod打统一标签
    确保所有需要被抓取的Pod都带有相同标签,比如app: metrics-app。

  2. 创建对应Service
    定义一个Service,selector匹配上述标签,并暴露metrics端口:

    apiVersion: v1
    kind: Service
    metadata:
      name: metrics-app-service
      namespace: default
    spec:
      selector:
        app: metrics-app
      ports:
      - name: metrics
        port: 9090
        targetPort: 9090 # 对应Pod中metrics监听的端口
    
  3. 配置Prometheus抓取规则
    在Prometheus的scrape_configs中添加以下配置,过滤出目标Service的Endpoints:

    scrape_configs:
    - job_name: 'metrics-app'
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names:
          - default # 替换为Pod所在命名空间
      relabel_configs:
      # 只保留标签为app=metrics-app的Service对应的Endpoints
      - source_labels: [__meta_kubernetes_service_label_app]
        regex: metrics-app
        action: keep
      # 只保留端口名为metrics的端点
      - source_labels: [__meta_kubernetes_endpoint_port_name]
        regex: metrics
        action: keep
      # 拼接目标地址(如果端口不是默认的,替换为实际端口)
      - target_label: __address__
        replacement: '$1:9090'
    

方案2:直接基于Pod服务发现

如果不想创建Service,可以直接让Prometheus发现带有指定标签的Pod,适合更灵活的场景。

配置Prometheus抓取规则:

scrape_configs:
- job_name: 'metrics-app-pods'
  kubernetes_sd_configs:
  - role: pod
    namespaces:
      names:
      - default
  relabel_configs:
  # 过滤标签为app=metrics-app的Pod
  - source_labels: [__meta_kubernetes_pod_label_app]
    regex: metrics-app
    action: keep
  # 保留包含metrics端口的容器
  - source_labels: [__meta_kubernetes_pod_container_port_name]
    regex: metrics
    action: keep
  # 拼接Pod IP和端口作为抓取地址
  - source_labels: [__meta_kubernetes_pod_ip, __meta_kubernetes_pod_container_port_number]
    separator: ':'
    target_label: __address__

方案3:通过Prometheus Operator自动化管理

如果用Prometheus Operator来管理Prometheus实例,直接通过ServiceMonitor资源实现自动化配置,无需手动修改Prometheus配置文件。

  1. 创建ServiceMonitor资源

    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: metrics-app-monitor
      namespace: monitoring # 替换为Prometheus所在命名空间
      labels:
        release: prometheus # 匹配Prometheus实例的标签(需和Prometheus CR的标签一致)
    spec:
      selector:
        matchLabels:
          app: metrics-app # 匹配目标Service的标签
      endpoints:
      - port: metrics # Service中定义的metrics端口名称
        path: /metrics
        interval: 30s # 抓取间隔
      namespaceSelector:
        matchNames:
        - default # 目标Service所在命名空间
    
  2. 验证效果
    Prometheus Operator会自动将ServiceMonitor的配置同步到Prometheus实例,当Pod扩缩容时,Service的Endpoints更新后,Prometheus会自动开始抓取新Pod的指标。

注意事项

  • 确保网络策略允许Prometheus所在命名空间访问目标Pod的metrics端口,避免抓取失败。
  • 可以通过Prometheus UI的「Service Discovery」页面,查看当前发现的目标列表,验证配置是否生效。
  • 如果Pod的metrics端点需要认证,需在抓取配置中添加对应认证参数(如basic_auth)。

内容的提问来源于stack exchange,提问作者Faramarz Qoshchi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:53:08