Configurare le notifiche del cluster per i servizi di terze parti


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

Servizi come Slack offrono webhook in arrivo, un modo semplice per pubblicare messaggi dalle app in Slack. Funzioni di Cloud Run è una soluzione Compute Engine leggera per creare applicazioni che rispondono agli eventi Google Cloud, come le notifiche del cluster, senza la necessità di gestire un server o un runtime completamente gestito di Google Cloud. Quando GKE invia una notifica relativa al cluster utilizzando Pub/Sub, un trigger risponde eseguendo un'azione, ad esempio l'invio di 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 basata sull'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. 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. Abilita 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 Slack

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

Crea l'applicazione Slack

  1. Entrare in un'area di lavoro Slack registrandoti con il tuo indirizzo email o usando 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 il tuo spazio 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 utilizzo futuro.

Scrivi la funzione Cloud Run

Quando GKE pubblica una notifica relativa al cluster in un Pub/Sub l'evento attiva le funzioni Cloud Run per l'invio di una notifica 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 delle funzioni 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 nella tua sottoscrizione 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 ulteriori 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 oppure 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 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. In Regione, specifica una regione di 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 durante l'abilitazione delle notifiche relative al cluster.
    7. Per Regione, specifica la stessa regione 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 runtime, fai clic su Aggiungi variabile.
    11. In 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. In Punto di ingresso, specifica slackNotifier.
    3. Nel riquadro di navigazione, seleziona index.js e sostituisci il codice con il codice di esempio 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 Functions.
    5. Fai clic su Esegui il deployment.

Una volta completato il deployment della funzione Cloud Run, ricevi una notifica Slack ogni volta che GKE invia un cluster notifica.

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 al nuovo completamente gestita. Il tempo impiegato potrebbe variare in base ai periodi di manutenzione configurati ed esclusioni.
  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 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 eliminare le funzioni Cloud Run anche dalla console Google Cloud.

  2. Elimina l'argomento Pub/Sub.

  3. Elimina l'app Slack.

Passaggi successivi