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.
Objetivos
- Desplegar una aplicación de Slack para recibir notificaciones externas de GKE.
- Escribe una función de Cloud Run que envíe notificaciones de Pub/Sub a Slack.
Costes
En este documento, se utilizan los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.
Antes de empezar
- 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.
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
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
-
Después de inicializar gcloud CLI, actualízala e instala los componentes necesarios:
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.
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
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init
-
Después de inicializar gcloud CLI, actualízala e instala los componentes necesarios:
gcloud components update gcloud components install alpha beta
- Habilita las notificaciones del clúster de GKE.
-
Desarrollador de Cloud Functions (
roles/cloudfunctions.developer
) -
Administrador de Kubernetes Engine (
roles/container.admin
) Ú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.
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 el 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.
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.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.
- 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.
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.
- 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.
Elimina la función de Cloud Run que has desplegado en este tutorial:
gcloud functions delete slackNotifier
También puedes eliminar funciones de Cloud Run desde la Google Cloud consola.
- Consulta los tipos de notificaciones de clústeres.
- Consulta la documentación de Cloud Run Functions y Pub/Sub.
- Consulta más información sobre cómo crear aplicaciones de Slack.
Roles obligatorios
Para obtener los permisos que necesitas para configurar las notificaciones de Slack para las notificaciones de clústeres, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos (IAM) en tu proyecto:
Para asegurarte de que la cuenta de servicio predeterminada de Compute Engine tiene los permisos necesarios para invocar la función de Cloud Run, pide a tu administrador que le asigne el rol de IAM Invocador de Cloud Functions (roles/cloudfunctions.invoker
) a la cuenta de servicio predeterminada de Compute Engine en tu proyecto.
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
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.
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 mediante la CLI de Google Cloud o 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:
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
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:
Si has usado un clúster estándar, verifica las notificaciones de la siguiente manera:
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
Limpieza
Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.