ServiceMonitor & PodMonitor

ServiceMonitor

serviceMonitor1

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: app-monitor
  labels:
    release: prometheus
spec:
  selector:
    matchExpressions:
    - key: monitor
      operator: In
      values:
      - enabled
  endpoints:
  - port: metrics
    path: /metrics
    interval: 30s
  namespaceSelector:
    any: true

然后在每个需要被监控的 Service 上加上:

metadata:
  labels:
    monitor: enabled

serviceMonitor2

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: all-services-monitor
  namespace: monitoring
spec:
  namespaceSelector:
    any: true                # 匹配所有命名空间
  selector: {}               # 匹配所有 Service
  endpoints:
  - port: metrics          # 要抓取的端口名称
    path: /metrics
    interval: 15s

会增加无意义的指标噪音,影响 Prometheus 存储和性能;

可能误抓取非标准 Prometheus 格式接口,导致 scrape error。

备注:

  • Prometheus 实例必须允许跨命名空间发现

    确保你的 Prometheus 实例配置中包含:

    spec:
      serviceMonitorNamespaceSelector:
        any: true
      serviceMonitorSelector: {}

    否则它无法发现其它命名空间中的 ServiceMonitor

  • 端口名必须严格一致

    你配置了:

    - port: metrics

    这意味着服务的 spec.ports[].name 必须是 metrics,否则无法匹配到。

Prometheus 如何发现多个 exporter?

配合统一的 ServiceMonitor / PodMonitor 和 label 策略,比如: yaml 复制 编辑

selector:
  matchLabels:
    app.kubernetes.io/component: exporter

PodMonitor

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: example-podmonitor
spec:
  selector:
    matchLabels:
      app: my-app
      monitor: enabled
  podMetricsEndpoints:
  - port: metrics
    path: /metrics
    interval: 30s
    
# 或

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: example-podmonitor
spec:
  selector:
    matchExpressions:
    - key: app
      operator: In
      values:
      - my-app
    - key: monitor
      operator: In
      values:
      - enabled
  podMetricsEndpoints:
  - port: metrics
    path: /metrics
    interval: 30s

Last updated