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

如何以声明式方式配置Prometheus抓取单Pod内多容器的指标?

单Pod多容器指标的声明式抓取方案

针对Kubernetes环境下Prometheus抓取单Pod内多容器指标的需求,以下是几种无需静态配置、扩展性良好的声明式方案:

1. 基于Prometheus Operator的PodMonitor自定义资源

如果你的Prometheus由Prometheus Operator管理,PodMonitor是最直接的解决方案,它专门针对Pod级别的指标抓取进行声明式定义:

  • 首先给目标Pod添加识别标签(比如在Deployment的Pod模板中设置):
    metadata:
      labels:
        app: multi-container-app
    
  • 为每个容器的指标端口定义命名(必须在Pod的containers[].ports中指定name字段):
    containers:
    - name: app-container
      ports:
      - name: app-metrics
        containerPort: 9090 # 第一个容器的指标端口
    - name: sidecar-container
      ports:
      - name: sidecar-metrics
        containerPort: 9091 # 第二个容器的指标端口
    
  • 创建PodMonitor资源,匹配目标Pod标签并配置多端口抓取:
    apiVersion: monitoring.coreos.com/v1
    kind: PodMonitor
    metadata:
      name: multi-container-monitor
      namespace: your-namespace
    spec:
      selector:
        matchLabels:
          app: multi-container-app
      podMetricsEndpoints:
      - port: app-metrics
        path: /metrics
        interval: 30s
      - port: sidecar-metrics
        path: /metrics
        interval: 30s
    

Prometheus Operator会自动识别该PodMonitor,将抓取规则同步到Prometheus配置中。

2. 利用Pod Annotations自动发现

无需依赖Operator,直接在Pod模板中添加Annotations,让Prometheus的kubernetes-pods抓取配置自动识别多端口:

  • 基础配置(适用于多容器指标路径相同的场景):
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/ports: "9090,9091" # 逗号分隔多个容器指标端口
        prometheus.io/path: "/metrics"
    
  • 细粒度配置(适用于多容器指标路径不同的场景):
    metadata:
      annotations:
        prometheus.io/scrape: "true"
        # 第一个容器的指标配置
        prometheus.io/port-9090: "app-metrics"
        prometheus.io/path-9090: "/app-metrics"
        # 第二个容器的指标配置
        prometheus.io/port-9091: "sidecar-metrics"
        prometheus.io/path-9091: "/sidecar-metrics"
    

注意:需要确保Prometheus的kubernetes_sd_configs配置中开启了对Pod Annotations的解析(默认的kubernetes-pods抓取job通常已包含此逻辑)。

3. Headless Service + ServiceMonitor组合

如果需要通过Service层统一管理指标端点,可以创建Headless Service暴露多容器端口,再用ServiceMonitor关联抓取:

  • 创建Headless Service(避免负载均衡,直接指向Pod):
    apiVersion: v1
    kind: Service
    metadata:
      name: multi-container-svc
      namespace: your-namespace
      labels:
        app: multi-container-svc
    spec:
      clusterIP: None
      selector:
        app: multi-container-app
      ports:
      - name: app-metrics
        port: 9090
        targetPort: app-metrics # 对应Pod中容器的端口名
      - name: sidecar-metrics
        port: 9091
        targetPort: sidecar-metrics
    
  • 创建ServiceMonitor关联该Service的多端口:
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: multi-container-svc-monitor
      namespace: your-namespace
    spec:
      selector:
        matchLabels:
          app: multi-container-svc
      endpoints:
      - port: app-metrics
        interval: 30s
      - port: sidecar-metrics
        interval: 30s
    

以上方案均为声明式配置,无需手动修改Prometheus静态配置,新增容器或调整指标端口仅需更新对应的Kubernetes资源,扩展性极强。

内容的提问来源于stack exchange,提问作者Max Levy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 03:50:19