Configurare le notifiche del cluster per i servizi di terze parti


Questo tutorial mostra come configurare servizi di messaggistica di terze parti per ricevere le notifiche del cluster di Google Kubernetes Engine (GKE).

Servizi come Slack offrono webhook in arrivo, un modo semplice per pubblicare messaggi dalle app in Slack. Le funzioni Cloud Run sono una soluzione Compute Engine leggera per creare funzioni autonome a uso specifico, che rispondono a Google Cloud eventi, come le notifiche dei cluster, senza la necessità di gestire un ambiente server o di runtime. Quando GKE invia una notifica del cluster utilizzando Pub/Sub, un attivatore risponde eseguendo un'azione, ad esempio inviando una notifica di Slack.

Esistono molti servizi di terze parti con funzionalità di messaggistica tra applicazioni, come IFTTT. Puoi utilizzare questo tutorial come modello per la connessione a questi servizi.

In questo tutorial utilizzerai le funzioni Cloud Run e Pub/Sub per inviare notifiche su eventi del cluster GKE a Slack.

Obiettivi

  • Esegui il deployment di un'applicazione Slack per ricevere notifiche esterne da GKE.
  • Scrivi una funzione Cloud Run che invii notifiche Pub/Sub a Slack.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero avere diritto a una prova gratuita.

Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.

Prima di iniziare

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the GKE, Cloud Run functions, Cloud Build, Eventarc and Pub/Sub APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. Update and install gcloud components:

    gcloud components update
    gcloud components install alpha beta
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Make sure that billing is enabled for your Google Cloud project.

  10. Enable the GKE, Cloud Run functions, Cloud Build, Eventarc and Pub/Sub APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.
  12. To initialize the gcloud CLI, run the following command:

    gcloud init
  13. Update and install gcloud components:

    gcloud components update
    gcloud components install alpha beta
  14. Attiva le notifiche del cluster GKE.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per configurare le notifiche di Slack per le notifiche del cluster, chiedi all'amministratore di concederti i seguenti ruoli IAM nel progetto:

Per assicurarti che l'account di servizio predefinito di Compute Engine disponga delle autorizzazioni necessarie per richiamare la funzione Cloud Run, chiedi all'amministratore di concedere all'account di servizio predefinito di Compute Engine il ruolo IAM Invoker di Cloud Functions (roles/cloudfunctions.invoker) nel tuo progetto.

Notifiche di Slack

Per configurare le notifiche di Slack, devi creare un'applicazione Slack, attivare i webhook in entrata per l'applicazione e installarla in uno spazio di lavoro Slack.

Crea l'applicazione Slack

  1. Unisciti a uno spazio di lavoro Slack, registrandoti con il tuo indirizzo email o utilizzando un invito inviato da un amministratore dello spazio di lavoro.

  2. Accedi a Slack utilizzando il nome della tua area di lavoro e le credenziali del tuo account Slack.

  3. Creare una nuova app Slack

    1. Nella finestra di dialogo Crea un'app, fai clic su Da zero.
    2. Specifica un nome app e scegli il tuo spazio di lavoro Slack.
    3. Fai clic su Create App (Crea app).
    4. In Aggiungi funzionalità, fai clic su Webhook in arrivo.
    5. Fai clic sul pulsante di attivazione/disattivazione Attiva webhook in entrata.
    6. Nella sezione URL webhook per il tuo spazio di lavoro, fai clic su Aggiungi nuovo webhook allo spazio di lavoro.
    7. Nella pagina di autorizzazione che si apre, seleziona un canale per ricevere le notifiche.
    8. Fai clic su Consenti.
    9. Nella sezione URL webhook per il tuo spazio di lavoro viene visualizzato un webhook per la tua applicazione Slack. Salva l'URL per un utilizzo futuro.

Scrivi la funzione Cloud Run

Quando GKE pubblica una notifica del cluster in un argomento Pub/Sub, l'evento attiva le funzioni Cloud Run per inviare una notifica di Slack.

  1. Crea una nuova directory denominata gke_slack e cambia directory:

    mkdir ~/gke_slack && cd $_
    
  2. Crea i seguenti file nella directory gke_slack:

    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 è una variabile di ambiente Cloud Run che specifica l'URL webhook creato per la tua applicazione Slack. La variabile di ambiente viene definita quando esegui il deployment della funzione.

    L'webhook ascolta e riceve i messaggi dalle funzioni Cloud Run. Quando GKE invia una notifica del cluster a Pub/Sub (l'evento), la funzione invia un messaggio (l'attivatore) all'URL webhook, che a sua volta invia il messaggio allo spazio di lavoro Slack configurato.

    Puoi espandere il messaggio nella funzione createSlackMessage per includere molto di più, inclusa la formattazione del testo e le immagini. La funzione isAllowedType è fornita per abilitare il filtro di base delle notifiche in base all'URL del tipo. Puoi specificare i tipi di URL da consentire in allowedTypeURLs. Questa funzione non è necessaria se hai già filtrato le notifiche in GKE o nell'abbonamento Pub/Sub.

    package.json

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

    package.json descrive i seguenti attributi del programma:

    • Nome, versione e descrizione
    • File di runtime principali
    • Dipendenze

    Se necessario, puoi aggiungere altre dipendenze, requisiti e altre informazioni.

Ora dovresti avere i file index.js e package.json nella directory gke_slack.

Esegui il deployment della funzione Cloud Run

Puoi eseguire il deployment della funzione Cloud Run utilizzando Google Cloud CLI o la console Google Cloud .

gcloud

Per eseguire il deployment della funzione, esegui il seguente comando nella directory gke_slack:

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

Sostituisci quanto segue:

L'output è simile al seguente:

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. Vai alla pagina Funzioni Cloud Run nella console Google Cloud .

    Vai a Cloud Functions

  2. Fai clic su Crea funzione.

  3. Nella pagina Configurazione, segui questi passaggi:

    1. Dall'elenco a discesa Ambiente, seleziona 2ª gen..
    2. In Nome funzione, specifica slackNotifier.
    3. Per Regione, specifica una regione Compute Engine.
    4. Nella sezione Attivazione, fai clic su AGGIUNGI ATTIVATORE EVENTARC.
    5. Nella finestra aperta, verifica che nell'elenco a discesa Provider di eventi sia selezionato Cloud Pub/Sub.
    6. Seleziona l'argomento Pub/Sub che hai creato quando hai attivato le notifiche del cluster.
    7. Per Regione, specifica la stessa regione Compute Engine della funzione.
    8. Fai clic su SALVA TRIGGER.
    9. Espandi la sezione Impostazioni di runtime, build, connessioni e sicurezza.
    10. In Variabili di ambiente runtime, fai clic su Aggiungi variabile.
    11. In Nome, specifica SLACK_WEBHOOK.
    12. In Valore, specifica l'URL dell'webhook interno creato in Creare l'applicazione Slack.
    13. Fai clic su Avanti.
  4. Nella pagina Codice, segui questi passaggi:

    1. Seleziona Node.js 14 dall'elenco a discesa Runtime.
    2. In Punto di ingresso, specifica slackNotifier.
    3. Nel riquadro di navigazione, seleziona index.js e sostituisci il codice con il codice campione in Scrivere la funzione Cloud.
    4. Nel riquadro di navigazione, seleziona package.json e sostituisci il codice con il codice campione in Scrivere la funzione Cloud.
    5. Fai clic su Esegui il deployment.

Dopo aver completato il deployment della funzione Cloud Run, riceverai una notifica di Slack ogni volta che GKE invia una notifica del cluster.

Verificare le notifiche di Slack

Se hai utilizzato un cluster Autopilot, verifica le notifiche nel seguente modo:

  1. Avvia un upgrade del piano di controllo.
  2. Attendi che GKE esegua automaticamente l'upgrade dei nodi alla nuova versione. Il tempo necessario potrebbe variare in base ai periodi di manutenzione e alle esclusioni configurati.
  3. Dopo che GKE ha eseguito l'upgrade dei nodi, controlla se è presente un messaggio su Slack.

Se hai utilizzato un cluster standard, verifica le notifiche come segue:

  1. Esegui l'upgrade di un pool di nodi specifico a una nuova versione. Se non vuoi modificare la versione GKE sui tuoi nodi, puoi eseguire l'upgrade alla stessa versione attualmente presente sui nodi.

  2. Dopo che GKE ha eseguito l'upgrade dei nodi, controlla se è presente un messaggio su Slack.

La notifica di Slack è simile alla seguente:

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

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Elimina singole risorse

  1. Elimina la funzione Cloud Run di cui hai eseguito il deployment in questo tutorial:

    gcloud functions delete slackNotifier
    

    Puoi anche eliminare le funzioni Cloud Run dalla console .

  2. Elimina l'argomento Pub/Sub.

  3. Elimina l'app Slack.

Passaggi successivi