Configura le notifiche del cluster per i servizi di terze parti


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

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

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

In questo tutorial utilizzerai Cloud Functions e Pub/Sub per inviare notifiche sugli eventi dei cluster GKE a Slack.

Obiettivi

  • Esegui il deployment di un'applicazione Slack per ricevere notifiche esterne da GKE.
  • Scrivi una Cloud Function 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 essere idonei per una prova gratuita.

Una volta completate le attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la pagina Pulizia.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Abilita le API GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub.

    Abilita le API

  5. Installa Google Cloud CLI.
  6. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  7. Aggiorna e installa i componenti di gcloud:
    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. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  10. Abilita le API GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub.

    Abilita le API

  11. Installa Google Cloud CLI.
  12. Per initialize gcloud CLI, esegui questo comando:

    gcloud init
  13. Aggiorna e installa i componenti di gcloud:
    gcloud components update
    gcloud components install alpha beta
  14. Abilita le notifiche del cluster GKE.

Ruoli obbligatori

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

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

Notifiche Slack

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

crea l'applicazione Slack

  1. Partecipa a un'area di lavoro Slack registrandoti con la tua email o utilizzando un invito inviato da un amministratore di Workspace.

  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 la tua area di lavoro Slack.
    3. Fai clic su Create App (Crea app).
    4. In Aggiungi funzioni e funzionalità, fai clic su Webhook in entrata.
    5. Fai clic sul pulsante di attivazione/disattivazione Attiva webhook in entrata.
    6. Nella sezione URL webhook per la tua area di lavoro, fai clic su Aggiungi nuovo webhook a Workspace.
    7. Nella pagina di autorizzazione che si apre, seleziona un canale su cui ricevere le notifiche.
    8. Fai clic su Consenti.
    9. Un webhook per la tua applicazione Slack viene visualizzato nella sezione URL webhook per la tua area di lavoro. Salva l'URL per un secondo momento.

Scrivi la funzione Cloud Functions

Quando GKE pubblica una notifica sul cluster in un argomento Pub/Sub, l'evento attiva l'invio di una notifica Slack da parte di Cloud Functions.

  1. Crea una nuova directory denominata gke_slack e cambiala al suo interno:

    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 Functions che specifica l'URL webhook creato per l'applicazione Slack. Sei tu a definire la variabile di ambiente quando esegui il deployment della funzione.

    Il webhook rimane in ascolto e riceve i messaggi da Cloud Functions. Quando GKE invia una notifica del cluster a Pub/Sub (l'evento), la funzione invia un messaggio (il trigger) all'URL webhook, che a sua volta invia il messaggio all'area di lavoro Slack configurata.

    Puoi espandere il messaggio nella funzione createSlackMessage per includere molto altro, inclusa la formattazione del testo e le immagini. La funzione isAllowedType consente di filtrare le notifiche di base in base al tipo di URL. Puoi specificare il tipo di URL da consentire in allowedTypeURLs. Questa funzione non è necessaria se hai già filtrato le notifiche, in GKE o nella tua sottoscrizione Pub/Sub.

    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 descrive i seguenti attributi del programma:

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

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

A questo punto dovresti avere i file index.js e package.json nella directory gke_slack.

Esegui il deployment della Cloud Function

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

gcloud

Per eseguire il deployment della funzione, esegui questo 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 Cloud Functions 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 2a generazione.
    2. Per Nome funzione, specifica slackNotifier.
    3. In Regione, specifica una regione di Compute Engine.
    4. Nella sezione Trigger, fai clic su AGGIUNGI TRIGGER EVENTARC.
    5. Nella finestra aperta, verifica che nell'elenco a discesa Provider di eventi selezioni Cloud Pub/Sub.
    6. Seleziona l'argomento Pub/Sub che hai creato durante l'abilitazione delle notifiche del cluster.
    7. Per Regione, specifica la stessa regione di Compute Engine della funzione.
    8. Fai clic su SALVA ATTIVATORE.
    9. Espandi la sezione Impostazioni di runtime, build, connessioni e sicurezza.
    10. In Variabili di ambiente di runtime, fai clic su Aggiungi variabile.
    11. In corrispondenza di Nome, specifica SLACK_WEBHOOK.
    12. In Valore, specifica l'URL del 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. Per Entry point, specifica slackNotifier.
    3. Nel riquadro di navigazione, seleziona index.js e sostituisci il codice con il codice campione in Write the Cloud Function.
    4. Nel riquadro di navigazione, seleziona package.json e sostituisci il codice con il codice campione in Write the Cloud Function.
    5. Fai clic su Esegui il deployment.

Dopo aver completato il deployment della Cloud Function, riceverai una notifica di Slack ogni volta che GKE invia una notifica relativa al cluster.

Verifica le notifiche Slack

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

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

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 cambiare la versione GKE sui nodi, puoi eseguire l'upgrade alla stessa versione attualmente disponibile sui nodi.

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

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. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Elimina singole risorse

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

    gcloud functions delete slackNotifier
    

    Puoi eliminare Cloud Functions anche dalla console Google Cloud.

  2. Elimina l'argomento Pub/Sub.

  3. Elimina l'app Slack.

Passaggi successivi