Beobachtbarkeit von Anwendungen mit Prometheus in GKE

In dieser Anleitung erfahren Sie, wie Sie Aktivitätsprüfungen für Anwendungsmikrodienste einrichten, die mit Open-Source-Prometheus in Google Kubernetes Engine (GKE) bereitgestellt werden.

In dieser Anleitung wird Open-Source-Prometheus verwendet. Jeder GKE Autopilot-Cluster stellt jedoch automatisch Managed Service for Prometheus bereit, die vollständig verwaltete, projektübergreifende Multi-Cloud-Lösung vonGoogle Cloudfür Prometheus-Messwerte. Mit Managed Service for Prometheus können Sie Ihre Arbeitslasten mithilfe von Prometheus global überwachen und Benachrichtigen dazu senden, ohne Prometheus manuell in großem Umfang verwalten und betreiben zu müssen.

Sie können auch Open-Source-Tools wie Grafana verwenden, um von Prometheus erfasste Messwerte zu visualisieren.

Umgebung vorbereiten

In dieser Anleitung verwenden Sie Cloud Shell zum Verwalten von Ressourcen, die inGoogle Cloudgehostet werden.

  1. Legen Sie die Standardumgebungsvariablen fest:

    gcloud config set project PROJECT_ID
    gcloud config set compute/region CONTROL_PLANE_LOCATION
    

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Ihre Google Cloud Projekt-ID.
    • CONTROL_PLANE_LOCATION: die Compute Engine-Region der Steuerungsebene des Clusters. In dieser Anleitung ist die Region us-central1. Normalerweise sollten Sie eine Region auswählen, die sich in Ihrer Nähe befindet.
  2. Klonen Sie das in dieser Anleitung verwendete Beispiel-Repository:

    git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
    cd bank-of-anthos/
    
  3. Erstellen Sie einen Cluster.

    gcloud container clusters create-auto CLUSTER_NAME \
        --release-channel=CHANNEL_NAME \
        --location=CONTROL_PLANE_LOCATION
    

    Dabei gilt:

    • CLUSTER_NAME: ein Name für den neuen Cluster.
    • CHANNEL_NAME: der Name einer Release-Version.

Prometheus bereitstellen

Verwenden Sie das Beispiel-Helm-Diagramm, um Prometheus zu installieren:

helm repo add bitnami https://charts.bitnami.com/bitnami
helm install tutorial bitnami/kube-prometheus \
    --version 8.2.2 \
    --values extras/prometheus/oss/values.yaml \
    --wait

Mit diesem Befehl wird Prometheus mit den folgenden Komponenten installiert:

  • Prometheus-Operator:: eine beliebte Methode zum Bereitstellen und Konfigurieren von Open-Source-Prometheus.
  • Alertmanager: verwaltet vom Prometheus-Server gesendete Benachrichtigungen und leitet sie an Anwendungen wie Slack weiter.
  • Blackbox-Exporter: ermöglicht es Prometheus, Endpunkte mit HTTP, HTTPS, DNS, TCP, ICMP und gRPC zu prüfen.

Bank of Anthos bereitstellen

Stellen Sie die Bank of Anthos-Beispielanwendung bereit:

kubectl apply -f extras/jwt/jwt-secret.yaml
kubectl apply -f kubernetes-manifests

Slack-Benachrichtigungen

Zum Einrichten von Slack-Benachrichtigungen müssen Sie eine Slack-Anwendung erstellen, eingehende Webhooks für die Anwendung aktivieren und die Anwendung in einem Slack-Workspace installieren.

Slack-Anwendung erstellen

  1. Um einem Slack-Workspace beizutreten, registrieren Sie sich entweder mit Ihrer E-Mail-Adresse oder nutzen eine von einem Workspace-Administrator gesendete Einladung.

  2. Melden Sie sich bei Slack an. Verwenden Sie hierfür den Namen Ihres Arbeitsbereichs und die Anmeldedaten für Ihr Slack-Konto.

  3. Neue Slack-App erstellen

    1. Klicken Sie im Dialogfeld Anwendung erstellen auf Neu erstellen.
    2. Geben Sie einen Anwendungsnamen an und wählen Sie Ihren Slack-Workspace aus.
    3. Klicken Sie auf Create App (App erstellen).
    4. Klicken Sie unter Features und Funktionen hinzufügen auf Eingehende Webhooks.
    5. Klicken Sie auf die Schaltfläche Eingehende Webhooks aktivieren.
    6. Klicken Sie im Abschnitt Webhook-URLs für Ihren Arbeitsbereich auf Neuen Webhook zu Arbeitsbereich hinzufügen.
    7. Wählen Sie auf der angezeigten Autorisierungsseite einen Kanal aus, um Benachrichtigungen zu erhalten.
    8. Klicken Sie auf Zulassen.
    9. Ein Webhook für Ihre Slack-Anwendung wird im Abschnitt Webhook-URLs für Ihren Arbeitsbereich angezeigt. Speichern Sie die URL für eine spätere Verwendung.

Alertmanager konfigurieren

Erstellen Sie ein Kubernetes-Secret, um die Webhook-URL zu speichern:

kubectl create secret generic alertmanager-slack-webhook --from-literal webhookURL=SLACK_WEBHOOK_URL
kubectl apply -f extras/prometheus/oss/alertmanagerconfig.yaml

Ersetzen Sie SLACK_WEBHOOK_URL durch die URL des Webhooks aus dem vorherigen Abschnitt.

Prometheus konfigurieren

  1. Prüfen Sie das folgende Manifest:

    # Copyright 2023 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: Probe
    metadata:
      name: frontend-probe
    spec:
      jobName: frontend
      prober:
        url: tutorial-kube-prometheus-blackbox-exporter:19115
        path: /probe
      module: http_2xx
      interval: 60s
      scrapeTimeout: 30s
      targets:
        staticConfig:
          labels:
            app: bank-of-anthos
          static:
            - frontend:80
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: Probe
    metadata:
      name: userservice-probe
    spec:
      jobName: userservice
      prober:
        url: tutorial-kube-prometheus-blackbox-exporter:19115
        path: /probe
      module: http_2xx
      interval: 60s
      scrapeTimeout: 30s
      targets:
        staticConfig:
          labels:
            app: bank-of-anthos
          static:
            - userservice:8080/ready
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: Probe
    metadata:
      name: balancereader-probe
    spec:
      jobName: balancereader
      prober:
        url: tutorial-kube-prometheus-blackbox-exporter:19115
        path: /probe
      module: http_2xx
      interval: 60s
      scrapeTimeout: 30s
      targets:
        staticConfig:
          labels:
            app: bank-of-anthos
          static:
            - balancereader:8080/ready
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: Probe
    metadata:
      name: contacts-probe
    spec:
      jobName: contacts
      prober:
        url: tutorial-kube-prometheus-blackbox-exporter:19115
        path: /probe
      module: http_2xx
      interval: 60s
      scrapeTimeout: 30s
      targets:
        staticConfig:
          labels:
            app: bank-of-anthos
          static:
            - contacts:8080/ready
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: Probe
    metadata:
      name: ledgerwriter-probe
    spec:
      jobName: ledgerwriter
      prober:
        url: tutorial-kube-prometheus-blackbox-exporter:19115
        path: /probe
      module: http_2xx
      interval: 60s
      scrapeTimeout: 30s
      targets:
        staticConfig:
          labels:
            app: bank-of-anthos
          static:
            - ledgerwriter:8080/ready
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: Probe
    metadata:
      name: transactionhistory-probe
    spec:
      jobName: transactionhistory
      prober:
        url: tutorial-kube-prometheus-blackbox-exporter:19115
        path: /probe
      module: http_2xx
      interval: 60s
      scrapeTimeout: 30s
      targets:
        staticConfig:
          labels:
            app: bank-of-anthos
          static:
            - transactionhistory:8080/ready
    

    Dieses Manifest beschreibt Prometheus-Aktivitätsprüfungen und enthält die folgenden Felder:

    • spec.jobName: Der Jobname, der den extrahierten Messwerten zugewiesen ist.
    • spec.prober.url: die Dienst-URL des Blackbox-Exporters. Dazu gehört auch der Standardport für den Blackbox-Exporter, der im Helm-Chart definiert ist.
    • spec.prober.path: der Pfad der Messwerterfassung.
    • spec.targets.staticConfig.labels: die Labels, die allen Messwerten zugewiesen sind, die aus den Zielen extrahiert werden.
    • spec.targets.staticConfig.static: die Liste von zu prüfenden Hosts.
  2. Wenden Sie das Manifest auf Ihren Cluster an:

    kubectl apply -f extras/prometheus/oss/probes.yaml
    
  3. Prüfen Sie das folgende Manifest:

    # Copyright 2023 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    ---
    apiVersion: monitoring.coreos.com/v1
    kind: PrometheusRule
    metadata:
      name: uptime-rule
    spec:
      groups:
      - name: Micro services uptime
        interval: 60s
        rules:
        - alert: BalancereaderUnavaiable
          expr: probe_success{app="bank-of-anthos",job="balancereader"} == 0
          for: 1m
          annotations:
            summary: Balance Reader Service is unavailable
            description: Check Balance Reader pods and it's logs
          labels:
            severity: 'critical'
        - alert: ContactsUnavaiable
          expr: probe_success{app="bank-of-anthos",job="contacts"} == 0
          for: 1m
          annotations:
            summary: Contacs Service is unavailable
            description: Check Contacs pods and it's logs
          labels:
            severity: 'warning'
        - alert: FrontendUnavaiable
          expr: probe_success{app="bank-of-anthos",job="frontend"} == 0
          for: 1m
          annotations:
            summary: Frontend Service is unavailable
            description: Check Frontend pods and it's logs
          labels:
            severity: 'critical'
        - alert: LedgerwriterUnavaiable
          expr: probe_success{app="bank-of-anthos",job="ledgerwriter"} == 0
          for: 1m
          annotations:
            summary: Ledger Writer Service is unavailable
            description: Check Ledger Writer pods and it's logs
          labels:
            severity: 'critical'
        - alert: TransactionhistoryUnavaiable
          expr: probe_success{app="bank-of-anthos",job="transactionhistory"} == 0
          for: 1m
          annotations:
            summary: Transaction History Service is unavailable
            description: Check Transaction History pods and it's logs
          labels:
            severity: 'critical'
        - alert: UserserviceUnavaiable
          expr: probe_success{app="bank-of-anthos",job="userservice"} == 0
          for: 1m
          annotations:
            summary: User Service is unavailable
            description: Check User Service pods and it's logs
          labels:
            severity: 'critical'
    

    Dieses Manifest beschreibt einen PrometheusRule und enthält die folgenden Felder:

    • spec.groups.[*].name: der Name der Regelgruppe.
    • spec.groups.[*].interval: wie oft Regeln in der Gruppe ausgewertet werden.
    • spec.groups.[*].rules[*].alert: der Name der Benachrichtigung.
    • spec.groups.[*].rules[*].expr: der PromQL-Ausdruck, der ausgewertet wird.
    • spec.groups.[*].rules[*].for: die Zeitspanne, in der Benachrichtigungen zurückgegeben werden müssen, bevor sie als ausgelöst gelten.
    • spec.groups.[*].rules[*].annotations: eine Liste von Annotationen, die jeder Benachrichtigung hinzugefügt werden sollen. Dies gilt nur für Benachrichtigungsregeln.
    • spec.groups.[*].rules[*].labels: die Labels, die hinzugefügt oder überschrieben werden sollen.
  4. Wenden Sie das Manifest auf Ihren Cluster an:

    kubectl apply -f extras/prometheus/oss/rules.yaml
    

Ausfall simulieren

  1. Simulieren Sie einen Ausfall, indem Sie das contacts-Deployment auf null skalieren:

    kubectl scale deployment contacts --replicas 0
    

    In Ihrem Slack-Workspace-Kanal sollten Sie eine Benachrichtigung sehen. Es kann bis zu fünf Minuten dauern, bis GKE das Deployment skaliert hat.

  2. Stellen Sie das Deployment contacts wieder her:

    kubectl scale deployment contacts --replicas 1
    

    Im Slack-Workspace-Kanal sollten Sie eine Benachrichtigung zur Auflösung sehen können. Es kann bis zu fünf Minuten dauern, bis GKE das Deployment skaliert hat.