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.
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
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Abilita le API GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub.
- Installa Google Cloud CLI.
-
Per initialize gcloud CLI, esegui questo comando:
gcloud init
-
Aggiorna e installa i componenti di
gcloud
:gcloud components update
gcloud components install alpha beta -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Abilita le API GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub.
- Installa Google Cloud CLI.
-
Per initialize gcloud CLI, esegui questo comando:
gcloud init
-
Aggiorna e installa i componenti di
gcloud
:gcloud components update
gcloud components install alpha beta - 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:
-
Sviluppatore Cloud Functions (
roles/cloudfunctions.developer
) -
Amministratore Kubernetes Engine (
roles/container.admin
)
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
Partecipa a un'area di lavoro Slack registrandoti con la tua email o utilizzando un invito inviato da un amministratore di Workspace.
Accedi a Slack utilizzando il nome della tua area di lavoro e le credenziali del tuo account Slack.
-
- Nella finestra di dialogo Crea un'app, fai clic su Da zero.
- Specifica un Nome app e scegli la tua area di lavoro Slack.
- Fai clic su Create App (Crea app).
- In Aggiungi funzioni e funzionalità, fai clic su Webhook in entrata.
- Fai clic sul pulsante di attivazione/disattivazione Attiva webhook in entrata.
- Nella sezione URL webhook per la tua area di lavoro, fai clic su Aggiungi nuovo webhook a Workspace.
- Nella pagina di autorizzazione che si apre, seleziona un canale su cui ricevere le notifiche.
- Fai clic su Consenti.
- 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.
Crea una nuova directory denominata
gke_slack
e cambiala al suo interno:mkdir ~/gke_slack && cd $_
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 funzioneisAllowedType
consente di filtrare le notifiche di base in base al tipo di URL. Puoi specificare il tipo di URL da consentire inallowedTypeURLs
. 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:
TOPIC_NAME
: il nome dell'argomento Pub/Sub che hai creato durante l'abilitazione delle notifiche del cluster.REGION
: la regione di Compute Engine per la funzione.WEBHOOK_URL
: l'URL webhook creato per l'applicazione Slack in Creare l'applicazione Slack.
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
Vai alla pagina Cloud Functions nella console Google Cloud.
Fai clic su
Crea funzione.Nella pagina Configurazione, segui questi passaggi:
- Dall'elenco a discesa Ambiente, seleziona 2a generazione.
- Per Nome funzione, specifica slackNotifier.
- In Regione, specifica una regione di Compute Engine.
- Nella sezione Trigger, fai clic su AGGIUNGI TRIGGER EVENTARC.
- Nella finestra aperta, verifica che nell'elenco a discesa Provider di eventi selezioni Cloud Pub/Sub.
- Seleziona l'argomento Pub/Sub che hai creato durante l'abilitazione delle notifiche del cluster.
- Per Regione, specifica la stessa regione di Compute Engine della funzione.
- Fai clic su SALVA ATTIVATORE.
- Espandi la sezione Impostazioni di runtime, build, connessioni e sicurezza.
- In Variabili di ambiente di runtime, fai clic su Aggiungi variabile.
- In corrispondenza di Nome, specifica SLACK_WEBHOOK.
- In Valore, specifica l'URL del webhook interno creato in Creare l'applicazione Slack.
- Fai clic su Avanti.
Nella pagina Codice, segui questi passaggi:
- Seleziona Node.js 14 dall'elenco a discesa Runtime.
- Per Entry point, specifica slackNotifier.
- Nel riquadro di navigazione, seleziona index.js e sostituisci il codice con il codice campione in Write the Cloud Function.
- Nel riquadro di navigazione, seleziona package.json e sostituisci il codice con il codice campione in Write the Cloud Function.
- 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:
- Avvia un upgrade del piano di controllo.
- 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.
- 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:
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.
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
- Nella console Google Cloud, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.
Elimina singole risorse
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.
Passaggi successivi
- Scopri di più sui tipi di notifiche relative ai cluster.
- Consulta la documentazione di Cloud Functions e la documentazione di Pub/Sub.
- Scopri di più sulla creazione di app Slack.