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.
Voraussetzung
Der Prometheus Operator muss im Cluster installiert sein, um ServiceMonitors zu verwenden.
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:
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.13.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:
Prometheus sucht nach ServiceMonitors mit diesem Label:
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