Configurar notificaciones de clústeres para servicios de terceros


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.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

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

  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.

    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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  7. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  8. Después de inicializar gcloud CLI, actualízala e instala los componentes necesarios:

    gcloud components update
    gcloud components install alpha beta
  9. 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 the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  10. Verify that billing is enabled for your Google Cloud project.

  11. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  12. Install the Google Cloud CLI.

  13. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  14. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  15. Después de inicializar gcloud CLI, actualízala e instala los componentes necesarios:

    gcloud components update
    gcloud components install alpha beta
  16. Habilita las notificaciones del clúster de GKE.
  17. 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

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

    2. Inicia sesión en Slack con el nombre de tu espacio de trabajo y las credenciales de tu cuenta de Slack.

    3. Crear una aplicación de Slack

      1. En el cuadro de diálogo Crear una aplicación, haz clic en Desde cero.
      2. Especifica un nombre de aplicación y elige tu espacio de trabajo de Slack.
      3. Haz clic en Create App (Crear aplicación).
      4. En Añadir características y funciones, haz clic en Webhooks entrantes.
      5. Haz clic en el botón Activar webhooks entrantes.
      6. 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).
      7. En la página de autorización que se abre, selecciona un canal para recibir notificaciones.
      8. Haz clic en Permitir.
      9. 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.

    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.

    1. Crea un directorio llamado gke_slack y cambia a ese directorio:

      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 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ón isAllowedType se proporciona para habilitar el filtrado básico de notificaciones por el tipo de URL. Puedes especificar qué tipo de URLs quieres permitir en allowedTypeURLs. 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.

    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

    1. Ve a la página Funciones de Cloud Run de la Google Cloud consola.

      Ir a Cloud Functions

    2. Haz clic en Crear función.

    3. En la página Configuración, sigue estos pasos:

      1. En la lista desplegable Environment, selecciona 2nd gen.
      2. En Function name (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 AÑADIR ACTIVADOR DE EVENTARC.
      5. En la ventana que se abre, comprueba que en la lista desplegable Proveedor de eventos esté seleccionado Cloud Pub/Sub.
      6. Selecciona el tema de Pub/Sub que creaste al habilitar las notificaciones de clúster.
      7. En Región, especifica la misma región de Compute Engine que para la función.
      8. Haz clic en GUARDAR ACTIVADOR.
      9. Despliega la sección Configuración de tiempo de ejecución, compilación, conexiones y seguridad.
      10. En Variables de entorno de ejecución, haga clic en Añadir variable.
      11. En Name (Nombre), especifica SLACK_WEBHOOK.
      12. En Valor, especifica la URL del webhook interno creado en Crear la aplicación de Slack.
      13. Haz clic en Siguiente.
    4. En la página Código, sigue estos pasos:

      1. Selecciona Node.js 14 en la lista desplegable Runtime (Tiempo de ejecución).
      2. En Entry point (Punto de entrada), especifica slackNotifier.
      3. 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.
      4. 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.
      5. Haz clic en Desplegar.

    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:

    1. Inicia una actualización del plano de control.
    2. 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.
    3. Una vez que GKE haya actualizado tus nodos, busca un mensaje en Slack.

    Si has usado un clúster estándar, verifica las notificaciones de la siguiente manera:

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

    2. Una vez que GKE haya actualizado tus nodos, busca un mensaje en Slack.

    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.

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

    Eliminar recursos concretos

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

    2. Elimina el tema de Pub/Sub.

    3. Elimina la aplicación Slack.

    Siguientes pasos