Wenn Sie An­wen­dun­gen und In­fra­struk­tur in der Cloud betreiben, ist ein kon­ti­nu­ier­li­cher Überblick über Aus­las­tung, Ver­füg­bar­keit und mögliche Störungen hilfreich. Ein Pro­me­theus-Grafana-Stack kom­bi­niert die Erfassung und Spei­che­rung von Sys­tem­me­tri­ken mit deren visueller Aus­wer­tung und bildet damit eine ver­brei­te­te Grundlage für das Mo­ni­to­ring von Ku­ber­netes-Clustern, Servern und Cloud-An­wen­dun­gen.

Was ist ein Pro­me­theus-Grafana-Stack?

Ein Pro­me­theus-Grafana-Stack ist eine ver­brei­te­te Open-Source-Lösung für Cloud-Native-Mo­ni­to­ring. Pro­me­theus sammelt Metriken im Pull-Verfahren und speichert sie als Zeit­rei­hen, während Grafana diese Daten in an­pass­ba­ren Da­sh­boards vi­sua­li­siert. Gemeinsam er­mög­li­chen beide Werkzeuge Echtzeit-Einblicke in Per­for­mance und Kapazität sowie die früh­zei­ti­ge Erkennung von Störungen in komplexen In­fra­struk­tu­ren und An­wen­dun­gen.

Im Kontext der Cloud-Ob­ser­va­bi­li­ty kon­zen­triert sich Pro­me­theus vor allem auf Metriken wie CPU-Aus­las­tung, Spei­cher­ver­brauch oder An­fra­ge­zei­ten. Für eine um­fas­sen­de­re Analyse werden häufig zu­sätz­lich Logs (zum Beispiel mit Grafana Loki) und Traces (zum Beispiel mit Grafana Tempo) be­trach­tet. Dadurch lassen sich Sys­tem­zu­stän­de über­wa­chen, Feh­ler­ur­sa­chen ana­ly­sie­ren und Zu­sam­men­hän­ge zwischen ver­schie­de­nen Kom­po­nen­ten einer Anwendung nach­voll­zie­hen.

IONOS CLOUD Managed Ku­ber­netes
Container Workloads in sicherer Hand

IONOS CLOUD Managed Ku­ber­netes ist die ideale Plattform für per­for­man­te und hoch­ska­lier­ba­re Container-An­wen­dun­gen – rund um die Uhr pro­fes­sio­nell betreut. Ab sofort pro­fi­tie­ren Sie von einer au­to­ma­ti­schen CPU-Zuweisung für Dedicated Cores und kos­ten­ef­fi­zi­en­ten vCPUs für weniger per­for­mance-intensive Workloads. So nutzen Sie Ihre Res­sour­cen optimal, senken Kosten und behalten jederzeit volle Kontrolle über Ihre An­wen­dungs­per­for­mance.

Pro­me­theus-Ar­chi­tek­tur: Metriken über das Pull-Prinzip erfassen

Pro­me­theus ist ein Open-Source-Mo­ni­to­ring-System mit einer in­te­grier­ten Zeit­rei­hen­da­ten­bank (Time Series Database, TSDB). Messwerte werden als Zeit­rei­hen ge­spei­chert. Eine Zeitreihe wird durch einen Me­trik­na­men und optionale Labels iden­ti­fi­ziert. Jedes Sample darin besteht aus einem Zeit­stem­pel und einem Wert. Mithilfe der Labels lassen sich bei­spiels­wei­se Server, An­wen­dun­gen, Regionen oder Ku­ber­netes-Name­spaces un­ter­schei­den.

Pro­me­theus arbeitet stan­dard­mä­ßig nach dem so­ge­nann­ten Pull-Prinzip. Das bedeutet, dass nicht die über­wach­te Anwendung ihre Messwerte aktiv an Pro­me­theus über­mit­telt. Statt­des­sen ruft Pro­me­theus die Metriken re­gel­mä­ßig selbst über HTTP-Endpunkte ab. Diese Endpunkte stellen ihre Daten üb­li­cher­wei­se in einem von Pro­me­theus un­ter­stütz­ten Me­trik­for­mat bereit. Ist dies nicht der Fall, kommen Exporter zum Einsatz. Für Linux-Server wird bei­spiels­wei­se häufig der Node Exporter verwendet. Er stellt Sys­tem­da­ten wie CPU-Aus­las­tung, Ar­beits­spei­cher, Da­tei­sys­te­me und Netz­werk­sta­tis­ti­ken als Metriken zur Verfügung. Pro­me­theus ruft diese Werte an­schlie­ßend in fest­ge­leg­ten In­ter­val­len ab.

Welche Ziele überwacht werden sollen, wird über so­ge­nann­te Scrape-Jobs fest­ge­legt. In einem klas­si­schen Pro­me­theus-Setup befindet sich diese Kon­fi­gu­ra­ti­on in der Datei prometheus.yml. Ein einfacher Job für einen Node Exporter kann bei­spiels­wei­se fol­gen­der­ma­ßen aussehen:

global:
    scrape_interval: 15s
scrape_configs:
    - job_name: "node"
        static_configs:
            - targets:
                    - "node-exporter:9100"
yaml

Pro­me­theus ruft in diesem Beispiel alle 15 Sekunden die Metriken des an­ge­ge­be­nen Exporters ab. Neben statisch ein­ge­tra­ge­nen Zielen un­ter­stützt Pro­me­theus ver­schie­de­ne Service-Discovery-Me­cha­nis­men, über die Ziele dynamisch gefunden werden können.

Gerade in dy­na­mi­schen Cloud- und Ku­ber­netes-Um­ge­bun­gen bietet das Pull-Modell Vorteile. Pro­me­theus kon­trol­liert zentral, welche Ziele abgefragt werden, und kann anhand jedes Scrape-Vorgangs auch fest­stel­len, ob ein Ziel überhaupt er­reich­bar ist. Dafür erzeugt Pro­me­theus unter anderem die Metrik up. Ver­schwin­det eine Instanz, ver­schwin­den außerdem ihre regulär ab­ge­frag­ten Metriken, ohne dass zu­sätz­lich veraltete Push-Daten bereinigt werden müssen.

Grafana in­te­grie­ren: Pro­me­theus als Data Source verwenden

Während Pro­me­theus für das Sammeln, Speichern und Abfragen der Metriken zuständig ist, übernimmt Grafana deren Vi­sua­li­sie­rung. Die Pro­me­theus-Da­ten­quel­le ist in Grafana bereits enthalten und muss nicht separat in­stal­liert werden. Beim Einsatz des kube-prometheus-stack wird sie außerdem nor­ma­ler­wei­se au­to­ma­tisch für die Ver­bin­dung mit der in­stal­lier­ten Pro­me­theus-Instanz pro­vi­sio­niert.

Falls Sie Grafana mit einer eigenen Pro­me­theus-Instanz verbinden möchten, können Sie die Da­ten­quel­le al­ter­na­tiv fol­gen­der­ma­ßen kon­fi­gu­rie­ren:

  1. Öffnen Sie in Grafana den Bereich „Con­nec­tions“.
  2. Drücken Sie auf „Add new con­nec­tion“, suchen Sie nach „Pro­me­theus“ und wählen Sie „Pro­me­theus data source“ aus.
  3. Klicken Sie auf „Add new data source“, tragen Sie die URL Ihres Pro­me­theus-Servers ein und speichern Sie die Kon­fi­gu­ra­ti­on. In einem Ku­ber­netes-Cluster kann dies bei­spiels­wei­se die interne Service-Adresse des Pro­me­theus-Dienstes sein.

Die Daten werden an­schlie­ßend über PromQL, die Ab­fra­ge­spra­che von Pro­me­theus, aus­ge­wer­tet. Eine PromQL-Abfrage kann bei­spiels­wei­se die CPU-Aus­las­tung eines Servers berechnen oder den Spei­cher­ver­brauch mehrerer Pods mit­ein­an­der ver­glei­chen. Grafana bietet dafür ver­schie­de­ne Vi­sua­li­sie­rungs­ty­pen. Für In­fra­struk­tur-Mo­ni­to­ring sind ins­be­son­de­re folgende Panels relevant:

Vi­sua­li­sie­rung Dar­stel­lung Typischer An­wen­dungs­fall
Time series Werte im Zeit­ver­lauf CPU, RAM, Netz­werktraf­fic, Request-Raten
Stat Einzelner aktueller oder agg­re­gier­ter Wert CPU-Last, aktive Pods, Ant­wort­zeit
Gauge Wert innerhalb eines de­fi­nier­ten Bereichs CPU- oder Spei­cher­aus­las­tung in Prozent

Pro­me­theus und Grafana mit Helm in Ku­ber­netes ein­rich­ten

Für Ku­ber­netes ist der kube-prometheus-stack der Pro­me­theus Community ein ver­brei­te­ter Einstieg. Das Helm-Chart stellt unter anderem Pro­me­theus, Alert­ma­na­ger, Grafana, den Pro­me­theus Operator sowie vor­kon­fi­gu­rier­te Mo­ni­to­ring-Regeln und Da­sh­boards bereit. Helm und Pro­me­theus Operator sind dabei keine kon­kur­rie­ren­den In­stal­la­ti­ons­we­ge: Das Helm-Chart in­stal­liert und kon­fi­gu­riert den Operator als Be­stand­teil des Stacks.

Hinweis

Al­ter­na­tiv lässt sich der Stack auch über Docker Compose mit separaten Con­tai­nern für Pro­me­theus, Grafana und Alert­ma­na­ger betreiben.

Schritt 1: Pro­me­theus und Alert­ma­na­ger in­stal­lie­ren

Fügen Sie zunächst das Helm-Re­po­si­to­ry der Pro­me­theus Community hinzu und in­stal­lie­ren Sie an­schlie­ßend den Stack:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm upgrade --install monitoring \
    prometheus-community/kube-prometheus-stack \
    --namespace monitoring \
    --create-namespace
bash

Durch upgrade --install kann derselbe Befehl sowohl für eine Erst­in­stal­la­ti­on als auch für spätere Ak­tua­li­sie­run­gen verwendet werden. Das Chart bringt neben Pro­me­theus auch den Alert­ma­na­ger sowie ver­schie­de­ne Kom­po­nen­ten für das Ku­ber­netes-Mo­ni­to­ring mit.

Hinweis

Das Chart ist zu­sätz­lich als OCI-Artefakt verfügbar. Al­ter­na­tiv zur In­stal­la­ti­on über das Helm-Re­po­si­to­ry kann es direkt aus der GitHub Container Registry bezogen werden.

Schritt 2: Scrape-Jobs kon­fi­gu­rie­ren

Bei einer Stan­da­lo­ne- oder Docker-In­stal­la­ti­on werden Scrape-Ziele direkt über scrape_configs in der prometheus.yml definiert. Bei einem Ku­ber­netes-De­ploy­ment mit Pro­me­theus Operator sollten Sie diese Datei dagegen nor­ma­ler­wei­se nicht manuell be­ar­bei­ten. Statt­des­sen erzeugt der Operator die Pro­me­theus-Kon­fi­gu­ra­ti­on aus Ku­ber­netes-Res­sour­cen wie ServiceMonitor und PodMonitor. Ein ServiceMonitor be­schreibt bei­spiels­wei­se, welche Services Pro­me­theus anhand ihrer Labels erkennen und über­wa­chen soll.

Ein einfaches Beispiel kann fol­gen­der­ma­ßen aussehen:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
    name: example-app
    namespace: monitoring
    labels:
        release: monitoring
spec:
    selector:
        matchLabels:
            app: example-app
    endpoints:
        - port: metrics
            path: /metrics
            interval: 15s
yaml

In diesem Beispiel überwacht Pro­me­theus einen Ku­ber­netes-Service mit dem Label app: example-app und ruft dessen Metriken alle 15 Sekunden ab.

Beim kube-prometheus-stack ist relevant, welche Labels der Pro­me­theus-Instanz für die Auswahl von ServiceMonitor-Res­sour­cen zu­ge­wie­sen sind. Bei einem Helm-Release mit dem Namen monitoring wird hierfür stan­dard­mä­ßig das Release-Label release: monitoring verwendet.

Hinweis

Bei An­wen­dun­gen in anderen Name­spaces sollten Sie prüfen, ob die Pro­me­theus-Instanz die ent­spre­chen­den ServiceMonitor-Res­sour­cen be­rück­sich­tigt. Ent­schei­dend sind die im Pro­me­theus-Objekt gesetzten Se­lek­to­ren für Labels und Name­spaces. Je nach Kon­fi­gu­ra­ti­on können dafür An­pas­sun­gen an den Helm-Werten des kube-prometheus-stack er­for­der­lich sein.

Schritt 3: Grafana öffnen und den Admin-Zugang kon­fi­gu­rie­ren

Grafana wird bei Ver­wen­dung des kube-prometheus-stack zusammen mit dem übrigen Mo­ni­to­ring-Stack in­stal­liert. Seit Chart-Version 79.0.0 wird kein allgemein bekanntes Stan­dard­pass­wort mehr verwendet. Wird kein eigenes Passwort angegeben, erzeugt das Chart statt­des­sen ein zu­fäl­li­ges Admin-Passwort und speichert dieses in einem Ku­ber­netes Secret.

Die vor­han­de­nen Grafana-Res­sour­cen können Sie mit folgendem Befehl anzeigen:

kubectl get secret -n monitoring \
    -l app.kubernetes.io/name=grafana
bash

An­schlie­ßend können Sie das in diesem Secret ge­spei­cher­te admin-password auslesen:

kubectl get secret monitoring-grafana -n monitoring -o jsonpath="{.data.admin-password}" | base64 -d
bash
Hinweis

Für pro­duk­ti­ve Um­ge­bun­gen sollten Sie das Admin-Passwort nicht au­to­ma­tisch ge­ne­rie­ren lassen, sondern ein eigenes Passwort oder ein be­stehen­des Ku­ber­netes Secret verwenden. Beim kube-prometheus-stack lässt sich letzteres bei­spiels­wei­se über die Helm-Option grafana.admin.existingSecret kon­fi­gu­rie­ren.

Für einen lokalen Zugriff auf Grafana können Sie den Grafana-Service außerdem über kubectl port-forward er­reich­bar machen. Lassen Sie sich dazu zunächst den konkreten Ser­vice­na­men anzeigen:

kubectl get svc -n monitoring
bash

Danach leiten Sie den Grafana-Port fol­gen­der­ma­ßen auf Ihren Rechner weiter:

kubectl port-forward -n monitoring svc/monitoring-grafana 3000:80
bash

Grafana ist an­schlie­ßend lokal über Port 3000 er­reich­bar. Prüfen Sie dort unter den Data Sources, ob die Pro­me­theus-Ver­bin­dung wie gewünscht ein­ge­rich­tet ist.

Schritt 4: Standard-Da­sh­boards verwenden und erweitern

Der kube-prometheus-stack enthält bereits eine Sammlung von Ku­ber­netes-Da­sh­boards und Pro­me­theus-Regeln. Dadurch stehen un­mit­tel­bar nach dem Setup unter anderem Ansichten zu Nodes, Pods und Ku­ber­netes-Sys­tem­kom­po­nen­ten zur Verfügung.

Zu­sätz­li­che Da­sh­boards können Sie über „Da­sh­boards“ → „New“ → „Import“ in Grafana im­por­tie­ren. Die Grafana-Dashboard-Bi­blio­thek bietet bei­spiels­wei­se fertige Ansichten für Ku­ber­netes-Pods, Name­spaces oder den API-Server. Bevor Sie ein fremdes Dashboard produktiv einsetzen, sollten Sie jedoch prüfen, welche Metriken, Labels und Data Sources darin erwartet werden. Nicht jedes Dashboard passt ohne An­pas­sun­gen zur eigenen Ku­ber­netes- oder Pro­me­theus-Kon­fi­gu­ra­ti­on.

Alerting mit Pro­me­theus und Alert­ma­na­ger

Mo­ni­to­ring ist besonders dann hilfreich, wenn kritische Zustände nicht erst in einem Dashboard entdeckt werden müssen. Pro­me­theus un­ter­stützt deshalb Alerting Rules, deren Be­din­gun­gen ebenfalls mit PromQL for­mu­liert werden.

Beim Einsatz des kube-prometheus-stack mit dem Pro­me­theus Operator werden Alerting Rules üb­li­cher­wei­se als PrometheusRule-Custom-Resources definiert. Diese Res­sour­cen enthalten die PromQL-Be­din­gun­gen, anhand derer Pro­me­theus kritische Zustände erkennt. Eine Regel kann bei­spiels­wei­se auslösen, wenn die durch­schnitt­li­che CPU-Aus­las­tung einer Instanz länger als zehn Minuten über 85 Prozent liegt:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
    name: infrastructure-alerts
    namespace: monitoring
    labels:
        release: monitoring
spec:
    groups:
        - name: infrastructure
            rules:
                - alert: HighCPUUsage
                    expr: >
                        100 * (
                            1 - avg by (instance)
                            (rate(node_cpu_seconds_total{mode="idle"}[5m]))
                        ) > 85
                    for: 10m
                    labels:
                        severity: warning
                    annotations:
                        summary: "Hohe CPU-Auslastung auf {{ $labels.instance }}"
yaml

Das Label release: monitoring stellt sicher, dass die Regel der zuvor in­stal­lier­ten Pro­me­theus-Instanz aus dem Helm-Release monitoring zu­ge­ord­net wird. Die Angabe for: 10m ver­hin­dert, dass bereits eine sehr kurze Last­spit­ze den Alert un­mit­tel­bar auslöst. Pro­me­theus be­trach­tet den Alert zunächst als aus­ste­hend und setzt ihn erst auf den Status firing, wenn die Bedingung über den an­ge­ge­be­nen Zeitraum bestehen bleibt.

Technisch übernimmt dabei Pro­me­theus die Aus­wer­tung der Alarm­be­din­gung. Der Alert­ma­na­ger erkennt den kri­ti­schen Zustand also nicht selbst, sondern erhält die von Pro­me­theus aus­ge­lös­ten Alerts. An­schlie­ßend kann er diese grup­pie­ren, Duplikate un­ter­drü­cken, Be­nach­rich­ti­gun­gen zeitweise stumm­schal­ten und abhängig von Labels an un­ter­schied­li­che Empfänger wei­ter­lei­ten.

Als Empfänger un­ter­stützt Alert­ma­na­ger unter anderem E-Mail, Chat-Systeme und On-Call-Dienste. So können bei­spiels­wei­se Warnungen an Slack oder kritische Pro­duk­ti­ons­alar­me an PagerDuty wei­ter­ge­lei­tet werden. Dadurch müssen DevOps-Teams Da­sh­boards nicht permanent manuell be­ob­ach­ten. Statt­des­sen werden sie gezielt in­for­miert, wenn de­fi­nier­te Schwel­len­wer­te oder andere PromQL-Be­din­gun­gen tat­säch­lich erfüllt sind.

Fazit

Pro­me­theus und Grafana decken gemeinsam die zentralen Schritte des me­tri­schen In­fra­struk­tur-Mo­ni­to­rings ab. Pro­me­theus erfasst und speichert Messwerte und er­mög­licht deren Aus­wer­tung mit PromQL, während Grafana daraus über­sicht­li­che Da­sh­boards erstellt. Alerting Rules und Alert­ma­na­ger ergänzen den Stack um au­to­ma­ti­sier­te Be­nach­rich­ti­gun­gen bei kri­ti­schen Zuständen.

Für Ku­ber­netes bietet sich der kube-prometheus-stack als Einstieg an, da er Pro­me­theus, Grafana, Alert­ma­na­ger und den Pro­me­theus Operator in einem Helm-De­ploy­ment zu­sam­men­führt. Durch ServiceMonitor- und PodMonitor-Res­sour­cen lässt sich das Mo­ni­to­ring an­schlie­ßend dynamisch an neue An­wen­dun­gen und Services im Cluster anpassen.

Zum Hauptmenü