Configura le notifiche del cluster per i servizi di terze parti


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

Servizi come Slack offrono hook in arrivo, un modo semplice per pubblicare messaggi dalle app in Slack. Cloud Functions è una soluzione Compute Engine leggera per creare funzioni autonome e monouso 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 sul cluster utilizzando Pub/Sub, un attivatore risponde mediante l'esecuzione di un'azione, ad esempio l'invio di una notifica Slack.

Esistono molti servizi di terze parti creati con funzionalità di messaggistica tra 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 a Slack notifiche sugli eventi del cluster GKE.

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 in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

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. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  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. Nella pagina del selettore di progetti della console Google Cloud, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  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 sul 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 installare l'applicazione in un'area di lavoro Slack.

Crea l'applicazione Slack

  1. Partecipa a un'area di lavoro Slack registrandosi con il proprio indirizzo email o utilizzando un invito inviato da un amministratore di Workspace.

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

  3. Crea 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 caratteristiche e funzionalità, fai clic su Webhook in entrata.
    5. Fai clic sull'opzione di attivazione/disattivazione Attiva webhook in arrivo.
    6. Nella sezione URL webhook per area di lavoro, fai clic su Aggiungi nuovo webhook a Workspace.
    7. Nella pagina di autorizzazione che si apre, seleziona un canale per ricevere le notifiche.
    8. Fai clic su Consenti.
    9. Un webhook per l'applicazione Slack viene visualizzato nella sezione URL webhook per l'area di lavoro. Salva l'URL per un utilizzo futuro.

Scrivi la funzione Cloud Functions

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

  1. Crea una nuova directory denominata gke_slack e modifica la directory 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 ascolta 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 includerne molto di più, tra cui la formattazione del testo e le immagini. La funzione isAllowedType viene fornita per abilitare il filtro di base delle notifiche 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 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 di runtime principali
    • Dipendenze

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

Ora 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, esegui questi passaggi:

    1. Nell'elenco a discesa Ambiente, seleziona 2a generazione.
    2. In Nome funzione, specifica slackNotifier.
    3. In Regione, specifica una regione di Compute Engine.
    4. Nella sezione Attivatore, fai clic su AGGIUNGI ATTIVATORE EVENTARC.
    5. Nella finestra aperta, controlla che nell'elenco a discesa Provider di eventi seleziona Cloud Pub/Sub.
    6. Seleziona l'argomento Pub/Sub che hai creato durante l'abilitazione delle notifiche del cluster.
    7. In Regione, specifica la stessa regione di Compute Engine della funzione.
    8. Fai clic su SALVA ATTIVATORE.
    9. Espandi la sezione Runtime, build, connessioni e impostazioni di 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 Crea l'applicazione Slack.
    13. Tocca Avanti.
  4. Nella pagina Codice, esegui questi passaggi:

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

Dopo aver completato il deployment della Cloud Function, riceverai una notifica Slack ogni volta che GKE invia una notifica del 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 configurati.
  3. Dopo che GKE ha eseguito l'upgrade dei nodi, controlla 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 modificare la versione di 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 in Slack.

La notifica 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 anche eliminare Cloud Functions dalla console Google Cloud.

  2. Elimina l'argomento Pub/Sub.

  3. Elimina l'app Slack.

Passaggi successivi