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 Functions adalah solusi Compute Engine ringan untuk membuat fungsi mandiri dan tujuan tunggal yang merespons peristiwa Google Cloud, 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 Cloud Functions dan Pub/Sub untuk mengirim notifikasi tentang peristiwa cluster GKE ke Slack.

Tujuan

  • Deploy aplikasi Slack untuk menerima notifikasi eksternal dari GKE.
  • Tulis Cloud Function yang mengirimkan notifikasi Pub/Sub ke Slack.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

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

    Enable the APIs

  5. Menginstal Google Cloud CLI.
  6. Untuk initialize gcloud CLI, jalankan perintah berikut:

    gcloud init
  7. Update dan instal komponen gcloud:
    gcloud components update
    gcloud components install alpha beta
  8. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  9. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

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

    Enable the APIs

  11. Menginstal Google Cloud CLI.
  12. Untuk initialize gcloud CLI, jalankan perintah berikut:

    gcloud init
  13. Update dan instal komponen gcloud:
    gcloud components update
    gcloud components install alpha beta
  14. Aktifkan notifikasi cluster GKE.

Peran yang diperlukan

Untuk mendapatkan izin yang diperlukan guna menyiapkan notifikasi Slack untuk notifikasi cluster, minta administrator untuk memberi Anda peran IAM berikut pada project Anda:

Guna memastikan bahwa akun layanan default Compute Engine memiliki izin yang diperlukan untuk memanggil Cloud Function, minta administrator Anda untuk memberikan peran IAM Cloud Functions Invoker (roles/cloudfunctions.invoker) pada project ke akun layanan default Compute Engine.

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 Cloud Function

Saat GKE memublikasikan notifikasi cluster ke topik Pub/Sub, peristiwa tersebut akan memicu Cloud Functions 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 Cloud Functions yang menentukan URL webhook yang dibuat untuk aplikasi Slack Anda. Anda menentukan variabel lingkungan saat men-deploy fungsi.

    Webhook memproses dan menerima pesan dari Cloud Functions. 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 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.

Men-deploy Cloud Function

Anda dapat men-deploy Cloud Function 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 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 Cloud Function 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

Pembersihan

Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.

Menghapus project

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus resource satu per satu

  1. Hapus Cloud Function yang Anda deploy dalam tutorial ini:

    gcloud functions delete slackNotifier
    

    Anda juga dapat menghapus Cloud Functions dari Konsol Google Cloud.

  2. Hapus topik Pub/Sub.

  3. Hapus aplikasi Slack.

Langkah selanjutnya