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.
Objetivos
- Implemente uma aplicação Slack para receber notificações externas do GKE.
- Escreva uma função do Cloud Run que envie notificações do Pub/Sub para o Slack.
Custos
Neste documento, usa os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custos com base na sua utilização projetada,
use a calculadora de preços.
Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.
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.
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
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
-
Depois de inicializar a CLI gcloud, atualize-a e instale os componentes necessários:
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.
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
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. -
Install the Google Cloud CLI.
-
Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro de iniciar sessão na CLI gcloud com a sua identidade federada.
-
Para inicializar a CLI gcloud, execute o seguinte comando:
gcloud init
-
Depois de inicializar a CLI gcloud, atualize-a e instale os componentes necessários:
gcloud components update gcloud components install alpha beta
- Ative as notificações do cluster do GKE.
-
Programador de Cloud Functions (
roles/cloudfunctions.developer
) -
Administrador do Kubernetes Engine (
roles/container.admin
) 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.
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 tipos 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.
TOPIC_NAME
: o nome do tópico do Pub/Sub que criou quando ativou as notificações de clusters.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.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.
- 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.
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.
- 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.
Elimine a função do Cloud Run implementada neste tutorial:
gcloud functions delete slackNotifier
Também pode eliminar funções do Cloud Run a partir da Google Cloud consola.
- Saiba mais sobre os tipos de notificações de clusters.
- Consulte a documentação sobre as funções do Cloud Run e o Pub/Sub.
- Saiba como criar apps do Slack.
Funções necessárias
Para receber as autorizações de que precisa para configurar as notificações do Slack para notificações de clusters, peça ao seu administrador que lhe conceda as seguintes funções da IAM no seu projeto:
Para garantir que a conta de serviço predefinida do Compute Engine tem as autorizações necessárias para invocar a função do Cloud Run,
peça ao seu administrador para conceder à conta de serviço predefinida do Compute Engine a função de IAM
Invocador das Cloud Functions (roles/cloudfunctions.invoker
)
no seu projeto.
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
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.
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:
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
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:
Se usou um cluster padrão, valide as notificações da seguinte forma:
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
Limpar
Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.