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 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 Run 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 Run 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. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the GKE, Cloud Run functions, Cloud Build, Eventarc and Pub/Sub APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. Update and install gcloud components:

    gcloud components update
    gcloud components install alpha beta
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Make sure that billing is enabled for your Google Cloud project.

  10. Enable the GKE, Cloud Run functions, Cloud Build, Eventarc and Pub/Sub APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.
  12. To initialize the gcloud CLI, run the following command:

    gcloud init
  13. Update and install gcloud components:

    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 Cloud Run function, 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. 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 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 Descripción general de Cloud Run 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. 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

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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Borra los recursos individuales

  1. Borra la Cloud Run function que implementaste en este instructivo:

    gcloud functions delete slackNotifier
    

    También puedes borrar funciones de Cloud Run en la consola de Google Cloud.

  2. Borra el tema de Pub/Sub.

  3. Borra la app de Slack.

¿Qué sigue?