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 Google Cloud eventos, 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ê vai usar os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso, use a calculadora de preços.

Novos Google Cloud usuários podem estar qualificados para um teste sem custo financeiro.

Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Para mais informações, consulte Limpeza.

Antes de começar

  1. Faça login na sua Google Cloud conta do. Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho dos 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. 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 role (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. Instale a Google Cloud CLI.

  6. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com 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 role (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. Instale a Google Cloud CLI.

  13. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com 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 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 função do Cloud Run, 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);
            (async () => {
              await webhook.send(message);
            })().catch((e) => {
                console.log(e);
            });
        }
    });
    
    // 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 função do Cloud Run

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

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=nodejs24 \
  --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 Cloud Run functions no Google Cloud console.

    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. No Google Cloud console, 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 Desligar para excluir o projeto.

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 Google Cloud console.

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

  3. Exclua o aplicativo Slack.

A seguir