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 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 a necessidade de 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 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 Function que envie notificações Pub/Sub para 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. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative as APIs GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub.

    Ative as APIs

  5. Instale a CLI do Google Cloud.
  6. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  7. Atualize e instale os componentes gcloud:
    gcloud components update
    gcloud components install alpha beta
  8. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  9. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  10. Ative as APIs GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub.

    Ative as APIs

  11. Instale a CLI do Google Cloud.
  12. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  13. Atualize e instale os componentes gcloud:
    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 para configurar notificações do Slack em notificações de cluster, peça ao administrador para conceder a você os seguintes papéis de IAM no seu projeto:

Para garantir que a conta de serviço padrão do Compute Engine tenha as permissões necessárias para invocar a função do Cloud, peça ao seu administrador para conceder à conta de serviço padrão do Compute Engine Invocador do Cloud Functions (roles/cloudfunctions.invoker) papel do IAM 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. Crie um novo aplicativo 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.

Escreva a Cloud Function

Quando o GKE publica uma notificação de cluster em um tópico do Pub/Sub, o evento aciona o Cloud Functions para enviar 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 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 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 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.

Implante a Função do Cloud

É possível implantar a função do Cloud usando a Google Cloud CLI 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 de visão geral do Cloud 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 Deploy.

Depois de concluir a implantação do Cloud Function, você receberá uma notificação do Slack sempre que o GKE enviar uma notificação de 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.

Exclua o projeto

  1. No Console do Google Cloud, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

Excluir recursos individuais

  1. Exclua a Função do Cloud implantada neste tutorial:

    gcloud functions delete slackNotifier
    

    Também é possível excluir o Cloud Functions do Console do Google Cloud.

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

  3. Exclua o aplicativo Slack.

A seguir