Configurare 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 Google Kubernetes Engine (GKE) .

Servizi come Slack offrono webhook in entrata, un modo semplice per pubblicare messaggi dalle app in Slack. Cloud Run Functions è una soluzione di Compute Engine leggera per creare funzioni autonome a uso specifico, che rispondano a Google Cloud eventi, come le notifiche dei cluster, senza la necessità di gestire un ambiente server o di runtime environment. Quando GKE invia una notifica del cluster utilizzando Pub/Sub, un trigger risponde eseguendo 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 connetterti a questi servizi.

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

Obiettivi

  • Eseguire il deployment di un'applicazione Slack per ricevere notifiche esterne da GKE.
  • Scrivere una funzione Cloud Run 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 Google Cloud utenti potrebbero avere diritto a una prova senza costi.

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.

Prima di iniziare

  1. Accedi al tuo Google Cloud account. 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 senza costi per l'esecuzione, il test e il deployment dei workload.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Installa Google Cloud CLI.

  6. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  7. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  8. Dopo aver inizializzato gcloud CLI, aggiornala e installa i componenti richiesti:

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

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  10. Verify that billing is enabled for your Google Cloud project.

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

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  12. Installa Google Cloud CLI.

  13. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  14. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  15. Dopo aver inizializzato gcloud CLI, aggiornala e installa i componenti richiesti:

    gcloud components update
    gcloud components install alpha beta
  16. Attiva le notifiche dei cluster GKE.

Ruoli obbligatori

Per ottenere le autorizzazioni necessarie per configurare le notifiche Slack per le notifiche dei 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 il Cloud Functions Invoker (roles/cloudfunctions.invoker) ruolo IAM all'account di servizio predefinito di Compute Engine nel tuo 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 workspace Slack.

Creare l'applicazione Slack

  1. Unisciti a un workspace Slack, registrandoti con la tua email o utilizzando un invito inviato da un amministratore del workspace.

  2. Accedi a Slack utilizzando il nome del workspace 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 il tuo workspace Slack.
    3. Fai clic su Crea app.
    4. In Aggiungi 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 il tuo workspace, fai clic su Aggiungi nuovo webhook al 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 il tuo workspace. Salva l'URL per un uso futuro.

Scrivere la funzione Cloud Run

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

  1. Crea una nuova directory denominata gke_slack e accedi alla 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);
            (async () => {
              await webhook.send(message);
            })().catch((e) => {
                console.log(e);
            });
        }
    });
    
    // 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 di Cloud Run Functions che specifica l'URL webhook creato per l'applicazione Slack. Definisci la variabile di ambiente quando esegui il deployment della funzione.

    Il webhook ascolta e riceve messaggi da Cloud Run 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 al workspace Slack configurato.

    Puoi espandere il messaggio nella funzione createSlackMessage per includere molti altri elementi, tra cui la formattazione del testo e le immagini. La funzione isAllowedType viene fornita per consentire il filtraggio di base delle notifiche in base all'URL del tipo. Puoi specificare quali URL di tipo 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 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

    Puoi aggiungere altre dipendenze, requisiti e altre informazioni, se necessario.

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

Eseguire il deployment della funzione Cloud Run

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

gcloud

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

gcloud functions deploy slackNotifier \
  --gen2 \
  --trigger-topic=TOPIC_NAME \
  --runtime=nodejs24 \
  --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 Run Functions nella Google Cloud console.

    Vai a Cloud Functions

  2. Fai clic su Crea funzione.

  3. Nella pagina Configurazione, esegui i seguenti passaggi:

    1. Dall'elenco a discesa Ambiente, seleziona 2ª gen..
    2. In Nome funzione, specifica slackNotifier.
    3. In Regione, specifica una regione 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 sia selezionato Cloud Pub/Sub.
    6. Seleziona l'argomento Pub/Sub che hai creato quando hai attivato le notifiche dei cluster.
    7. In 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 del webhook interno creato in Creare l'applicazione Slack.
    13. Fai clic su Avanti.
  4. Nella pagina Codice, esegui i seguenti passaggi:

    1. Seleziona Node.js 14 dall'elenco a discesa Runtime.
    2. In 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.

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

Verificare le notifiche 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 può variare in base alle finestre di manutenzione e alle esclusioni configurate.
  3. Dopo che GKE ha eseguito l'upgrade dei nodi, controlla se hai ricevuto un messaggio in Slack.

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

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

  2. Dopo che GKE ha eseguito l'upgrade dei nodi, controlla se hai ricevuto 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

Libera spazio

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 Google Cloud console, 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 progetto e fai clic su Chiudi per eliminare il progetto.

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 Google Cloud console.

  2. Elimina l'argomento Pub/Sub.

  3. Elimina l'app Slack.

Passaggi successivi