Mengonfigurasi notifikasi cluster untuk layanan pihak ketiga

Tutorial ini menunjukkan cara mengonfigurasi layanan pesan pihak ketiga untuk menerima notifikasi cluster Google Kubernetes Engine (GKE).

Layanan seperti Slack menawarkan webhook masuk, cara mudah untuk memposting pesan dari aplikasi ke Slack. Cloud Run Functions adalah solusi Compute Engine ringan untuk membuat fungsi mandiri dan tujuan tunggal yang merespons Google Cloud peristiwa, seperti notifikasi cluster, tanpa perlu mengelola lingkungan server atau runtime. Saat GKE mengirim notifikasi cluster menggunakan Pub/Sub, pemicu akan merespons dengan menjalankan tindakan, seperti mengirim notifikasi Slack.

Ada banyak layanan pihak ketiga yang dibuat dengan fungsi pesan lintas aplikasi, seperti IFTTT. Anda dapat menggunakan tutorial ini sebagai template untuk terhubung dengan layanan ini.

Dalam tutorial ini, Anda akan menggunakan fungsi Cloud Run dan Pub/Sub untuk mengirim notifikasi tentang peristiwa cluster GKE ke Slack.

Notifikasi Slack

Untuk menyiapkan notifikasi Slack, Anda harus membuat aplikasi Slack, mengaktifkan Webhook Masuk untuk aplikasi, dan menginstal aplikasi ke ruang kerja Slack.

Membuat aplikasi Slack

  1. Bergabung ke ruang kerja Slack, dengan mendaftar menggunakan email Anda atau menggunakan undangan yang dikirim oleh Admin Workspace.

  2. Login ke Slack menggunakan nama ruang kerja dan kredensial akun Slack Anda.

  3. Buat aplikasi Slack baru

    1. Dalam dialog Create an app(Buat aplikasi), klik From scratch (Mulai dari langkah awal).
    2. Tentukan App Name dan pilih ruang kerja Slack Anda.
    3. Klik Create App.
    4. Di bagian Tambahkan fitur dan fungsi, klik Webhook Masuk.
    5. Klik tombol Aktifkan Webhook Masuk.
    6. Di bagian Webhook URLs for Your Workspace, klik Add New Webhook to Workspace .
    7. Di halaman otorisasi yang terbuka, pilih saluran yang akan menerima notifikasi.
    8. Klik Izinkan.
    9. Webhook untuk aplikasi Slack Anda akan ditampilkan di bagian URL Webhook untuk Ruang Kerja Anda. Simpan URL untuk nanti.

Menulis fungsi Cloud Run

Saat GKE memublikasikan notifikasi cluster ke topik Pub/Sub, peristiwa tersebut akan memicu fungsi Cloud Run untuk mengirim notifikasi Slack.

  1. Buat sebuah direktori baru bernama gke_slack dan ubah ke direktori tersebut:

    mkdir ~/gke_slack && cd $_
    
  2. Buat file berikut di direktori 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 adalah variabel lingkungan fungsi Cloud Run yang menentukan URL webhook yang dibuat untuk aplikasi Slack Anda. Anda menentukan variabel lingkungan saat men-deploy fungsi.

    Webhook memproses dan menerima pesan dari fungsi Cloud Run. Saat GKE mengirim notifikasi cluster ke Pub/Sub (peristiwa), fungsi tersebut mengirimkan pesan (pemicu) ke URL webhook, yang kemudian mengirimkan pesan ke ruang kerja Slack yang dikonfigurasi.

    Anda dapat meluaskan pesan dalam fungsi createSlackMessage untuk menyertakan lebih banyak hal, termasuk pemformatan teks dan gambar. Fungsi isAllowedType disediakan untuk mengaktifkan pemfilteran dasar notifikasi berdasarkan URL jenis. Anda dapat menentukan jenis URL yang diizinkan di allowedTypeURLs. Fungsi ini tidak diperlukan jika Anda sudah memfilter notifikasi, baik di GKE maupun di langganan 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 menjelaskan atribut program berikut:

    • Nama, versi, dan deskripsi
    • File runtime utama
    • Dependensi

    Anda dapat menambahkan dependensi, persyaratan, dan informasi lainnya sesuai kebutuhan.

Sekarang Anda seharusnya memiliki file index.js dan package.json di direktori gke_slack.

Deploy fungsi Cloud Run

Anda dapat men-deploy fungsi Cloud Run menggunakan Google Cloud CLI atau konsol Google Cloud .

gcloud

Untuk men-deploy fungsi tersebut, jalankan perintah berikut di direktori 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"

Ganti kode berikut:

Outputnya mirip dengan hal berikut ini:

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'

Konsol

  1. Buka halaman Cloud Run functions di konsol Google Cloud .

    Buka Cloud Functions

  2. Klik Create function.

  3. Di halaman Configuration, lakukan langkah-langkah berikut:

    1. Dari menu drop-down Environment, pilih 2nd gen.
    2. Untuk Function name, tentukan slackNotifier.
    3. Untuk Region, tentukan region Compute Engine.
    4. Di bagian Trigger, klik ADD EVENTARC TRIGGER.
    5. Di jendela yang terbuka, lihat menu drop-down Event provider, pilih Cloud Pub/Sub.
    6. Pilih topik Pub/Sub yang Anda buat saat mengaktifkan notifikasi cluster.
    7. Untuk Region, tentukan region Compute Engine yang sama dengan fungsi tersebut.
    8. Klik SAVE TRIGGER.
    9. Luaskan bagian Runtime, build, connections and security settings.
    10. Di bagian Runtime environment variables, klik Add Variable.
    11. Untuk Name, tetapkan SLACK_WEBHOOK.
    12. Untuk Value, tentukan URL Webhook Internal yang dibuat di Membuat aplikasi Slack.
    13. Klik Next.
  4. Di halaman Code, lakukan langkah-langkah berikut:

    1. Pilih Node.js 14 dari menu drop-down Runtime.
    2. Untuk Entry point, tetapkan slackNotifier.
    3. Di panel navigasi, pilih index.js dan ganti kode dengan kode contoh dalam artikel Write the Cloud Function.
    4. Di panel navigasi, pilih package.json dan ganti kode dengan kode contoh dalam artikel Write the Cloud Function.
    5. Klik Deploy.

Setelah deployment fungsi Cloud Run selesai, Anda akan menerima notifikasi Slack setiap kali GKE mengirimkan notifikasi cluster.

Memverifikasi notifikasi Slack

Jika Anda menggunakan cluster Autopilot, verifikasi notifikasi sebagai berikut:

  1. Memulai upgrade bidang kontrol.
  2. Tunggu hingga GKE mengupgrade node Anda secara otomatis ke versi baru. Waktu yang diperlukan dapat bervariasi berdasarkan masa pemeliharaan dan pengecualian yang dikonfigurasi.
  3. Setelah GKE mengupgrade node Anda, periksa pesan di Slack.

Jika Anda menggunakan cluster Standar, verifikasi notifikasi sebagai berikut:

  1. Upgrade node pool tertentu ke versi baru. Jika tidak ingin mengubah versi GKE pada node, Anda dapat mengupgrade ke versi yang sama dengan yang saat ini ada di node.

  2. Setelah GKE mengupgrade node Anda, periksa pesan di Slack.

Notifikasi Slack mirip dengan yang berikut ini:

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