Clusterbenachrichtigungen für Drittanbieterdienste konfigurieren


In dieser Anleitung erfahren Sie, wie Sie Messaging-Dienste von Drittanbietern für den Empfang von GKE-Clusterbenachrichtigungen (Google Kubernetes Engine) konfigurieren.

Dienste wie Slack bieten eingehende Webhooks. Damit lassen sich Nachrichten von Anwendungen auf einfache Weise in Slack posten. Cloud Functions ist eine kompakte Compute Engine-Lösung zum Erstellen eigenständiger Funktionen, die einem einzigen Zweck dienen und jeweils auf Google Cloud-Ereignisse reagieren, darunter Cluster-Benachrichtigungen, ohne einen Server oder eine Laufzeitumgebung verwalten zu müssen. Wenn GKE eine Cluster-Benachrichtigung mit Pub/Sub sendet, löst ein Trigger eine Aktion aus, z. B. das Senden einer Slack-Benachrichtigung.

Zahlreiche Dienste von Drittanbietern haben anwendungsübergreifende Messaging-Funktionen wie IFTTT. Mithilfe dieser Anleitung als Vorlage können Sie eine Verbindung zu diesen Diensten herstellen.

In dieser Anleitung verwenden Sie Cloud Functions und Pub/Sub, um Benachrichtigungen über GKE-Clusterereignisse an Slack zu senden.

Ziele

  • Stellen Sie eine Slack-Anwendung bereit, um externe Benachrichtigungen von GKE zu erhalten.
  • Sie schreiben eine Cloud Functions-Funktion, die Pub/Sub-Benachrichtigungen an Slack sendet.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Vorbereitung

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  4. GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub APIs aktivieren.

    Aktivieren Sie die APIs

  5. Installieren Sie die Google Cloud CLI.
  6. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  7. Aktualisieren und installieren Sie gcloud-Komponenten:
    gcloud components update
    gcloud components install alpha beta
  8. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  9. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  10. GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub APIs aktivieren.

    Aktivieren Sie die APIs

  11. Installieren Sie die Google Cloud CLI.
  12. Führen Sie folgenden Befehl aus, um die gcloud CLI zu initialisieren:

    gcloud init
  13. Aktualisieren und installieren Sie gcloud-Komponenten:
    gcloud components update
    gcloud components install alpha beta
  14. Aktivieren Sie GKE-Clusterbenachrichtigungen.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Einrichten von Slack-Benachrichtigungen für Clusterbenachrichtigungen benötigen:

Bitten Sie Ihren Administrator, dem Compute Engine-Standarddienstkonto die Berechtigungen Cloud Functions-Invoker (roles/cloudfunctions.invoker) im Projekt zu erteilen, damit das Compute Engine-Standarddienstkonto die erforderlichen Berechtigungen zum Aufrufen der Cloud Functions-Funktion hat.

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-Arbeitsbereich installieren.

Slack-Anwendung erstellen

  1. Um einem Slack-Arbeitsbereich 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. Erstellen Sie eine neue Slack-App:

    1. Klicken Sie im Dialogfeld Anwendung erstellen auf Neu erstellen.
    2. Geben Sie einen Anwendungsnamen an und wählen Sie Ihren Slack-Arbeitsbereich 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.

Cloud Functions-Funktion schreiben

Wenn GKE eine Clusterbenachrichtigung in einem Pub/Sub-Thema veröffentlicht, sendet Cloud Functions eine Slack-Benachrichtigung aus.

  1. Erstellen Sie ein neues Verzeichnis mit dem Namen gke_slack und ersetzen Sie das aktuelle Verzeichnis durch dieses Verzeichnis:

    mkdir ~/gke_slack && cd $_
    
  2. Erstellen Sie im Verzeichnis "gke_slack" die folgenden Dateien:

    index.js

    const functions = require('@google-cloud/functions-framework');
    const { IncomingWebhook } = require('@slack/webhook');
    
    const url = process.env.SLACK_WEBHOOK;
    
    const webhook = new IncomingWebhook(url);
    
    // Optionally filter what notification types to forward to Slack.
    // If empty, all types will be allowed.
    const allowedTypeURLs = [];
    
    // Register a CloudEvent callback with the Functions Framework that will
    // be executed when the Pub/Sub trigger topic receives a message.
    functions.cloudEvent('slackNotifier', pubSubEvent => {
        const data = decode(pubSubEvent.data.message.data);
    
        // Send message to Slack.
        if (isAllowedType(pubSubEvent.data.message.attributes)) {
            const message = createSlackMessage(data, pubSubEvent.data.message.attributes);
            webhook.send(message);
        }
    });
    
    // decode decodes a pubsub event message from base64.
    const decode = (data) => {
        return Buffer.from(data, 'base64').toString();
    }
    
    // isAllowedType can be used to filter out messages that don't match the
    // allowed type URLs. If allowedTypeURLs is empty, it allows all types.
    const isAllowedType = (attributes) => {
        if (allowedTypeURLs.length == 0) {
            return true;
        }
        for (var x in allowedTypeURLs) {
            if (attributes['type_url'] == allowedTypeURLs[x]) {
                return true;
            }
        }
        return false;
    }
    
    // createSlackMessage creates a message from a data object.
    const createSlackMessage = (data, attributes) => {
        // Write the message data and attributes.
        text = `${data}`
        for (var key in attributes) {
            if (attributes.hasOwnProperty(key)) {
                text = text + `\n\t\`${key}: ${attributes[key]}\``
            }
        }
        const message = {
            text: text,
            mrkdwn: true,
        };
        return message;
    }
    

    SLACK_WEBHOOK ist eine Cloud Functions-Umgebungsvariable, die die für Ihre Slack-Anwendung erstellte Webhook-URL angibt. Sie definieren die Umgebungsvariable, wenn Sie die Funktion bereitstellen.

    Der Webhook überwacht Nachrichten von Cloud Functions und empfängt sie. Wenn GKE eine Clusterbenachrichtigung an Pub/Sub (das Ereignis) sendet, sendet die Funktion eine Nachricht (den Trigger) an die Webhook-URL, die wiederum die Nachricht an den konfigurierten Slack-Arbeitsbereich sendet.

    Sie können die Nachricht in der createSlackMessage-Funktion erweitern, um viele weitere Optionen einzubinden, darunter Textformatierungen und Bilder. Die Funktion isAllowedType wird bereitgestellt, um die einfache Filterung von Benachrichtigungen nach URL-Typ zu ermöglichen. Sie können angeben, welche URL-Typen in allowedTypeURLs zugelassen werden sollen. Diese Funktion ist nicht erforderlich, wenn Sie bereits in GKE oder in Ihrem Pub/Sub-Abo Benachrichtigungen gefiltert haben.

    package.json

    {
      "name": "gke-slack",
      "version": "0.0.1",
      "description": "Slack integration for GKE, using Cloud Functions",
      "main": "index.js",
      "dependencies": {
        "@slack/webhook": "6.1.0",
        "@google-cloud/functions-framework": "^3.0.0"
      }
    }
    

    package.json beschreibt die folgenden Attribute des Programms:

    • Name, Version und Beschreibung
    • Primäre Laufzeitdatei(en)
    • Abhängigkeiten

    Sie können bei Bedarf weitere Abhängigkeiten, Anforderungen und andere Informationen hinzufügen.

Jetzt sollten sich die Dateien index.js und package.json im gke_slack-Verzeichnis befinden.

Cloud Functions-Funktion bereitstellen

Sie können die Cloud Functions-Funktion entweder mit der Google Cloud CLI oder der Google Cloud Console bereitstellen.

gcloud

Führen Sie folgenden Befehl im Verzeichnis "gke_slack" aus, um die Funktion bereitzustellen:

gcloud functions deploy slackNotifier \
  --gen2 \
  --trigger-topic=TOPIC_NAME \
  --runtime=nodejs14 \
  --entry-point=slackNotifier \
  --region=REGION \
  --source=. \
  --set-env-vars="SLACK_WEBHOOK=WEBHOOK_URL"

Dabei gilt:

Die entsprechende Ausgabe sieht etwa so aus:

Deploying function…
availableMemoryMb: 256
entryPoint: slackNotifier
environmentVariables:
  SLACK_WEBHOOK: https://hooks.slack.com/services/…
eventTrigger:
  eventType: google.pubsub.topic.publish
  failurePolicy: {}
  resource: projects/PROJECT_ID/topics/TOPIC_NAME
  service: pubsub.googleapis.com
labels:
  deployment-tool: cli-gcloud
name: projects/PROJECT_ID/locations/us-central1/functions/slackNotifier
runtime: nodejs10
serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/…
status: ACTIVE
timeout: 60s
updateTime: 'YYYY-MM-DDThh:mm:ssZ'
versionId: '1'

Console

  1. Rufen Sie in der Google Cloud Console die Seite Cloud Functions auf.

    Zu Cloud Functions

  2. Klicken Sie auf Funktion erstellen.

  3. Führen Sie auf der Seite Konfiguration folgende Schritte aus:

    1. Wählen Sie in der Drop-down-Liste Umgebung die Option 2. Generation aus.
    2. Geben Sie unter Funktionsname den Wert slackNotifier ein.
    3. Geben Sie unter Region eine Compute Engine-Region an.
    4. Klicken Sie im Abschnitt Trigger auf EVENTARC-TRIGGER HINZUFÜGEN.
    5. Wählen Sie im geöffneten Fenster in der Drop-down-Liste Ereignisanbieter die Option Cloud Pub/Sub aus.
    6. Wählen Sie das Pub/Sub-Thema aus, das Sie beim Aktivieren von Clusterbenachrichtigungen erstellt haben.
    7. Geben Sie für Region dieselbe Compute Engine-Region wie für die Funktion an.
    8. Klicken Sie auf TRIGGER SPEICHERN.
    9. Maximieren Sie den Abschnitt Laufzeit, Build, Verbindungen und Sicherheitseinstellungen.
    10. Klicken Sie unter Umgebungsvariablen der Laufzeit auf Variable hinzufügen.
    11. Geben Sie als Name SLACK_WEBHOOK an.
    12. Geben Sie als Wert die URL des internen Webhooks an, der unter Slack-Anwendung erstellen erstellt wurde.
    13. Klicken Sie auf Weiter.
  4. Führen Sie auf der Seite Code folgende Schritte aus:

    1. Wählen Sie in der Drop-down-Liste Laufzeit die Option Node.js 14.
    2. Geben Sie als Einstiegspunkt slackNotifier an.
    3. Wählen Sie im Navigationsbereich index.js aus und ersetzen Sie den Code durch den Beispielcode unter Cloud Functions-Funktion schreiben.
    4. Wählen Sie im Navigationsbereich package.json aus und ersetzen Sie den Code durch den Beispielcode unter Cloud Functions-Funktion schreiben.
    5. Klicken Sie auf Bereitstellen.

Nachdem Sie die Cloud Functions-Funktion bereitgestellt haben, erhalten Sie jedes Mal eine Slack-Benachrichtigung, wenn GKE eine Cluster-Benachrichtigung sendet.

Slack-Benachrichtigungen prüfen

Wenn Sie einen Autopilot-Cluster verwendet haben, prüfen Sie Benachrichtigungen so:

  1. Upgrade der Steuerungsebene starten
  2. Warten Sie, bis GKE Ihre Knoten automatisch auf die neue Version aktualisiert hat. Die Dauer kann je nach den konfigurierten Wartungsfenstern und -ausschlüssen variieren.
  3. Nachdem GKE die Knoten aktualisiert hat, prüfen Sie Slack auf Nachrichten.

Wenn Sie einen Standardcluster verwendet haben, prüfen Sie Benachrichtigungen so:

  1. Aktualisieren Sie einen bestimmten Knotenpool auf eine neue Version Wenn Sie die GKE-Version auf den Knoten nicht ändern möchten, können Sie ein Upgrade auf die aktuelle Version auf den Knoten ausführen.

  2. Nachdem GKE die Knoten aktualisiert hat, prüfen Sie Slack auf Nachrichten.

Die Slack-Benachrichtigung sieht in etwa so aus:

Master is upgrading to version 1.20.10-gke.301.
    cluster_location: us-central1
    cluster_name: pubsub-cluster
    payload: {"resourceType":"MASTER", "operation":"operation-1632775054313-45128f4f", "operationStartTime":"2021-09-27T20:37:34.313742491Z", "currentVersion":"1.20.9-gke.1001", "targetVersion":"1.20.10-gke.301"}
    project_id: 729788050015
    type_url: type.googleapis.com/google.container.v1beta1.UpgradeEvent

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Projekt löschen

  1. Wechseln Sie in der Google Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite „Ressourcen verwalten“

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen.
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Shut down (Beenden), um das Projekt zu löschen.

Einzelne Ressourcen löschen

  1. Löschen Sie die Cloud Functions-Funktion, die Sie in dieser Anleitung bereitgestellt haben:

    gcloud functions delete slackNotifier
    

    Sie können Cloud Functions-Funktionen auch über die Google Cloud Console löschen.

  2. Pub/Sub-Thema löschen.

  3. Slack-Anwendung löschen.

Nächste Schritte