Ce tutoriel explique comment configurer des services de messagerie tiers afin de recevoir des notifications de cluster Google Kubernetes Engine (GKE).
Des services tels que Slack proposent des webhooks entrants, un moyen simple de publier des messages depuis des applications vers Slack. Cloud Functions est une solution Compute Engine légère permettant de créer des fonctions autonomes à usage unique qui répondent aux événements Google Cloud, tels que des compilations, sans avoir à gérer de serveur ni d'environnement d'exécution. Lorsque GKE envoie une notification de cluster à l'aide de Pub/Sub, un déclencheur répond en exécutant une action, par exemple l'envoi d'une notification Slack.
Il existe de nombreux services tiers intégrés à des fonctionnalités de messagerie interapplication tels que IFTTT. Vous pouvez utiliser ce tutoriel comme modèle pour vous connecter à ces services.
Dans ce tutoriel, vous utilisez Cloud Functions et Pub/Sub pour envoyer des notifications sur les événements de cluster GKE à Slack.
Objectifs
- Déployer une application Slack pour recevoir des notifications externes de GKE
- Écrire une fonction Cloud qui envoie des notifications Pub/Sub à Slack
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût.
Une fois que vous avez terminé les tâches décrites dans ce document, vous pouvez éviter de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
- 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 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 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 - Activez les notifications de cluster GKE.
Rôles requis
Pour obtenir les autorisations nécessaires pour configurer des notifications Slack pour les notifications de cluster, demandez à votre administrateur de vous accorder les rôles IAM suivants sur votre projet :
-
Développeur Cloud Functions (
roles/cloudfunctions.developer
) -
Administrateur de Kubernetes Engine (
roles/container.admin
)
Pour vous assurer que le compte de service Compute Engine par défaut dispose des autorisations nécessaires pour appeler la fonction Cloud, demandez à votre administrateur d'accorder au compte de service Compute Engine par défaut le rôle IAM Demandeur Cloud Functions (roles/cloudfunctions.invoker
) sur le projet.
Notifications Slack
Pour configurer des notifications Slack, vous devez créer une application Slack, activer les webhooks entrants pour l'application et installer l'application dans un espace de travail Slack.
Créer l'application Slack
Rejoignez un espace de travail Slack en vous inscrivant avec votre adresse e-mail ou en utilisant une invitation envoyée par un administrateur de l'espace de travail.
Connectez-vous à Slack à l'aide du nom de votre espace de travail et des identifiants de votre compte Slack.
-
- Dans la boîte de dialogue Créer une application, cliquez sur À partir de zéro.
- Spécifiez un Nom d'application et choisissez votre espace de travail Slack.
- Cliquez sur Create App (Créer l'application).
- Sous Ajouter des fonctionnalités, cliquez sur Webhooks entrants.
- Cliquez sur le bouton Activer les webhooks entrants.
- Dans la section URL de webhook pour votre espace de travail, cliquez sur Ajouter un webhook à l'espace de travail.
- Sur la page qui s'ouvre, sélectionnez un canal pour recevoir les notifications.
- Cliquez sur Autoriser.
- Un webhook pour votre application Slack s'affiche dans la section URL de webhook pour votre espace de travail. Enregistrez l'URL pour plus tard.
Écrire la fonction Cloud
Lorsque GKE publie une notification de cluster dans un sujet Pub/Sub, l'événement déclenche Cloud Functions pour envoyer une notification Slack.
Créez un répertoire nommé
gke_slack
et modifiez les sous-répertoires comme suit :mkdir ~/gke_slack && cd $_
Créez les fichiers suivants dans le répertoire 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
est une variable d'environnement Cloud Functions qui spécifie l'URL de webhook créée pour votre application Slack. Vous définissez la variable d'environnement lorsque vous déployez la fonction.Le webhook écoute et reçoit les messages de Cloud Functions. Lorsque GKE envoie une notification de cluster à Pub/Sub (l'événement), la fonction envoie un message (le déclencheur) à l'URL de webhook, qui à son tour envoie le message à l'espace de travail Slack configuré.
Vous pouvez développer le message dans la fonction
createSlackMessage
pour inclure beaucoup plus d'éléments, y compris la mise en forme du texte et les images. La fonctionisAllowedType
est fournie pour permettre un filtrage de base des notifications en fonction de leur type d'URL. Vous pouvez spécifier les types d'URL à autoriser dansallowedTypeURLs
. Cette fonction n'est pas nécessaire si vous avez déjà filtré les notifications, que ce soit dans GKE ou dans votre abonnement 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": "6.1.0", "@google-cloud/functions-framework": "^3.0.0" } }
package.json
décrit les attributs suivants du programme :- Nom, version et description
- Le ou les fichiers d'exécution principaux
- Dépendances
Vous pouvez ajouter d'autres dépendances, exigences et autres informations si nécessaire.
Les fichiers index.js
et package.json
doivent maintenant s'afficher dans le répertoire gke_slack
.
Déployer la fonction Cloud
Vous pouvez déployer la fonction Cloud à l'aide de Google Cloud CLI ou de la console Google Cloud.
gcloud
Pour déployer la fonction, exécutez la commande suivante dans le répertoire 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"
Remplacez les éléments suivants :
TOPIC_NAME
: nom du sujet Pub/Sub que vous avez créé lors de l'activation des notifications de cluster.REGION
: région Compute Engine de la fonction.WEBHOOK_URL
: URL de webhook créée pour votre application Slack dans Créer l'application Slack.
Le résultat ressemble à ce qui suit :
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
Accédez à la page de présentation de Cloud Functions dans la console Google Cloud.
Cliquez sur
Créer une fonction.Sur la page Configuration, procédez comme suit :
- Dans la liste déroulante Environnement, sélectionnez 2e génération.
- Pour Nom de la fonction, spécifiez slackNotifier.
- Dans le champ Région, spécifiez une région Compute Engine.
- Dans la section Déclencheur, cliquez sur AJOUTER UN DÉCLENCHEUR EVENTARC.
- Dans la fenêtre ouverte, choisissez le Fournisseur d'événements dans la liste déroulante en sélectionnant Cloud Pub/Sub.
- Sélectionnez le sujet Pub/Sub que vous avez créé lors de l'activation des notifications de cluster.
- Pour Région, spécifiez la même région Compute Engine que celle de la fonction.
- Cliquez sur ENREGISTRER LE DÉCLENCHEUR.
- Développez la section Paramètres d'exécution, de compilation, de connexion et de sécurité.
- Sous Variables d'environnement, cliquez sur Ajouter une variable.
- Dans le champ Nom, spécifiez SLACK_WEBHOOK.
- Dans le champ Valeur, spécifiez l'URL du webhook interne créé à la section Créer l'application Slack.
- Cliquez sur Next (Suivant).
Sur la page Code, procédez comme suit :
- Sélectionnez Node.js 14 dans la liste déroulante Environnement d'exécution.
- Pour le Point d'entrée, spécifiez slackNotifier.
- Dans le volet de navigation, sélectionnez index.js et remplacez le code par l'exemple de code dans Écrire la fonction Cloud.
- Dans le volet de navigation, sélectionnez package.json et remplacez le code par l'exemple de code dans Écrire la fonction Cloud.
- Cliquez sur Déployer.
Une fois le déploiement de la fonction Cloud terminé, vous recevez une notification Slack chaque fois que GKE envoie une notification de cluster.
Valider les notifications Slack
Si vous avez utilisé un cluster Autopilot, vérifiez les notifications comme suit :
- Démarrez une mise à niveau du plan de contrôle.
- Attendez que GKE mette automatiquement à niveau vos nœuds vers la nouvelle version. Le temps nécessaire peut varier en fonction des exclusions et des intervalles de maintenance configurés.
- Une fois que GKE a mis à niveau vos nœuds, vérifiez si un message est présent dans Slack.
Si vous avez utilisé un cluster standard, vérifiez les notifications comme suit :
Mettez à niveau un pool de nœuds spécifique vers une nouvelle version. Si vous ne souhaitez pas modifier la version de GKE sur vos nœuds, vous pouvez effectuer une mise à niveau vers la même version actuellement installée sur les nœuds.
Une fois que GKE a mis à niveau vos nœuds, vérifiez si un message est présent dans Slack.
La notification Slack ressemble à ce qui suit :
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
Effectuer un nettoyage
Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.
Supprimer le projet
- 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.
Supprimer des ressources individuelles
Supprimez la fonction Cloud que vous avez déployée dans ce tutoriel :
gcloud functions delete slackNotifier
Vous pouvez également supprimer des fonctions Cloud Functions à partir de Google Cloud Console.
Étapes suivantes
- Découvrez les différents types de notifications de cluster.
- Consultez la documentation sur Cloud Functions et Pub/Sub.
- Découvrez comment compiler des applications Slack.