ServiceMonitor
ServiceMonitor
Der ServiceMonitor-Helper erstellt Prometheus ServiceMonitor-Ressourcen für automatisches Metrics-Scraping.
Übersicht
ServiceMonitors sind Custom Resources des Prometheus Operators. Sie definieren, wie Prometheus Metriken von Ihren Services scrapen soll.
Basis-Konfiguration
monitoring:
- name: my-service
namespace: monitoring
release: prometheus
endpoints:
- port: metrics
interval: 30s
Konfigurationsoptionen
Endpoints
monitoring:
- name: my-service
namespace: monitoring
release: prometheus
endpoints:
- port: metrics # Port-Name des Service
interval: 30s # Scrape-Intervall
path: /metrics # Metrics-Pfad (Standard: /metrics)
scheme: http # http oder https
Mehrere Endpoints
Ein Service kann mehrere Metrics-Endpoints haben:
monitoring:
- name: my-service
namespace: monitoring
release: prometheus
endpoints:
# Haupt-Metriken
- port: metrics
interval: 15s
path: /metrics
# Slow-Queries Metriken
- port: metrics
interval: 60s
path: /metrics/slow
# Health Metriken
- port: http
interval: 30s
path: /healthz
Mehrere ServiceMonitors
monitoring:
# API Service
- name: api
namespace: monitoring
release: prometheus
endpoints:
- port: metrics
interval: 15s
# Database Exporter
- name: postgres-exporter
namespace: monitoring
release: prometheus
endpoints:
- port: metrics
interval: 30s
# Redis Exporter
- name: redis-exporter
namespace: monitoring
release: prometheus
endpoints:
- port: metrics
interval: 30s
Label-Matching
Der ServiceMonitor verwendet automatisch Labels zum Matchen:
monitoring:
- name: my-api # Wird zu my-api-metrics
namespace: monitoring
release: prometheus
endpoints:
- port: metrics
interval: 30s
Prometheus Operator sucht nach Services mit dem Label:
app.kubernetes.io/name: my-api
Vollständiges Beispiel
Mit Chart-Modus
chart:
enabled: true
fullnameOverride: "my-api"
container:
image: myapp/api:latest
ports:
- name: http
containerPort: 8080
- name: metrics
containerPort: 9090
service:
type: ClusterIP
ports:
- port: 80
targetPort: http
name: http
- port: 9090
targetPort: metrics
name: metrics
# ServiceMonitor für Prometheus
monitoring:
- name: my-api
namespace: monitoring
release: prometheus
endpoints:
- port: metrics
interval: 15s
path: /metrics
scheme: http
Standalone Helper
# Chart.yaml
apiVersion: v2
name: monitoring-setup
version: 1.0.0
dependencies:
- name: ohmyhelm
alias: mon
repository: https://gitlab.com/ayedocloudsolutions/ohmyhelm
version: 1.18.0
# values.yaml
mon:
monitoring:
# Kubernetes Nodes
- name: node-exporter
namespace: monitoring
release: prometheus
endpoints:
- port: metrics
interval: 30s
# Kubernetes API Server
- name: kube-apiserver
namespace: monitoring
release: prometheus
endpoints:
- port: https
interval: 30s
scheme: https
tlsConfig:
insecureSkipVerify: true
# etcd
- name: etcd
namespace: monitoring
release: prometheus
endpoints:
- port: metrics
interval: 30s
Erweiterte Konfiguration
Mit TLS
monitoring:
- name: secure-service
namespace: monitoring
release: prometheus
endpoints:
- port: https-metrics
interval: 30s
scheme: https
tlsConfig:
insecureSkipVerify: true
# Oder mit Zertifikat:
# caFile: /etc/prometheus/secrets/ca.crt
# certFile: /etc/prometheus/secrets/client.crt
# keyFile: /etc/prometheus/secrets/client.key
Mit Basic Auth
monitoring:
- name: protected-service
namespace: monitoring
release: prometheus
endpoints:
- port: metrics
interval: 30s
basicAuth:
username:
name: metrics-auth
key: username
password:
name: metrics-auth
key: password
Mit Bearer Token
monitoring:
- name: token-service
namespace: monitoring
release: prometheus
endpoints:
- port: metrics
interval: 30s
bearerTokenSecret:
name: metrics-token
key: token
Prometheus Operator Labels
Der ServiceMonitor muss Labels haben, die der Prometheus-Konfiguration entsprechen:
monitoring:
- name: my-service
namespace: monitoring
release: prometheus # Muss dem Prometheus-Release entsprechen
Der release Wert wird als Label gesetzt:
metadata:
labels:
release: prometheus
Prometheus sucht nach ServiceMonitors mit diesem Label:
serviceMonitorSelector:
matchLabels:
release: prometheus
Best Practices
- Sinnvolle Intervalle - Kurze Intervalle für kritische Metriken, längere für weniger wichtige
- Namespace-Trennung - ServiceMonitors im
monitoringNamespace erstellen - Labels konsistent halten - Verwenden Sie das korrekte
releaseLabel - Resource Labels - Fügen Sie Labels für Filterung hinzu
- Dokumentation - Dokumentieren Sie welche Metriken verfügbar sind
Troubleshooting
ServiceMonitor prüfen
# ServiceMonitors anzeigen
kubectl get servicemonitors -n monitoring
# Details anzeigen
kubectl describe servicemonitor my-api-metrics -n monitoring
# Prometheus Targets prüfen
kubectl port-forward svc/prometheus 9090:9090 -n monitoring
# Dann: http://localhost:9090/targets
Häufige Probleme
| Problem | Ursache | Lösung |
|---|---|---|
| Target nicht gefunden | Label-Mismatch | Service Labels prüfen |
| Scrape fehlgeschlagen | Port/Path falsch | Endpoints-Konfiguration prüfen |
| Keine Metriken | App exposed keine Metriken | Metriken-Endpoint der App prüfen |
Service Labels prüfen
# Service Labels anzeigen
kubectl get svc my-api -n production -o yaml | grep -A 10 labels
# Selector des ServiceMonitors
kubectl get servicemonitor my-api-metrics -n monitoring -o yaml | grep -A 10 selector