Einrichten von Warnmeldungen und Benachrichtigungen mit Alertmanager in DOKS-Cluster

Einführung

Benachrichtigungen und Mitteilungen sind ein wesentlicher Bestandteil Ihres Bereitstellungs-Workflows. Wenn Sie mit einem Kubernetes-Cluster arbeiten, müssen Sie oft sofort über etwaige kritische Probleme in Ihrem Cluster informiert werden.

Alertmanager ist Teil des kube-prom-stack, der in Ihrem Cluster im Prometheus Stack installiert ist. Es ermöglicht Ihnen, Benachrichtigungen von verschiedenen Quellen wie Prometheus zu erhalten. Regeln werden auf der Prometheus-Seite erstellt, die wiederum Alarme auslösen können. Es ist die Aufgabe des Alertmanagers, diese Alarme abzufangen, sie zu gruppieren (Aggregation), andere Transformationen anzuwenden und sie schließlich an die konfigurierten Empfänger weiterzuleiten. Benachrichtigungsnachrichten können bei Bedarf weiter formatiert werden, um zusätzliche Details einzuschließen. Sie können Slack, Gmail usw. verwenden, um Echtzeitbenachrichtigungen zu senden.

In diesem Abschnitt erfahren Sie, wie Sie vorhandene Alarme überprüfen, neue erstellen und Alertmanager dann konfigurieren, um Benachrichtigungen über Slack mithilfe derselben Manifestdatei zu senden, die für die Konfiguration von Prometheus verwendet wird.

Inhaltsverzeichnis

Voraussetzungen

Um dieses Tutorial abzuschließen, benötigen Sie:

  • Das Prometheus-Überwachungs-Stack in Ihrem Cluster installiert, wie im Prometheus-Stack erläutert.
  • Das Loki-Stack in Ihrem Cluster installiert, wie im Loki-Stack erläutert.
  • Emojivoto Beispiel-App wurde im Cluster bereitgestellt. Bitte folgen Sie den Schritten aus dem Hauptrepository. Sie werden Alarme für diese Anwendung erstellen.
  • Administrative Rechte über einen Slack-Arbeitsbereich. Später erstellen Sie eine Anwendung mit einem eingehenden Webhook, der verwendet wird, um Benachrichtigungen von Alertmanager zu senden.

Schritt 1 – Überprüfen Sie enthaltene Alarme

kube-prom-stack hat bereits über hundert Regeln aktiviert. Um auf die Prometheus-Konsole zuzugreifen, führen Sie zuerst einen Port-Forward auf Ihrem lokalen Rechner durch.

kubectl --namespace monitoring port-forward svc/kube-prom-stack-kube-prome-prometheus 9091:9090

Öffnen Sie einen Webbrowser auf localhost:9091 und greifen Sie auf den Menüpunkt Alarme zu. Sie sollten einige vordefinierte Alarme sehen, die wie folgt aussehen sollten:

Klicken Sie auf einen der Alarme, um ihn zu erweitern. Sie können Informationen über den Ausdruck sehen, nach dem er abfragt, die Etiketten, die eingerichtet wurden, und Anmerkungen, die aus einer Vorlagensicht sehr wichtig sind. Prometheus unterstützt Vorlagen in den Anmerkungen und Etiketten von Alarmen. Weitere Informationen finden Sie in der offiziellen Dokumentation.

Schritt 2 – Erstellen einer neuen Warnung

Um eine neue Warnung zu erstellen, müssen Sie eine neue Definition im additionalPrometheusRule-Abschnitt der kube-prom-stack-Helm-Werte-Datei hinzufügen.
Sie werden eine Beispielwarnung erstellen, die ausgelöst wird, wenn der Namespace emojivoto nicht die erwartete Anzahl von Instanzen hat. Die erwartete Anzahl von Pods für die Anwendung emojivoto beträgt 4.

Zuerst öffnen Sie die Datei 04-setup-observability/assets/manifests/prom-stack-values.yaml im Starter Kit-Repository mit einem Texteditor Ihrer Wahl (bevorzugt mit YAML-Lint-Unterstützung). Dann kommentieren Sie den additionalPrometheusRules-Block aus.

additionalPrometheusRulesMap:
  rule-name:
    groups:
    - name: emojivoto-instance-down
      rules:
        - alert: EmojivotoInstanceDown
          expr: sum(kube_pod_owner{namespace="emojivoto"}) by (namespace) < 4
          for: 1m
          labels:
            severity: 'critical'
          annotations:
            description: ' The Number of pods from the namespace {{ $labels.namespace }} is lower than the expected 4. '
            summary: 'Pod {{ $labels.pod }} down'

Zuletzt wenden Sie die Einstellungen mit helm an:

HELM_CHART_VERSION="35.5.1"

helm upgrade kube-prom-stack prometheus-community/kube-prometheus-stack --version "${HELM_CHART_VERSION}" \
--namespace monitoring \
-f "04-setup-observability/assets/manifests/prom-stack-values-v${HELM_CHART_VERSION}.yaml"

Um zu überprüfen, ob die Warnung erfolgreich erstellt wurde, navigieren Sie zur Prometheus-Konsole, klicken Sie auf den Menüpunkt Warnungen und identifizieren Sie die Warnung EmojivotioInstanceDown. Sie sollte am Ende der Liste sichtbar sein.

Schritt 3 – Konfigurieren von Alertmanager zum Senden von Benachrichtigungen an Slack

Um diesen Abschnitt abzuschließen, benötigen Sie Administratorrechte über einen Slack-Arbeitsbereich. Dadurch können Sie das eingehende Webhook erstellen, das Sie in den nächsten Schritten benötigen. Sie müssen auch einen Kanal erstellen, in dem Sie Benachrichtigungen von Alertmanager erhalten möchten.
Sie konfigurieren Alertmanager so, dass er über alle empfangenen Alarme geht und deren jeweilige Zusammenfassungen und Beschreibungen in neuen Zeilen ausgibt.

  1. Öffnen Sie einen Webbrowser und navigieren Sie zu https://api.slack.com/apps. Klicken Sie auf die Schaltfläche Neue App erstellen.
  2. In dem Fenster App erstellen wählen Sie die Option Von Grund auf neu aus. Geben Sie dann Ihrer Anwendung einen Namen und wählen Sie den entsprechenden Arbeitsbereich aus.
  3. Auf der Seite Grundlegende Informationen klicken Sie auf die Option Eingehende Webhooks, aktivieren Sie sie und klicken Sie auf die Schaltfläche Neuen Webhook zum Arbeitsbereich hinzufügen unten.
  4. Auf der nächsten Seite verwenden Sie die Dropdown-Liste Nach einem Kanal suchen…, um den gewünschten Kanal auszuwählen, in dem Sie Benachrichtigungen senden möchten. Wenn Sie bereit sind, klicken Sie auf die Schaltfläche Zulassen.
  5. Kopieren Sie den angezeigten Wert der Webhook-URL. Sie benötigen ihn im nächsten Abschnitt.

Als nächstes sagen Sie Alertmanager, wie er Slack-Benachrichtigungen senden soll. Öffnen Sie die Datei 04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml im Starter Kit-Repository mit einem Texteditor Ihrer Wahl. Kommentieren Sie den gesamten alertmanager.config-Block aus. Stellen Sie sicher, dass Sie die Werte slack_api_url und channel aktualisieren, indem Sie die Platzhalter <> entsprechend ersetzen.

alertmanager:
  enabled: true
  config:
    global:
      resolve_timeout: 5m
      slack_api_url: "<YOUR_SLACK_APP_INCOMING_WEBHOOK_URL_HERE>"
    route:
      receiver: "slack-notifications"
      repeat_interval: 12h
      routes:
        - receiver: "slack-notifications"
          # matchers:
          #   - alertname="EmojivotoInstanceDown"
          # continue: false
    receivers:
      - name: "slack-notifications"
        slack_configs:
          - channel: "#<YOUR_SLACK_CHANNEL_NAME_HERE>"
            send_resolved: true
            title: "{{ range .Alerts }}{{ .Annotations.summary }}\n{{ end }}"
            text: "{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"

In der obigen Konfiguration,

  • slack_api_url: eingehende Slack-Webhook-URL, die im Schritt 4 erstellt wurde
  • receivers.[].slack_configs: definiert den Slack-Kanal, der zur Übermittlung von Benachrichtigungen, dem Benachrichtigungstitel und der tatsächlichen Nachricht verwendet wird. Es ist auch möglich, die Benachrichtigungsnachricht (oder den Inhalt) entsprechend Ihren Anforderungen zu formatieren.
  • title und text: iteriert über die ausgelösten Alarme und gibt die Zusammenfassung und Beschreibung mithilfe des Prometheus-Vorlagensystems aus.
  • send_resolved: boolescher Wert, der angibt, ob Alertmanager eine Benachrichtigung senden soll, wenn ein Alarm nicht mehr ausgelöst wird.

Die matcher– und continue-Parameter sind weiterhin auskommentiert, da Sie diese später im Handbuch auskommentieren werden. Im Moment sollte es auskommentiert bleiben.

Zum Schluss aktualisieren Sie das kube-prometheus-stack mit helm:

HELM_CHART_VERSION="35.5.1"

helm upgrade kube-prom-stack prometheus-community/kube-prometheus-stack --version "${HELM_CHART_VERSION}" \
--namespace monitoring \
-f "04-setup-observability/assets/manifests/prom-stack-values-v${HELM_CHART_VERSION}.yaml"

An diesem Punkt sollten Sie Slack-Benachrichtigungen für alle ausgelösten Alarme erhalten.

Als nächstes testen Sie, ob der zuvor hinzugefügte EmojivotoInstanceDown-Alarm funktioniert und eine Benachrichtigung an Slack sendet, indem Sie die Anzahl der Repliken für die Bereitstellung /emoji des Namespaces emojivoto herunterskalieren.

Vom Terminal aus führen Sie den folgenden Befehl aus, um die Anzahl der Repliken für die Bereitstellung /emoji auf 0 zu setzen:

kubectl scale --replicas=0 deployment/emoji -n emojivoto

Öffnen Sie einen Webbrowser auf localhost:9091 und greifen Sie auf den Menüpunkt Alerts zu. Suchen Sie nach dem zuvor erstellten Alarm EmojivotoInstanceDown. Der Status des Alarms sollte nach etwa einer Minute des Skalierens der Bereitstellung Firing anzeigen.

A message notification will be sent to Slack to the channel you configured earlier if everything goes well. You should see the “The Number of pods from the namespace emojivoto is lower than the expected 4.” alert in the Slack message as configured in the annotations.description config of the additionalPrometheusRulesMap block.

Derzeit werden alle Alarmauslösungen an den Slack-Kanal gesendet. Dies kann zu Benachrichtigungsmüdigkeit führen. Um genauer festzulegen, welche Benachrichtigung gesendet wird, können Sie Alertmanager so konfigurieren, dass nur Benachrichtigungen für Alarme gesendet werden, die zu einem bestimmten Muster passen. Dies erfolgt mithilfe des matcher-Parameters.

Öffnen Sie die Datei 04-setup-observability/assets/manifests/prom-stack-values-v35.5.1.yaml im Starter Kit-Repository mit einem Texteditor Ihrer Wahl. Kommentieren Sie den gesamten alertmanager.config-Block aus. Stellen Sie sicher, dass Sie die matcher– und die continue-Parameter auskommentieren:

config:
  global:
    resolve_timeout: 5m
    slack_api_url: "<YOUR_SLACK_APP_INCOMING_WEBHOOK_URL_HERE>"
  route:
    receiver: "slack-notifications"
    repeat_interval: 12h
    routes:
      - receiver: "slack-notifications"
        matchers:
          - alertname="EmojivotoInstanceDown"
        continue: false
  receivers:
    - name: "slack-notifications"
      slack_configs:
        - channel: "#<YOUR_SLACK_CHANNEL_NAME_HERE>"
          send_resolved: true
          title: "{{ range .Alerts }}{{ .Annotations.summary }}\n{{ end }}"
          text: "{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}"

Zum Abschluss führen Sie das Upgrade von kube-prometheus-stack mit helm durch:

HELM_CHART_VERSION="35.5.1"

helm upgrade kube-prom-stack prometheus-community/kube-prometheus-stack --version "${HELM_CHART_VERSION}" \
--namespace monitoring \
-f "04-setup-observability/assets/manifests/prom-stack-values-v${HELM_CHART_VERSION}.yaml"

Nun sollten Sie nur noch Benachrichtigungen für den übereinstimmenden Alarmnamen EmojivotoInstanceDown erhalten. Da continue auf false gesetzt ist, sendet der Alertmanager nur Benachrichtigungen von diesem Alarm und hört auf, sie an andere zu senden.

Beim Klicken auf den Benachrichtigungsnamen in Slack wird ein Webbrowser zu einer nicht erreichbaren Webseite mit der internen Kubernetes-DNS des Alertmanager-Pods geöffnet. Dies ist erwartet. Einige nützliche Links zum Überprüfen: Für weitere Informationen können Sie sich den DNS-Pod-Dienst ansehen, Konfigurationsparameter für den AlertManager und einige Beispielbenachrichtigungen.

Schritt 4 – Debuggen einer ausgelösten Warnung

Wenn eine Warnung ausgelöst und eine Benachrichtigung in Slack gesendet wird, ist es wichtig, dass Sie das Problem leicht debuggen und die Ursache schnell finden können.
Hierfür können Sie Grafana verwenden, das bereits in den Tutorials zu Prometheus Stack und Loki Stack installiert wurde.

Erstellen Sie eine Portweiterleitung für Grafana auf Port 3000:

kubectl --namespace monitoring port-forward svc/kube-prom-stack-grafana 3000:80

Öffnen Sie einen Webbrowser unter localhost:3000 und melden Sie sich mit den Standardanmeldeinformationen admin/prom-operator an.

Navigieren Sie zum Abschnitt Benachrichtigung. Klicken Sie im Filter Zustand auf die Option Auslösen. Identifizieren Sie die Alarmierung emojivoto-instance-down, die im Abschnitt Erstellen eines neuen Alarms definiert ist, und erweitern Sie sie. Sie sollten Folgendes sehen:

Klicken Sie auf die Schaltfläche Graf anzeigen. Auf der nächsten Seite können Sie die Anzahl der Pods im Namespace emojivoto als Metrik anzeigen. Beachten Sie, dass Grafana standardmäßig Ergebnisse mit einem Zeitbereich von Letzte 1 Stunde filtert. Passen Sie dies an den Zeitraum an, in dem der Alarm ausgelöst wird. Sie können den Zeitbereich mit der Option Von Bis für ein genaueres Ergebnis anpassen oder Schnellbereich wie Letzte 30 Minuten verwenden.

Wählen Sie im Tab Erkunden die Datenquelle Loki aus. Geben Sie im Log-Browser folgendes ein: {namespace="emojivoto"} und klicken Sie auf die Schaltfläche Abfrage ausführen oben rechts auf der Seite. Sie sollten Folgendes sehen:

Stellen Sie sicher, dass Sie das Zeitintervall entsprechend anpassen.

Von dieser Seite aus können Sie die Protokollergebnisse weiter filtern. Um beispielsweise die Protokolle für den Container web-svc des Namespaces emojivoto zu filtern, können Sie folgende Abfrage eingeben: {namespace="emojivoto", container="web-svc"}

Weitere Erklärungen zur Verwendung von LogQL finden Sie in Schritt 3 – Verwendung von LogQL.

Sie können auch die zuvor installierten exportierten Kubernetes-Ereignisse nutzen und nach Ereignissen filtern, die mit dem Namespace emojivoto zusammenhängen.

Geben Sie die folgende Abfrage in den Protokollbrowser ein: {app="event-exporter"} |= "emojivoto". Dadurch werden die Kubernetes-Ereignisse im Zusammenhang mit dem Namespace emojivoto zurückgegeben.

Schlussfolgerung

In diesem Tutorial haben Sie gelernt, wie Sie vorhandene Warnungen überprüfen, neue erstellen und AlertManager konfigurieren, um Benachrichtigungen an Slack zu senden.

Weitere Informationen

Der nächste Schritt besteht darin, Backup und Wiederherstellung mithilfe von Velero oder TrilioVault in Ihrem DOKS-Cluster einzurichten.

Source:
https://www.digitalocean.com/community/developer-center/how-to-set-up-alerts-and-notification-using-alertmanager-in-doks-cluster