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: enabledserviceMonitor2
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: exporterPodMonitor
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: 30sLast updated