Configure notificações de clusters para serviços de terceiros


Este tutorial mostra como configurar serviços de mensagens de terceiros para receber notificações de clusters do Google Kubernetes Engine (GKE).

Serviços como o Slack oferecem webhooks recebidos, uma forma simples de publicar mensagens de apps no Slack. As funções do Cloud Run são uma solução do Compute Engine leve para criar funções autónomas de finalidade única que respondem a Google Cloud eventos, como notificações de clusters, sem ter de gerir um servidor ou um ambiente de tempo de execução. Quando o GKE envia uma notificação de cluster através do Pub/Sub, um acionador responde executando uma ação, como o envio de uma notificação do Slack.

Existem muitos serviços de terceiros criados com a funcionalidade de mensagens entre aplicações, como o IFTTT. Pode usar este tutorial como um modelo para estabelecer ligação a estes serviços.

Neste tutorial, vai usar funções do Cloud Run e o Pub/Sub para enviar notificações sobre eventos do cluster do GKE para o Slack.

Objetivos

  • Implemente uma aplicação Slack para receber notificações externas do GKE.
  • Escreva uma função do Cloud Run que envie notificações do Pub/Sub para o Slack.

Custos

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

Antes de começar

  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. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  7. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  8. Depois de inicializar a CLI gcloud, atualize-a e instale os componentes necessários:

    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. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.

  14. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  15. Depois de inicializar a CLI gcloud, atualize-a e instale os componentes necessários:

    gcloud components update
    gcloud components install alpha beta
  16. Ative as notificações do cluster do GKE.
  17. Funções necessárias

    Para receber as autorizações de que precisa para configurar as notificações do Slack para notificações de clusters, peça ao seu administrador que lhe conceda as seguintes funções da IAM no seu projeto:

    Para garantir que a conta de serviço predefinida do Compute Engine tem as autorizações necessárias para invocar a função do Cloud Run, peça ao seu administrador para conceder à conta de serviço predefinida do Compute Engine a função de IAM Invocador das Cloud Functions (roles/cloudfunctions.invoker) no seu projeto.

    Notificações do Slack

    Para configurar as notificações do Slack, tem de criar uma aplicação do Slack, ativar os Webhooks de entrada para a aplicação e instalar a aplicação num espaço de trabalho do Slack.

    Crie a aplicação Slack

    1. Junte-se a um espaço de trabalho do Slack, registando-se com o seu email ou usando um convite enviado por um administrador do Workspace.

    2. Inicie sessão no Slack com o nome do espaço de trabalho e as credenciais da sua conta do Slack.

    3. Crie uma nova app Slack

      1. Na caixa de diálogo Criar uma app, clique em Do zero.
      2. Especifique um Nome da app e escolha o seu espaço de trabalho do Slack.
      3. Clique em Criar app.
      4. Em Adicionar funcionalidades, clique em Webhooks recebidos.
      5. Clique no botão ativar/desativar Ativar webhooks recebidos.
      6. Na secção URLs de webhook para o seu espaço de trabalho, clique em Adicionar novo webhook ao espaço de trabalho.
      7. Na página de autorização apresentada, selecione um canal para receber notificações.
      8. Clique em Permitir.
      9. É apresentado um webhook para a sua aplicação Slack na secção URLs de webhook para o seu espaço de trabalho. Guarde o URL para mais tarde.

    Escreva a função do Cloud Run

    Quando o GKE publica uma notificação de cluster num tópico do Pub/Sub, o evento aciona funções do Cloud Run para enviar uma notificação do Slack.

    1. Crie um novo diretório com o nome gke_slack e mude o diretório para este:

      mkdir ~/gke_slack && cd $_
      
    2. Crie os seguintes ficheiros no diretório 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 é uma variável de ambiente das funções do Cloud Run que especifica o URL do webhook criado para a sua aplicação Slack. Define a variável de ambiente quando implementa a função.

      O webhook ouve e recebe mensagens de funções do Cloud Run. Quando o GKE envia uma notificação de cluster para o Pub/Sub (o evento), a função envia uma mensagem (o acionador) para o URL do webhook, que, por sua vez, envia a mensagem para o espaço de trabalho do Slack configurado.

      Pode expandir a mensagem na função createSlackMessage para incluir muito mais, incluindo formatação de texto e imagens. A função isAllowedType é fornecida para permitir a filtragem básica de notificações pelo URL do tipo. Pode especificar que tipos de URLs permitir em allowedTypeURLs. Esta função não é necessária se já tiver filtrado as notificações, no GKE ou na sua subscrição do 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"
        }
      }
      

      O package.json descreve os seguintes atributos do programa:

      • Nome, versão e descrição
      • Ficheiros de tempo de execução principais
      • Dependências

      Pode adicionar mais dependências, requisitos e outras informações, conforme necessário.

    Agora, deve ter os ficheiros index.js e package.json no diretório gke_slack.

    Implemente a função do Cloud Run

    Pode implementar a função do Cloud Run através da CLI gcloud ou da Google Cloud consola.

    gcloud

    Para implementar a função, execute o seguinte comando no diretório 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"
    

    Substitua o seguinte:

    O resultado é semelhante ao seguinte:

    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. Aceda à página Funções do Cloud Run na Google Cloud consola.

      Aceder ao Cloud Functions

    2. Clique em Criar função.

    3. Na página Configuração, siga estes passos:

      1. Na lista pendente Ambiente, selecione 2.ª geração.
      2. Para Nome da função, especifique slackNotifier.
      3. Para Região, especifique uma região do Compute Engine.
      4. Na secção Acionador, clique em ADICIONAR ACIONADOR DO EVENTARC.
      5. Na janela aberta, verifique se na lista pendente Fornecedor de eventos, está selecionado Cloud Pub/Sub.
      6. Selecione o tópico do Pub/Sub que criou quando ativou as notificações de clusters.
      7. Para Região, especifique a mesma região do Compute Engine que para a função.
      8. Clique em GUARDAR ACIONADOR.
      9. Expanda a secção Definições de tempo de execução, compilação, ligações e segurança.
      10. Em Variáveis de ambiente de tempo de execução, clique em Adicionar variável.
      11. Para Nome, especifique SLACK_WEBHOOK.
      12. Em Valor, especifique o URL do webhook interno criado em Crie a aplicação Slack.
      13. Clicar em Seguinte.
    4. Na página Código, siga estes passos:

      1. Selecione Node.js 14 na lista pendente Runtime.
      2. Para Entry point, especifique slackNotifier.
      3. No painel de navegação, selecione index.js e substitua o código pelo código de exemplo em Escreva a função do Google Cloud.
      4. No painel de navegação, selecione package.json e substitua o código pelo código de exemplo em Escreva a função do Cloud.
      5. Clique em Implementar.

    Depois de concluir a implementação da função do Cloud Run, vai receber uma notificação do Slack sempre que o GKE enviar uma notificação do cluster.

    Valide as notificações do Slack

    Se usou um cluster do Autopilot, valide as notificações da seguinte forma:

    1. Inicie uma atualização do plano de controlo.
    2. Aguarde que o GKE atualize automaticamente os seus nós para a nova versão. O tempo necessário pode variar com base nas janelas de manutenção configuradas e nas exclusões.
    3. Depois de o GKE atualizar os seus nós, verifique se recebeu uma mensagem no Slack.

    Se usou um cluster padrão, valide as notificações da seguinte forma:

    1. Atualize um node pool específico para uma nova versão. Se não quiser alterar a versão do GKE nos seus nós, pode atualizar para a mesma versão atualmente nos nós.

    2. Depois de o GKE atualizar os seus nós, verifique se recebeu uma mensagem no Slack.

    A notificação do Slack é semelhante à seguinte:

    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
    

    Limpar

    Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.

    Elimine o projeto

    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.

    Elimine recursos individuais

    1. Elimine a função do Cloud Run implementada neste tutorial:

      gcloud functions delete slackNotifier
      

      Também pode eliminar funções do Cloud Run a partir da Google Cloud consola.

    2. Elimine o tópico do Pub/Sub.

    3. Elimine a app Slack.

    O que se segue?