Configura 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 l'offerta di Slack Webhook in arrivo, un modo semplice per pubblicare messaggi dalle app in Slack. Cloud Functions è 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 creati con la messaggistica cross-application come IFTTT. Puoi utilizzare questo come modello per la connessione a questi servizi.

In questo tutorial utilizzerai Cloud Functions e Pub/Sub per inviare le 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 vengono utilizzati 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. 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. 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. 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. 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 Slack per le notifiche del cluster, chiedi all'amministratore di concederti i seguenti ruoli IAM sul tuo progetto:

Per assicurarti che l'account di servizio predefinito di Compute Engine abbia gli elementi necessari, autorizzazioni per richiamare la Cloud Function, chiedi all'amministratore di concedere all'account di servizio predefinito Compute Engine 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 l'installazione dell'applicazione in Slack area di lavoro.

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 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 relativa al cluster in un 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 è un 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 (l'attivatore) all'URL webhook, che a sua volta invia nell'area di lavoro Slack configurata.

    Puoi espandere il messaggio nella funzione createSlackMessage per includere molto altro, incluse la formattazione del testo e le immagini. La funzione isAllowedType per abilitare il filtro di base delle notifiche per tipo di URL. Tu 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

    Puoi aggiungere ulteriori dipendenze, requisiti e altre informazioni in base alle esigenze.

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

Esegui il deployment della Cloud Function

Puoi eseguire il deployment della Cloud Function 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 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 ATTIVATORE EVENTARC.
    5. Nella finestra aperta, verifica che l'elenco a discesa Provider di eventi seleziona Cloud Pub/Sub.
    6. Seleziona l'argomento Pub/Sub che hai creato durante l'abilitazione delle notifiche relative al cluster.
    7. In Regione, specifica la stessa regione di Compute Engine della personalizzata.
    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 Scrivere la funzione Cloud Functions.
    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 Cloud Function, ricevi una notifica Slack ogni volta che GKE invia un cluster notifica.

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 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, cerca un messaggio in 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. 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