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.
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
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Cloud Run functions, Cloud Build, Eventarc and Pub/Sub APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Update and install
gcloud
components:gcloud components update
gcloud components install alpha beta -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE, Cloud Run functions, Cloud Build, Eventarc and Pub/Sub APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Update and install
gcloud
components:gcloud components update
gcloud components install alpha beta - 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:
-
Desenvolvedor do Cloud Functions (
roles/cloudfunctions.developer
) -
Administrador do Kubernetes Engine (
roles/container.admin
)
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
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.
Faça login no Slack usando o nome do seu espaço de trabalho e as credenciais da sua conta do Slack.
Criar um novo aplicativo do Slack
- Na caixa de diálogo Criar um aplicativo, clique em Do zero.
- Especifique o campo App Name e escolha seu espaço de trabalho do Slack.
- Clique em Create App.
- Em Adicionar recursos e funcionalidades, clique em Webhooks de entrada.
- Clique no botão Ativar Webhooks de entrada.
- Na seção Webhook URLs for your Workspace, clique em Add New Webhook to Workspace.
- Na página de autorização, selecione um canal para receber notificações.
- Clique em Permitir.
- 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.
Crie um novo diretório com o nome
gke_slack
e altere o diretório nele:mkdir ~/gke_slack && cd $_
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çãoisAllowedType
é fornecida para ativar a filtragem básica de notificações pelo URL de tipo. É possível especificar quais tipos de URLs permitir emallowedTypeURLs
. 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:
TOPIC_NAME
: o nome do tópico Pub/Sub que você criou ao ativar as notificações de cluster.REGION
: a região do Compute Engine para a função.WEBHOOK_URL
: o URL do webhook, criado para seu aplicativo Slack em Criar o aplicativo Slack.
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
Acesse a página do Cloud Run functions no console do Google Cloud.
Clique em
Criar função.Na página Configuração, execute as seguintes etapas:
- Na lista suspensa Ambiente, selecione 2ª geração.
- Em Nome da função, especifique slackNotifier.
- Em Região, especifique uma região do Compute Engine.
- Na seção Gatilho, clique em ADICIONAR GATILHO DO EVENTARC.
- Na janela aberta, verifique a lista suspensa Provedor de eventos e selecione Cloud Pub/Sub.
- Selecione o tópico do Pub/Sub que você criou ao ativar as notificações de cluster.
- Em Região, especifique a mesma região do Compute Engine da função.
- Clique em SALVAR GATILHO.
- Expanda a seção Ambiente de execução, criação, conexões e configurações de segurança.
- Em Variáveis de ambiente, clique em Adicionar variável.
- Em Nome, especifique SLACK_WEBHOOK.
- Em Value, especifique o URL do webhook interno criado em Criar o aplicativo Slack.
- Clique em Próxima.
Na página Código, siga estas etapas:
- Selecione Node.js 14 na lista suspensa Ambiente de execução.
- Em Ponto de entrada, especifique slackNotifier.
- 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.
- 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.
- 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:
- Inicie um upgrade do plano de controle.
- 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.
- 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:
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.
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
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Excluir recursos individuais
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.
A seguir
- Saiba mais sobre os tipos de notificações de cluster.
- Confira a documentação do Cloud Run functions e do Pub/Sub.
- Saiba mais sobre como criar aplicativos Slack.