Configurer des notifications de cluster pour les services tiers


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. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

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

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub APIs.

    Enable the APIs

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. Update and install gcloud components:

    gcloud components update
    gcloud components install alpha beta
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Make sure that billing is enabled for your Google Cloud project.

  10. Enable the GKE, Cloud Functions, Cloud Build, Eventarc and Pub/Sub APIs.

    Enable the APIs

  11. Install the Google Cloud CLI.
  12. To initialize the gcloud CLI, run the following command:

    gcloud init
  13. Update and install gcloud components:

    gcloud components update
    gcloud components install alpha beta
  14. 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 :

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

  1. 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.

  2. Connectez-vous à Slack à l'aide du nom de votre espace de travail et des identifiants de votre compte Slack.

  3. Créer une application Slack

    1. Dans la boîte de dialogue Créer une application, cliquez sur À partir de zéro.
    2. Spécifiez un Nom d'application et choisissez votre espace de travail Slack.
    3. Cliquez sur Create App (Créer l'application).
    4. Sous Ajouter des fonctionnalités, cliquez sur Webhooks entrants.
    5. Cliquez sur le bouton Activer les webhooks entrants.
    6. Dans la section URL de webhook pour votre espace de travail, cliquez sur Ajouter un webhook à l'espace de travail.
    7. Sur la page qui s'ouvre, sélectionnez un canal pour recevoir les notifications.
    8. Cliquez sur Autoriser.
    9. 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.

  1. Créez un répertoire nommé gke_slack et modifiez les sous-répertoires comme suit :

    mkdir ~/gke_slack && cd $_
    
  2. 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 fonction isAllowedType 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 dans allowedTypeURLs. 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 :

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

  1. Accédez à la page de présentation de Cloud Functions dans la console Google Cloud.

    Accéder à Cloud Functions

  2. Cliquez sur Créer une fonction.

  3. Sur la page Configuration, procédez comme suit :

    1. Dans la liste déroulante Environnement, sélectionnez 2e génération.
    2. Pour Nom de la fonction, spécifiez slackNotifier.
    3. Dans le champ Région, spécifiez une région Compute Engine.
    4. Dans la section Déclencheur, cliquez sur AJOUTER UN DÉCLENCHEUR EVENTARC.
    5. Dans la fenêtre ouverte, choisissez le Fournisseur d'événements dans la liste déroulante en sélectionnant Cloud Pub/Sub.
    6. Sélectionnez le sujet Pub/Sub que vous avez créé lors de l'activation des notifications de cluster.
    7. Pour Région, spécifiez la même région Compute Engine que celle de la fonction.
    8. Cliquez sur ENREGISTRER LE DÉCLENCHEUR.
    9. Développez la section Paramètres d'exécution, de compilation, de connexion et de sécurité.
    10. Sous Variables d'environnement, cliquez sur Ajouter une variable.
    11. Dans le champ Nom, spécifiez SLACK_WEBHOOK.
    12. Dans le champ Valeur, spécifiez l'URL du webhook interne créé à la section Créer l'application Slack.
    13. Cliquez sur Next (Suivant).
  4. Sur la page Code, procédez comme suit :

    1. Sélectionnez Node.js 14 dans la liste déroulante Environnement d'exécution.
    2. Pour le Point d'entrée, spécifiez slackNotifier.
    3. Dans le volet de navigation, sélectionnez index.js et remplacez le code par l'exemple de code dans Écrire la fonction Cloud.
    4. Dans le volet de navigation, sélectionnez package.json et remplacez le code par l'exemple de code dans Écrire la fonction Cloud.
    5. 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 :

  1. Démarrez une mise à niveau du plan de contrôle.
  2. 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.
  3. 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 :

  1. 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.

  2. 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

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Supprimer des ressources individuelles

  1. 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.

  2. Supprimez le sujet Pub/Sub.

  3. Supprimez l'application Slack.

Étapes suivantes