En este tutorial se explica cómo configurar servicios de mensajería de terceros para recibir notificaciones de clústeres de Google Kubernetes Engine (GKE).
Servicios como Slack ofrecen webhooks entrantes, una forma sencilla de publicar mensajes de aplicaciones en Slack. Cloud Run functions es una solución de Compute Engine ligera que permite crear funciones independientes con un solo propósito que responden a Google Cloud eventos, como notificaciones de clústeres, sin necesidad de gestionar servidores ni entornos de ejecución. Cuando GKE envía una notificación de clúster mediante Pub/Sub, un activador responde ejecutando una acción, como enviar una notificación de Slack.
Hay muchos servicios de terceros creados con funciones de mensajería entre aplicaciones, como IFTTT. Puedes usar este tutorial como plantilla para conectarte a estos servicios.
En este tutorial, usarás funciones de Cloud Run y Pub/Sub para enviar notificaciones sobre eventos de clústeres de GKE a Slack.
Notificaciones de Slack
Para configurar las notificaciones de Slack, debes crear una aplicación de Slack, activar los webhooks entrantes de la aplicación e instalar la aplicación en un espacio de trabajo de Slack.
Crear la aplicación de Slack
Únete a un espacio de trabajo de Slack registrándote con tu correo o usando una invitación que te haya enviado un administrador del espacio de trabajo.
Inicia sesión en Slack con el nombre de tu espacio de trabajo y las credenciales de tu cuenta de Slack.
-
- En el cuadro de diálogo Crear una aplicación, haz clic en Desde cero.
- Especifica un nombre de aplicación y elige tu espacio de trabajo de Slack.
- Haz clic en Create App (Crear aplicación).
- En Añadir características y funciones, haz clic en Webhooks entrantes.
- Haz clic en el botón Activar webhooks entrantes.
- En la sección Webhook URLs for Your Workspace (URLs de webhook de tu espacio de trabajo), haz clic en Add New Webhook to Workspace (Añadir nuevo webhook al espacio de trabajo).
- En la página de autorización que se abre, selecciona un canal para recibir notificaciones.
- Haz clic en Permitir.
- Se muestra un webhook de tu aplicación de Slack en la sección URLs de webhook de tu espacio de trabajo. Guarda la URL para más adelante.
Escribir la función de Cloud Run
Cuando GKE publica una notificación de clúster en un tema de Pub/Sub, el evento activa las funciones de Cloud Run para enviar una notificación de Slack.
Crea un directorio llamado
gke_slack
y cambia a ese directorio:mkdir ~/gke_slack && cd $_
Crea los siguientes archivos en el directorio 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
es una variable de entorno de Cloud Run functions que especifica la URL del webhook creado para tu aplicación de Slack. La variable de entorno se define al desplegar la función.El webhook escucha y recibe mensajes de Cloud Run Functions. Cuando GKE envía una notificación de clúster a Pub/Sub (el evento), la función envía un mensaje (el activador) a la URL del webhook, que a su vez envía el mensaje al espacio de trabajo de Slack configurado.
Puedes ampliar el mensaje de la función
createSlackMessage
para incluir mucho más, como formato de texto e imágenes. La funciónisAllowedType
se proporciona para habilitar el filtrado básico de notificaciones por tipo de URL. Puedes especificar qué tipo de URLs quieres permitir enallowedTypeURLs
. Esta función no es necesaria si ya has filtrado las notificaciones, ya sea en GKE o en tu suscripción de 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
describe los siguientes atributos del programa:- Nombre, versión y descripción
- Archivos de tiempo de ejecución principales
- Dependencias
Puedes añadir más dependencias, requisitos y otra información según sea necesario.
Ahora deberías tener los archivos index.js
y package.json
en el directorio gke_slack
.
Desplegar la función de Cloud Run
Puedes desplegar la función de Cloud Run con la CLI de Google Cloud o con la Google Cloud consola.
gcloud
Para desplegar la función, ejecuta el siguiente comando en el directorio 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"
Haz los cambios siguientes:
TOPIC_NAME
: el nombre del tema de Pub/Sub que creaste al habilitar las notificaciones de clúster.REGION
: la región de Compute Engine de la función.WEBHOOK_URL
: la URL del webhook creada para tu aplicación de Slack en Crear la aplicación de Slack.
El resultado debería ser similar al siguiente:
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'
Consola
Ve a la página Funciones de Cloud Run de la Google Cloud consola.
Haz clic en
Crear función.En la página Configuración, sigue estos pasos:
- En la lista desplegable Environment, selecciona 2nd gen.
- En Function name (Nombre de la función), especifica slackNotifier.
- En Región, especifica una región de Compute Engine.
- En la sección Activador, haz clic en AÑADIR ACTIVADOR DE EVENTARC.
- En la ventana que se abre, comprueba que en la lista desplegable Proveedor de eventos esté seleccionado Cloud Pub/Sub.
- Selecciona el tema de Pub/Sub que creaste al habilitar las notificaciones de clúster.
- En Región, especifica la misma región de Compute Engine que para la función.
- Haz clic en GUARDAR ACTIVADOR.
- Despliega la sección Configuración de tiempo de ejecución, compilación, conexiones y seguridad.
- En Variables de entorno de ejecución, haga clic en Añadir variable.
- En Name (Nombre), especifica SLACK_WEBHOOK.
- En Valor, especifica la URL del webhook interno creado en Crear la aplicación de Slack.
- Haz clic en Siguiente.
En la página Código, sigue estos pasos:
- Selecciona Node.js 14 en la lista desplegable Runtime (Tiempo de ejecución).
- En Entry point (Punto de entrada), especifica slackNotifier.
- En el panel de navegación, selecciona index.js y sustituye el código por el código de ejemplo de Escribir la función de Cloud.
- En el panel de navegación, selecciona package.json y sustituye el código por el código de ejemplo de Escribir la función de Cloud.
- Haz clic en Desplegar.
Una vez que hayas completado la implementación de la función de Cloud Run, recibirás una notificación de Slack cada vez que GKE envíe una notificación de clúster.
Verificar las notificaciones de Slack
Si has usado un clúster de Autopilot, verifica las notificaciones de la siguiente manera:
- Inicia una actualización del plano de control.
- Espera a que GKE actualice automáticamente tus nodos a la nueva versión. El tiempo necesario puede variar en función de las ventanas de mantenimiento y las exclusiones configuradas.
- Una vez que GKE haya actualizado tus nodos, busca un mensaje en Slack.
Si has usado un clúster estándar, verifica las notificaciones de la siguiente manera:
Actualiza un grupo de nodos específico a una nueva versión. Si no quieres cambiar la versión de GKE de tus nodos, puedes actualizar a la misma versión que tienen los nodos.
Una vez que GKE haya actualizado tus nodos, busca un mensaje en Slack.
La notificación de Slack es similar a la siguiente:
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