Este tutorial mostra como configurar serviços de mensagens de terceiros para receber notificações de clusters do Google Kubernetes Engine (GKE).
Serviços como o Slack oferecem webhooks recebidos, uma forma simples de publicar mensagens de apps no Slack. As funções do Cloud Run são uma solução do Compute Engine leve para criar funções autónomas de finalidade única que respondem a Google Cloud eventos, como notificações de clusters, sem ter de gerir um servidor ou um ambiente de tempo de execução. Quando o GKE envia uma notificação de cluster através do Pub/Sub, um acionador responde executando uma ação, como o envio de uma notificação do Slack.
Existem muitos serviços de terceiros criados com a funcionalidade de mensagens entre aplicações, como o IFTTT. Pode usar este tutorial como um modelo para estabelecer ligação a estes serviços.
Neste tutorial, vai usar funções do Cloud Run e o Pub/Sub para enviar notificações sobre eventos do cluster do GKE para o Slack.
Notificações do Slack
Para configurar as notificações do Slack, tem de criar uma aplicação do Slack, ativar os Webhooks de entrada para a aplicação e instalar a aplicação num espaço de trabalho do Slack.
Crie a aplicação Slack
Junte-se a um espaço de trabalho do Slack, registando-se com o seu email ou usando um convite enviado por um administrador do Workspace.
Inicie sessão no Slack com o nome do espaço de trabalho e as credenciais da sua conta do Slack.
-
- Na caixa de diálogo Criar uma app, clique em Do zero.
- Especifique um Nome da app e escolha o seu espaço de trabalho do Slack.
- Clique em Criar app.
- Em Adicionar funcionalidades, clique em Webhooks recebidos.
- Clique no botão ativar/desativar Ativar webhooks recebidos.
- Na secção URLs de webhook para o seu espaço de trabalho, clique em Adicionar novo webhook ao espaço de trabalho.
- Na página de autorização apresentada, selecione um canal para receber notificações.
- Clique em Permitir.
- É apresentado um webhook para a sua aplicação Slack na secção URLs de webhook para o seu espaço de trabalho. Guarde o URL para mais tarde.
Escreva a função do Cloud Run
Quando o GKE publica uma notificação de cluster num tópico do Pub/Sub, o evento aciona funções do Cloud Run para enviar uma notificação do Slack.
Crie um novo diretório com o nome
gke_slack
e mude o diretório para este:mkdir ~/gke_slack && cd $_
Crie os seguintes ficheiros 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 das funções do Cloud Run que especifica o URL do webhook criado para a sua aplicação Slack. Define a variável de ambiente quando implementa a função.O webhook ouve e recebe mensagens de funções do Cloud Run. Quando o GKE envia uma notificação de cluster para o Pub/Sub (o evento), a função envia uma mensagem (o acionador) para o URL do webhook, que, por sua vez, envia a mensagem para o espaço de trabalho do Slack configurado.
Pode expandir a mensagem na função
createSlackMessage
para incluir muito mais, incluindo formatação de texto e imagens. A funçãoisAllowedType
é fornecida para permitir a filtragem básica de notificações pelo URL do tipo. Pode especificar que tipo de URLs permitir emallowedTypeURLs
. Esta função não é necessária se já tiver filtrado as notificações, no GKE ou na sua subscrição 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" } }
O
package.json
descreve os seguintes atributos do programa:- Nome, versão e descrição
- Ficheiros de tempo de execução principais
- Dependências
Pode adicionar mais dependências, requisitos e outras informações, conforme necessário.
Agora, deve ter os ficheiros index.js
e package.json
no diretório gke_slack
.
Implemente a função do Cloud Run
Pode implementar a função do Cloud Run através da CLI gcloud ou da Google Cloud consola.
gcloud
Para implementar 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 o seguinte:
TOPIC_NAME
: o nome do tópico do Pub/Sub que criou quando ativou as notificações de cluster.REGION
: a região do Compute Engine para a função.WEBHOOK_URL
: o URL do webhook criado para a sua aplicação Slack em Crie a aplicação Slack.
O resultado é semelhante ao seguinte:
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'
Consola
Aceda à página Funções do Cloud Run na Google Cloud consola.
Clique em
Criar função.Na página Configuração, siga estes passos:
- Na lista pendente Ambiente, selecione 2.ª geração.
- Para Nome da função, especifique slackNotifier.
- Para Região, especifique uma região do Compute Engine.
- Na secção Acionador, clique em ADICIONAR ACIONADOR DO EVENTARC.
- Na janela aberta, verifique se na lista pendente Fornecedor de eventos, está selecionado Cloud Pub/Sub.
- Selecione o tópico do Pub/Sub que criou quando ativou as notificações de clusters.
- Para Região, especifique a mesma região do Compute Engine que para a função.
- Clique em GUARDAR ACIONADOR.
- Expanda a secção Definições de tempo de execução, compilação, ligações e segurança.
- Em Variáveis de ambiente de tempo de execução, clique em Adicionar variável.
- Para Nome, especifique SLACK_WEBHOOK.
- Em Valor, especifique o URL do webhook interno criado em Crie a aplicação Slack.
- Clicar em Seguinte.
Na página Código, siga estes passos:
- Selecione Node.js 14 na lista pendente Runtime.
- Para Entry point, especifique slackNotifier.
- No painel de navegação, selecione index.js e substitua o código pelo código de exemplo em Escreva a função do Google Cloud.
- No painel de navegação, selecione package.json e substitua o código pelo código de exemplo em Escreva a função do Cloud.
- Clique em Implementar.
Depois de concluir a implementação da função do Cloud Run, vai receber uma notificação do Slack sempre que o GKE enviar uma notificação do cluster.
Valide as notificações do Slack
Se usou um cluster do Autopilot, valide as notificações da seguinte forma:
- Inicie uma atualização do plano de controlo.
- Aguarde que o GKE atualize automaticamente os seus nós para a nova versão. O tempo necessário pode variar com base nas janelas de manutenção configuradas e nas exclusões.
- Depois de o GKE atualizar os seus nós, verifique se recebeu uma mensagem no Slack.
Se usou um cluster padrão, valide as notificações da seguinte forma:
Atualize um node pool específico para uma nova versão. Se não quiser alterar a versão do GKE nos seus nós, pode atualizar para a mesma versão atualmente nos nós.
Depois de o GKE atualizar os seus nós, verifique se recebeu uma mensagem no Slack.
A notificação do Slack é semelhante à seguinte:
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