En este instructivo, se muestra cómo configurar los servicios de mensajería de terceros para recibir notificaciones de clúster de Google Kubernetes Engine (GKE).
Los servicios como Slack ofrecen webhooks entrantes, una manera sencilla de publicar mensajes de apps en Slack. Cloud Functions es una solución básica de Compute Engine que permite crear funciones individuales y de un solo propósito que responden a eventos de Google Cloud, como notificaciones de clúster, sin necesidad de administrar un servidor o un entorno de ejecución. Cuando GKE envía una notificación de clúster mediante Pub/Sub, un activador responde ejecutando una acción, como el envío de una notificación de Slack.
Existen muchos servicios de terceros compilados con la función de mensajería entre aplicaciones, como IFTTT. Puedes usar este instructivo como una plantilla para conectarte con esos servicios.
En este instructivo, usarás Cloud Functions y Pub/Sub para enviar notificaciones sobre eventos del clúster de GKE a Slack.
Objetivos
- Implementa una aplicación de Slack para recibir notificaciones externas desde GKE.
- Escribir una Cloud Function que envíe notificaciones de Pub/Sub a Slack
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.
Antes de comenzar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Update and install
gcloud
components: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.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Update and install
gcloud
components:gcloud components update
gcloud components install alpha beta - Habilita las notificaciones de clúster de GKE.
Funciones obligatorias
Para obtener los permisos que necesitas para configurar las notificaciones de Slack para las notificaciones de clúster, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:
-
Desarrollador de Cloud Functions (
roles/cloudfunctions.developer
) -
Administrador de Kubernetes Engine (
roles/container.admin
)
Para asegurarte de que la cuenta de servicio predeterminada de Compute Engine tenga los permisos necesarios para invocar la función de Cloud Functions, pídele a tu administrador que otorgue a la cuenta de servicio predeterminada de Compute Engine el rol de IAM de Invocador de Cloud Functions (roles/cloudfunctions.invoker
) en el proyecto.
Notificaciones de Slack
Si deseas configurar las notificaciones de Slack, debes crear una aplicación de Slack, activar los webhooks entrantes de la aplicación y, luego, instalarla en un lugar de trabajo de Slack.
Crea la aplicación de Slack
Únete a un lugar de trabajo de Slack. Para hacerlo, regístrate con tu correo electrónico o usa una invitación que te haya enviado un administrador del espacio de trabajo.
Accede a Slack con el nombre de tu espacio de trabajo y tus credenciales de la cuenta de Slack.
Cree una aplicación de Slack nueva
- En el cuadro de diálogo Create an app (Crear una aplicación), haz clic en From scratch (Desde cero).
- Especifica un nombre de aplicación y elige tu lugar de trabajo de Slack.
- Haz clic en Crear aplicación (Create App).
- En Add features and functionality (Agregar características y funciones), haz clic en Incoming Webhooks (Webhooks entrantes).
- Haz clic en el botón de activación Activate Incoming Webhooks (Activar webhooks entrantes).
- En la sección Webhook URLs for Your Workspace (URLs de webhook para tu lugar de trabajo), haz clic en Add New Webhook to Workspace (Agregar webhook nuevo al lugar de trabajo).
- En la página de autorización que se abrirá, selecciona un canal para recibir notificaciones.
- Haga clic en Allow.
- Se mostrará un webhook para tu aplicación de Slack en la sección Webhook URLs for Your Workspace (URLs de webhook para tu lugar de trabajo). Guarda la URL para usarla más adelante.
Escribe la Cloud Function
Cuando GKE publica una notificación de clúster en un tema de Pub/Sub, el evento activa Cloud Functions para enviar una notificación de Slack.
Crea un directorio nuevo llamado
gke_slack
y usa el comando de cambio de directorio en él: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 Functions que especifica la URL de webhook que se creó para tu aplicación de Slack. Debes definir la variable de entorno cuando implementas la función.El webhook escucha y recibe mensajes de Cloud 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 de webhook, que, a su vez, envía el mensaje al lugar de trabajo configurado de Slack.
Puedes expandir el mensaje en la función
createSlackMessage
para que incluya mucho más, como el formato de texto y las imágenes. La funciónisAllowedType
se proporciona para habilitar el filtrado básico de notificaciones mediante la URL de tipo. Puedes especificar qué URLs de tipo se permiten enallowedTypeURLs
. Esta función no es necesaria si ya filtraste notificaciones, ya sea en GKE o en tu suscripción a 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
describe los siguientes atributos del programa:- Nombre, versión y descripción
- Archivos principales del entorno de ejecución
- Dependencias
Puedes agregar 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
.
Implemente la Cloud Function
Puedes implementar la Cloud Function mediante Google Cloud CLI o la consola de Google Cloud.
gcloud
Para implementar 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"
Reemplaza lo siguiente:
TOPIC_NAME
: Es el nombre del tema de Pub/Sub que creaste cuando habilitaste las notificaciones de clúster.REGION
: La región de Compute Engine del clúster.WEBHOOK_URL
: La URL de webhook que se creó para tu aplicación de Slack en Crea la aplicación de Slack.
El resultado es similar a este:
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
Ve a la página de Cloud Functions en la consola de Google Cloud.
Haz clic en
Crear función.En la página Configuración, realiza los siguientes pasos:
- En la lista desplegable Entorno, selecciona 2ª gen..
- En 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 AGREGAR ACTIVADOR DE EVENTARC.
- En la ventana abierta, comprueba que la lista desplegable Proveedor del evento selecciona Cloud Pub/Sub.
- Selecciona el tema de Pub/Sub que creaste cuando habilitaste las notificaciones de clúster.
- En Región, especifica la misma región de Compute Engine que la función.
- Haz clic en GUARDAR ACTIVADOR.
- Expande la sección Configuración del entorno de ejecución, la compilación, las conexiones y la seguridad.
- En Variables de entorno de ejecución, haz clic en Agregar variable.
- En Nombre, especifica SLACK_WEBHOOK.
- Para Valor, especifica la URL del webhook interno creado en Crea la aplicación de Slack.
- Haga clic en Next.
En la página Código, realiza los siguientes pasos:
- Selecciona Node.js 14 en la lista desplegable Entorno de ejecución.
- En Punto de entrada, especifica slackNotifier.
- En el panel de navegación, selecciona index.js y reemplaza el código por el código de muestra en Escribe la Cloud Function.
- En el panel de navegación, selecciona package.json y reemplaza el código por el código de muestra en Escribe la Cloud Function.
- Haga clic en Implementar.
Luego de completar la implementación de la Cloud Function, recibirás una notificación de Slack cada vez que GKE envíe una notificación de clúster.
Verifica las notificaciones de Slack
Si usaste 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 de manera automática tus nodos a la versión nueva. El tiempo puede variar según los períodos de mantenimiento y las exclusiones configurados.
- Después de que GKE actualice los nodos, busca un mensaje en Slack.
Si usaste un clúster estándar, verifica las notificaciones de la siguiente manera:
Actualiza un grupo de nodos específico a una versión nueva. Si no deseas cambiar la versión de GKE en tus nodos, puedes actualizar a la misma versión actual de los nodos.
Después de que GKE actualice los nodos, revisa Slack para ver el mensaje.
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
Limpia
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra el proyecto
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Borra los recursos individuales
Borra la función de Cloud Functions que implementaste en este instructivo:
gcloud functions delete slackNotifier
También puedes borrar funciones de Cloud Functions en la consola de Google Cloud.
¿Qué sigue?
- Obtén más información sobre los tipos de notificaciones de clúster.
- Consulta la documentación de Cloud Functions y Pub/Sub.
- Obtén más información sobre cómo compilar apps de Slack.