Configura notificaciones de clúster para servicios de terceros


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. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

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

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita las API de GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub.

    Habilita las API

  5. Instala Google Cloud CLI.
  6. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  7. Instala y actualiza los componentes de gcloud:
    gcloud components update
    gcloud components install alpha beta
  8. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  9. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  10. Habilita las API de GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub.

    Habilita las API

  11. Instala Google Cloud CLI.
  12. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  13. Instala y actualiza los componentes de gcloud:
    gcloud components update
    gcloud components install alpha beta
  14. Habilita las notificaciones de clúster de GKE.

Roles obligatorios

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:

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

  1. Ú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.

  2. Accede a Slack con el nombre de tu espacio de trabajo y tus credenciales de la cuenta de Slack.

  3. Para crear una app de Slack nueva, sigue estos pasos:

    1. En el cuadro de diálogo Create an app (Crear una aplicación), haz clic en From scratch (Desde cero).
    2. Especifica un nombre de aplicación y elige tu lugar de trabajo de Slack.
    3. Haz clic en Crear aplicación (Create App).
    4. En Add features and functionality (Agregar características y funciones), haz clic en Incoming Webhooks (Webhooks entrantes).
    5. Haz clic en el botón de activación Activate Incoming Webhooks (Activar webhooks entrantes).
    6. 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).
    7. En la página de autorización que se abrirá, selecciona un canal para recibir notificaciones.
    8. Haga clic en Allow.
    9. 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.

  1. Crea un directorio nuevo llamado gke_slack y usa el comando de cambio de directorio en él:

    mkdir ~/gke_slack && cd $_
    
  2. 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ón isAllowedType se proporciona para habilitar el filtrado básico de notificaciones mediante la URL de tipo. Puedes especificar qué URLs de tipo se permiten en allowedTypeURLs. 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:

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

  1. Ve a la página de Cloud Functions en la consola de Google Cloud.

    Ir a Cloud Functions

  2. Haz clic en Crear función.

  3. En la página Configuración, realiza los siguientes pasos:

    1. En la lista desplegable Entorno, selecciona 2ª gen..
    2. En Nombre de la función, especifica slackNotifier.
    3. En Región, especifica una región de Compute Engine.
    4. En la sección Activador, haz clic en AGREGAR ACTIVADOR DE EVENTARC.
    5. En la ventana abierta, comprueba que la lista desplegable Proveedor del evento selecciona Cloud Pub/Sub.
    6. Selecciona el tema de Pub/Sub que creaste cuando habilitaste las notificaciones de clúster.
    7. En Región, especifica la misma región de Compute Engine que la función.
    8. Haz clic en GUARDAR ACTIVADOR.
    9. Expande la sección Configuración del entorno de ejecución, la compilación, las conexiones y la seguridad.
    10. En Variables de entorno de ejecución, haz clic en Agregar variable.
    11. En Nombre, especifica SLACK_WEBHOOK.
    12. Para Valor, especifica la URL del webhook interno creado en Crea la aplicación de Slack.
    13. Haga clic en Next.
  4. En la página Código, realiza los siguientes pasos:

    1. Selecciona Node.js 14 en la lista desplegable Entorno de ejecución.
    2. En Punto de entrada, especifica slackNotifier.
    3. 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.
    4. 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.
    5. 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:

  1. Inicia una actualización del plano de control.
  2. 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.
  3. 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:

  1. 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.

  2. 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

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra los recursos individuales

  1. 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.

  2. Borra el tema de Pub/Sub.

  3. Borra la app de Slack.

¿Qué sigue?