Configurar notificações de cluster para serviços de terceiros


Neste tutorial, mostramos como configurar serviços de mensagens de terceiros para receber notificações de cluster do Google Kubernetes Engine (GKE).

Serviços como o Slack oferecem Webhooks de entrada , uma forma simples de postar mensagens de apps no Slack. O Cloud Run functions é uma solução leve do Compute Engine para criar funções autônomas e de finalidade única que respondem a eventos do Google Cloud, como notificações do cluster, sem precisar gerenciar um servidor ou um ambiente de execução. Quando o GKE envia uma notificação de cluster usando o Pub/Sub, um acionador responde executando uma ação, como o envio de uma notificação do Slack.

Há muitos serviços de terceiros, criados com a funcionalidade de mensagens entre aplicativos, como IFTTT. Use este tutorial como um modelo para se conectar a esses serviços.

Neste tutorial, você usa o Cloud Run functions e o Pub/Sub para enviar notificações sobre eventos de cluster do GKE para o Slack.

Objetivos

  • Implantar um aplicativo Slack para receber notificações externas do GKE.
  • Escrever uma Cloud Run function que envie notificações do Pub/Sub para o Slack.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.

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.

    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. Ative as notificações de cluster do GKE.

Funções exigidas

Para receber as permissões necessárias a fim de configurar as notificações do Slack nas notificações de cluster, peça ao administrador para conceder a você os seguintes papéis de IAM no projeto:

Para garantir que a conta de serviço padrão do Compute Engine tenha as permissões necessárias a fim de invocar a Cloud Run function, peça ao administrador para conceder a ela o papel do IAM de Invocador do Cloud Functions (roles/cloudfunctions.invoker) no projeto.

Notificações do Slack

Para configurar as notificações do Slack, crie um aplicativo do Slack, ative os Webhooks de entrada para o aplicativo e instale-o em um espaço de trabalho do Slack.

Crie o aplicativo Slack

  1. Participe de um espaço de trabalho do Slack registrando-se com seu e-mail ou usando um convite enviado por um administrador do espaço de trabalho.

  2. Faça login no Slack usando o nome do seu espaço de trabalho e as credenciais da sua conta do Slack.

  3. Criar um novo aplicativo do Slack

    1. Na caixa de diálogo Criar um aplicativo, clique em Do zero.
    2. Especifique o campo App Name e escolha seu espaço de trabalho do Slack.
    3. Clique em Create App.
    4. Em Adicionar recursos e funcionalidades, clique em Webhooks de entrada.
    5. Clique no botão Ativar Webhooks de entrada.
    6. Na seção Webhook URLs for your Workspace, clique em Add New Webhook to Workspace.
    7. Na página de autorização, selecione um canal para receber notificações.
    8. Clique em Permitir.
    9. Um webhook do aplicativo Slack é exibido na seção URLs do webhook para seu espaço de trabalho. Salve o URL para mais tarde.

Escrever a Cloud Run function

Quando o GKE publica uma notificação de cluster em um tópico do Pub/Sub, o evento aciona o Cloud Run functions para que envie uma notificação do Slack.

  1. Crie um novo diretório com o nome gke_slack e altere o diretório nele:

    mkdir ~/gke_slack && cd $_
    
  2. Crie os seguintes arquivos 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 do Cloud Run functions que especifica o URL do webhook, criado para seu aplicativo Slack. Você define a variável de ambiente ao implantar a função.

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

    É possível expandir a mensagem na função createSlackMessage para incluir muito mais, incluindo formatação de texto e imagens. A função isAllowedType é fornecida para ativar a filtragem básica de notificações pelo URL de tipo. É possível especificar quais tipos de URLs permitir em allowedTypeURLs. Essa função não será necessária se você já filtrou notificações, no GKE ou na sua assinatura 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"
      }
    }
    

    package.json descreve os seguintes atributos do programa:

    • Nome, versão e descrição
    • Arquivos principais do ambiente de execução
    • Dependências

    É possível adicionar mais dependências, requisitos e outras informações conforme necessário.

Agora, você tem os arquivos index.js e package.json no diretório gke_slack.

Implantar a Cloud Run function

É possível implantar a Cloud Run function usando a CLI do Google Cloud ou o console do Google Cloud.

gcloud

Para implantar 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:

A saída será assim:

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. Acesse a página do Cloud Run functions no console do Google Cloud.

    Acesse o Cloud Functions

  2. Clique em Criar função.

  3. Na página Configuração, execute as seguintes etapas:

    1. Na lista suspensa Ambiente, selecione 2ª geração.
    2. Em Nome da função, especifique slackNotifier.
    3. Em Região, especifique uma região do Compute Engine.
    4. Na seção Gatilho, clique em ADICIONAR GATILHO DO EVENTARC.
    5. Na janela aberta, verifique a lista suspensa Provedor de eventos e selecione Cloud Pub/Sub.
    6. Selecione o tópico do Pub/Sub que você criou ao ativar as notificações de cluster.
    7. Em Região, especifique a mesma região do Compute Engine da função.
    8. Clique em SALVAR GATILHO.
    9. Expanda a seção Ambiente de execução, criação, conexões e configurações de segurança.
    10. Em Variáveis de ambiente, clique em Adicionar variável.
    11. Em Nome, especifique SLACK_WEBHOOK.
    12. Em Value, especifique o URL do webhook interno criado em Criar o aplicativo Slack.
    13. Clique em Próxima.
  4. Na página Código, siga estas etapas:

    1. Selecione Node.js 14 na lista suspensa Ambiente de execução.
    2. Em Ponto de entrada, especifique slackNotifier.
    3. No painel de navegação, selecione index.js e substitua o código pelo código de amostra em Gravar a Função do Cloud.
    4. No painel de navegação, selecione package.json e substitua o código pelo código de amostra em Gravar a Função do Cloud.
    5. Clique em Implantar.

Depois de concluir a implantação da Cloud Run function, você receberá uma notificação do Slack sempre que o GKE enviar uma notificação do cluster.

Verifique notificações do Slack

Se você usou um cluster do Autopilot, verifique as notificações da seguinte maneira:

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

Se você usou um cluster do Standard, verifique as notificações da seguinte maneira:

  1. Faça upgrade de um pool de nós específico para uma nova versão. Se não quiser alterar a versão do GKE nos nós, faça o upgrade para a mesma versão atual nos nós.

  2. Depois que o GKE fizer upgrade dos nós, verifique se há uma mensagem no Slack.

A notificação do Slack é semelhante a esta:

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 cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

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

Excluir recursos individuais

  1. Exclua a Cloud Run function que você implantou neste tutorial:

    gcloud functions delete slackNotifier
    

    Também é possível excluir funções do Cloud Run pelo Console do Google Cloud.

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

  3. Exclua o aplicativo Slack.

A seguir