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 Run 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 deGoogle 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 con 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 Run functions y Pub/Sub para enviar notificaciones sobre eventos del clúster de GKE a Slack.

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. Cree una aplicación de Slack nueva

    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. Haz clic en Permitir.
    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 Run function

Cuando GKE publica una notificación de clúster en un tema de Pub/Sub, el evento activa Cloud Run 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 Run 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 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 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 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 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.

Implementa la Cloud Run function

Puedes implementar la Cloud Run function con Google Cloud CLI o la Google Cloud consola.

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 Cloud Run functions en la Google Cloud consola.

    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. Haz clic en Siguiente.
  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. Haz clic en Implementar.

Luego de completar la implementación de la Cloud Run 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