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

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

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 tutorial, usamos 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 este tutorial, exclua os recursos criados para evitar o faturamento contínuo. Para mais informações, consulte 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 o faturamento está ativado para seu projeto na nuvem. Saiba como verificar se o faturamento está ativado em um projeto.

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

    Ative as APIs

  5. Instale e inicialize a Google Cloud CLI.
  6. Atualize e instale os componentes gcloud:
    gcloud components update &&
    gcloud components install alpha beta
  7. 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

  8. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como verificar se o faturamento está ativado em um projeto.

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

    Ative as APIs

  10. Instale e inicialize a Google Cloud CLI.
  11. Atualize e instale os componentes gcloud:
    gcloud components update &&
    gcloud components install alpha beta
  12. Ative as notificações de cluster do GKE.

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 { 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 = [];
    
    // slackNotifier is the main function called by Cloud Functions
    module.exports.slackNotifier = (pubSubEvent, context) => {
      const data = decode(pubSubEvent.data);
    
      // Send message to Slack.
      if (isAllowedType(pubSubEvent.attributes)) {
        const message = createSlackMessage(data, pubSubEvent.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": "5.0.1"
      }
    }
    

    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 \
  --trigger-topic=TOPIC_NAME \
  --runtime=nodejs10 \
  --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.

    Acessar o Google Kubernetes Engine

  2. Clique em Criar função.

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

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

    1. Selecione Node.js 10 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

É possível testar se as notificações do cluster funcionam corretamente fazendo upgrade manual de um pool de nós em seu cluster para a mesma versão do GKE.

Para iniciar um upgrade do pool de nós, execute o seguinte comando:

gcloud container clusters upgrade CLUSTER_NAME \
    --node-pool=NODE_POOL_NAME \
    --cluster-version=VERSION

Substitua:

  • CLUSTER_NAME: o nome do cluster.
  • NODE_POOL_NAME: o nome do pool de nós que você quer atualizar.
  • VERSION: a versão do GKE que você quer para o pool de nós. Se você omitir essa sinalização, o GKE atualizará o pool de nós para a mesma versão do plano de controle.

Quando você executar o comando, receberá uma 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