- Authors

- Name
- Phillip Pham
- @ddppham
TL;DR
Effektives Kubernetes-Alerting mit Prometheus erfordert eine klare Hierarchie aus Critical, Warning und Info. Symptombasierte Alerts statt ursachenbasierter vermeiden Alert Fatigue. Mit PrometheusRule-CRDs und Alertmanager-Routing landen die richtigen Alerts beim richtigen Team — per Slack, PagerDuty oder E-Mail.
Kubernetes Alerting mit Prometheus und Alertmanager
Monitoring ohne Alerting ist wie ein Rauchmelder ohne Batterie. Aber zu viele Alerts sind genauso gefährlich — wenn das Team jede Benachrichtigung ignoriert, gehen echte Probleme unter. Dieses Phänomen heißt Alert Fatigue, und es ist in Kubernetes-Umgebungen weit verbreitet.
Hier ist eine PrometheusRule, die einen Alert bei hoher Pod-Restart-Rate auslöst:
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: pod-alerts
namespace: monitoring
labels:
release: kube-prometheus-stack
spec:
groups:
- name: pod.rules
rules:
- alert: PodCrashLooping
expr: rate(kube_pod_container_status_restarts_total[15m]) * 60 * 5 > 0
for: 10m
labels:
severity: warning
annotations:
summary: "Pod {{ $labels.namespace }}/{{ $labels.pod }} ist in CrashLoop"
description: "Der Pod startet seit 10 Minuten wiederholt neu."
Alert-Hierarchie: Critical, Warning, Info
Nicht jeder Alert verdient einen Pager-Ruf um 3 Uhr nachts. Eine saubere Hierarchie ist die Grundlage für funktionierendes Alerting.
Critical — Sofortige Reaktion nötig. Nutzer sind betroffen oder werden es in Minuten sein. Beispiele: API nicht erreichbar, Cluster-Node down, PersistentVolume voll.
Warning — Handlungsbedarf innerhalb von Stunden. Kein sofortiger Impact, aber Verschlechterung droht. Beispiele: CPU-Throttling, Certificate läuft in 14 Tagen ab, Disk bei 80%.
Info — Zur Kenntnis, kein Handlungsbedarf. Hilfreich für Dashboards und Nachverfolgung. Beispiele: Deployment skaliert, neues Release deployed.
| Severity | Reaktionszeit | Routing | Beispiel |
|---|---|---|---|
| Critical | Sofort | PagerDuty + Slack | Node NotReady > 5 Min |
| Warning | Stunden | Slack-Channel | Disk > 80% |
| Info | Keine | Dashboard/Log | Deployment skaliert |
Symptombasiert statt ursachenbasiert
Der häufigste Fehler beim Alerting: Alerts auf Ursachen statt auf Symptome setzen. Ein Alert "CPU bei 90%" sagt nichts darüber aus, ob Nutzer betroffen sind. Manche Workloads laufen absichtlich bei hoher CPU-Last.
Besser: Alert auf die Auswirkung. Wenn die Request-Latenz steigt oder die Error-Rate hochgeht, ist das ein klares Signal.
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: latency-alerts
namespace: monitoring
labels:
release: kube-prometheus-stack
spec:
groups:
- name: latency.rules
rules:
- alert: HighRequestLatency
expr: |
histogram_quantile(0.99,
sum(rate(http_request_duration_seconds_bucket{job="api-server"}[5m])) by (le)
) > 1.0
for: 5m
labels:
severity: critical
annotations:
summary: "API-Latenz über 1 Sekunde (p99)"
description: "Das 99. Perzentil der API-Antwortzeit liegt seit 5 Minuten über 1s."
- alert: HighErrorRate
expr: |
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m])) > 0.05
for: 5m
labels:
severity: critical
annotations:
summary: "Error-Rate über 5%"
description: "Mehr als 5% aller HTTP-Requests liefern 5xx-Fehler."
Ursachenbasierte Alerts wie "CPU hoch" oder "Memory steigt" gehören als Warning oder Info — sie helfen beim Debugging, sollten aber niemanden nachts wecken.
Alertmanager-Routing konfigurieren
Der Alertmanager entscheidet, wer welchen Alert bekommt. Die Konfiguration erfolgt über eine Routing-Tree-Struktur mit Receivern.
apiVersion: monitoring.coreos.com/v1alpha1
kind: AlertmanagerConfig
metadata:
name: team-routing
namespace: monitoring
labels:
alertmanagerConfig: main
spec:
route:
receiver: slack-warnings
groupBy: ['alertname', 'namespace']
groupWait: 30s
groupInterval: 5m
repeatInterval: 4h
routes:
- receiver: pagerduty-critical
matchers:
- name: severity
value: critical
matchType: "="
repeatInterval: 5m
- receiver: slack-warnings
matchers:
- name: severity
value: warning
matchType: "="
repeatInterval: 4h
receivers:
- name: pagerduty-critical
pagerdutyConfigs:
- routingKey:
name: pagerduty-secret
key: routing-key
severity: critical
description: '{{ .CommonAnnotations.summary }}'
- name: slack-warnings
slackConfigs:
- apiURL:
name: slack-webhook-secret
key: url
channel: '#k8s-alerts'
title: '[{{ .Status | toUpper }}] {{ .CommonLabels.alertname }}'
text: '{{ .CommonAnnotations.description }}'
sendResolved: true
Grouping und Inhibition
Zwei Mechanismen verhindern Alert-Spam:
Grouping fasst zusammengehörige Alerts zusammen. Wenn 20 Pods gleichzeitig crashen, kommt eine Nachricht statt 20. Die Parameter groupBy, groupWait und groupInterval steuern das Verhalten.
Inhibition unterdrückt nachgelagerte Alerts. Wenn ein Node down ist, müssen die Pod-Alerts auf diesem Node nicht extra gemeldet werden:
inhibitRules:
- sourceMatch:
- name: alertname
value: NodeDown
matchType: "="
targetMatch:
- name: severity
value: warning
matchType: "="
equal: ['node']
Alert Fatigue vermeiden
Alert Fatigue ist messbar: Wenn dein Team mehr als 50% der Alerts ohne Aktion schließt, hast du ein Problem. Hier sind die wichtigsten Gegenmaßnahmen.
| Problem | Lösung |
|---|---|
| Zu viele Alerts | Symptombasiert statt ursachenbasiert |
| Flapping Alerts | for-Dauer erhöhen (z.B. 5m statt 1m) |
| Doppelte Benachrichtigungen | Grouping und Inhibition nutzen |
| Irrelevante Alerts | Regelmäßig Review durchführen, ungenutzte löschen |
| Fehlende Ownership | Jeder Alert braucht ein verantwortliches Team |
Ein praktischer Ansatz: Führe ein monatliches Alert-Review ein. Jeder Alert, der im letzten Monat keine Aktion ausgelöst hat, wird entweder angepasst oder gelöscht. Alerts sind Code — sie verdienen denselben Review-Prozess wie Anwendungscode.
Praxistipps für PrometheusRule-CRDs
Beim Einsatz des kube-prometheus-stack werden Alert-Regeln als PrometheusRule Custom Resources verwaltet. Einige Hinweise:
- Das Label
release: kube-prometheus-stackmuss gesetzt sein, damit der Prometheus Operator die Regeln erkennt - Teste Expressions vorher in der Prometheus-UI unter
/graph - Nutze
for-Werte von mindestens 5 Minuten für alles außer absolut kritische Alerts - Halte Annotations konsistent: immer
summaryunddescription
# Alle PrometheusRules im Cluster auflisten
kubectl get prometheusrules --all-namespaces
# Alert-Regeln eines spezifischen Rules-Set prüfen
kubectl describe prometheusrule pod-alerts -n monitoring
FAQ
Wie viele Alerts sollte ein Team pro Tag maximal bekommen?
Ein gut konfiguriertes Alerting erzeugt nicht mehr als 5-10 actionable Alerts pro Schicht. Alles darüber führt zu Desensibilisierung. Critical-Alerts sollten seltener als einmal pro Tag auftreten.
Was ist der Unterschied zwischen Prometheus-Alerting und Alertmanager?
Prometheus evaluiert die Alert-Regeln und erkennt, ob ein Alert aktiv ist. Der Alertmanager übernimmt das Routing, Grouping, Silencing und die Zustellung an Empfänger wie Slack oder PagerDuty. Beide Komponenten arbeiten zusammen.
Kann ich Alerts temporär stumm schalten?
Ja, der Alertmanager bietet Silences. Über die Web-UI oder die API kannst du Alerts für einen definierten Zeitraum unterdrücken — zum Beispiel während geplanter Wartungsarbeiten. Silences sollten immer ein Ablaufdatum haben.
Wie teste ich Alert-Regeln vor dem Deployment?
Nutze promtool aus dem Prometheus-Paket. Mit promtool check rules rules.yaml validierst du die Syntax. Unit-Tests für Alert-Regeln sind ebenfalls möglich mit promtool test rules.
Nächster Schritt: Kombiniere dein Alerting mit einem vollständigen Observability-Stack. Mit OpenTelemetry auf Kubernetes bekommst du neben Metriken auch Traces und Logs in einer einheitlichen Pipeline.
Kubernetes-Expertise gesucht?
Managed Services, Beratung, Training oder Security – wir unterstützen deutsche Unternehmen bei allen Kubernetes-Themen.
Kubernetes-Beratung gesucht?
Wir helfen deutschen Unternehmen bei der Kubernetes-Implementierung, Migration und Optimierung. DSGVO-konform und praxiserprobt.
📖 Verwandte Artikel
Weitere interessante Beiträge zu ähnlichen Themen
Kubernetes Monitoring: Prometheus & Grafana Setup
Kubernetes Monitoring mit Prometheus, Grafana und Alertmanager aufbauen inklusive YAML-Beispielen, wichtigen Metriken und Alerting-Regeln.
Error Budgets: SRE-Praxis für Kubernetes-Teams
Error Budgets aus SLOs berechnen, Burn-Rate-Alerts in Prometheus konfigurieren und klare Policies für erschöpfte Budgets definieren.
Grafana Dashboards für Kubernetes: Best Practices
Effektive Grafana Dashboards für Kubernetes mit USE- und RED-Methode erstellen. Dashboard-as-Code mit ConfigMap-Provisioning und bewährte Panel-Layouts.
Prometheus Stack: Kubernetes-Monitoring einrichten
Kube-prometheus-stack per Helm installieren, ServiceMonitor für eigene Apps einrichten und PrometheusRule für Alerting konfigurieren.
SLA, SLO, SLI: Kubernetes-Verfügbarkeit messen
SLAs, SLOs und SLIs für Kubernetes-Services definieren und mit Prometheus messen. Mit Error-Budget-Berechnung und SLO-Template für Production-Workloads.