הגדרת התראות על אשכולות לשירותים של צד שלישי

במדריך הזה מוסבר איך להגדיר שירותי העברת הודעות של צד שלישי כדי לקבל התראות על אשכולות של Google Kubernetes Engine ‏ (GKE).

שירותים כמו Slack מציעים webhooks נכנסים, דרך פשוטה לפרסום הודעות מאפליקציות ב-Slack. פונקציות Cloud Run הן פתרון קל משקל של Compute Engine ליצירת פונקציות עצמאיות למטרה יחידה שמגיבות לGoogle Cloud אירועים, כמו התראות על אשכולות, בלי צורך לנהל שרת או סביבת זמן ריצה. כש-GKE שולח התראה על אשכול באמצעות Pub/Sub, טריגר מגיב על ידי ביצוע פעולה, כמו שליחת התראה ב-Slack.

יש הרבה שירותים של צד שלישי שכוללים פונקציונליות של העברת הודעות בין אפליקציות, כמו IFTTT. אפשר להשתמש במדריך הזה כתבנית לחיבור לשירותים האלה.

במדריך הזה נשתמש בפונקציות Cloud Run וב-Pub/Sub כדי לשלוח התראות על אירועים של אשכול GKE ל-Slack.

מטרות

  • פריסת אפליקציית Slack כדי לקבל התראות חיצוניות מ-GKE.
  • כתיבה של פונקציית Cloud Run ששולחת התראות Pub/Sub ל-Slack.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.

לפני שמתחילים

  1. נכנסים לחשבון Google Cloud . אם אתם משתמשים חדשים ב- Google Cloud, צרו חשבון כדי שתוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
  2. 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 role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. התקינו את ה-CLI של Google Cloud.

  6. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  7. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  8. אחרי שתאתחלו את ה-CLI של gcloud, עדכנו אותו והתקינו את הרכיבים הנדרשים:

    gcloud components update
    gcloud components install alpha beta
  9. 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 role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  10. Verify that billing is enabled for your Google Cloud project.

  11. 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  12. התקינו את ה-CLI של Google Cloud.

  13. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  14. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  15. אחרי שתאתחלו את ה-CLI של gcloud, עדכנו אותו והתקינו את הרכיבים הנדרשים:

    gcloud components update
    gcloud components install alpha beta
  16. הפעלת התראות על אשכול GKE

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות להגדרת התראות ב-Slack לגבי אשכולות, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:

כדי לוודא שלחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine יש את ההרשאות שנדרשות להפעלת הפונקציה של Cloud Run, צריך לבקש מהאדמין להקצות לחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine את תפקיד ה-IAM מפעיל של Cloud Functions (roles/cloudfunctions.invoker) בפרויקט.

התראות ב-Slack

כדי להגדיר התראות ב-Slack, צריך ליצור אפליקציית Slack, להפעיל את התכונה Incoming Webhooks באפליקציה ולהתקין את האפליקציה בסביבת עבודה של Slack.

יצירת אפליקציית Slack

  1. הצטרפות למרחב עבודה ב-Slack, באמצעות הרשמה עם כתובת האימייל או באמצעות הזמנה שנשלחה על ידי אדמין של מרחב העבודה.

  2. נכנסים ל-Slack באמצעות שם סביבת העבודה ופרטי הכניסה לחשבון Slack.

  3. יצירת אפליקציית Slack חדשה

    1. בתיבת הדו-שיח יצירת אפליקציה, לוחצים על מאפס.
    2. מציינים שם אפליקציה ובוחרים את סביבת העבודה שלכם ב-Slack.
    3. לחצו על Create App.
    4. בקטע הוספת תכונות ופונקציונליות, לוחצים על Incoming Webhooks (הודעות webhook נכנסות).
    5. לוחצים על המתג הפעלת וווב-הוקים לשיחות נכנסות.
    6. בקטע Webhook URLs for Your Workspace (כתובות URL של Webhook לסביבת העבודה), לוחצים על Add New Webhook to Workspace (הוספת Webhook חדש לסביבת העבודה).
    7. בדף ההרשאה שנפתח, בוחרים ערוץ לקבלת התראות.
    8. לוחצים על אישור.
    9. ‫Webhook לאפליקציית Slack מוצג בקטע Webhook URLs for Your Workspace (כתובות webhook לאזור העבודה). שומרים את כתובת ה-URL למועד מאוחר יותר.

כתיבת פונקציית Cloud Run

כש-GKE מפרסם התראה על אשכול לנושא Pub/Sub, האירוע מפעיל פונקציות של Cloud Run כדי לשלוח התראה ב-Slack.

  1. יוצרים ספרייה חדשה בשם gke_slack ועוברים אליה:

    mkdir ~/gke_slack && cd $_
    
  2. יוצרים את הקבצים הבאים בספרייה 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);
            (async () => {
              await webhook.send(message);
            })().catch((e) => {
                console.log(e);
            });
        }
    });
    
    // 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 הוא משתנה סביבה של פונקציות Cloud Run שמציין את כתובת ה-URL של ה-webhook שנוצרה לאפליקציית Slack. מגדירים את משתנה הסביבה כשפורסים את הפונקציה.

    ה-webhook מאזין להודעות מפונקציות Cloud Run ומקבל אותן. כש-GKE שולח התראה על אשכול ל-Pub/Sub (האירוע), הפונקציה שולחת הודעה (הטריגר) לכתובת ה-URL של ה-webhook, שבתורה שולחת את ההודעה לסביבת העבודה המוגדרת ב-Slack.

    אפשר להרחיב את ההודעה בפונקציה createSlackMessage כדי לכלול הרבה יותר, כולל עיצוב טקסט ותמונות. הפונקציה isAllowedType מספקת סינון בסיסי של התראות לפי סוג כתובת ה-URL. אפשר לציין אילו סוגים של כתובות URL יהיו מותרים ב-allowedTypeURLs. לא צריך להשתמש בפונקציה הזו אם כבר סיננתם את ההתראות ב-GKE או במינוי שלכם ל-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 מציינים את המאפיינים הבאים של התוכנית:

    • שם, גרסה ותיאור
    • קובצי זמן ריצה ראשיים
    • תלויות

    אפשר להוסיף עוד תלויות, דרישות ומידע אחר לפי הצורך.

עכשיו הקבצים index.js ו-package.json אמורים להופיע בספרייה gke_slack.

פריסת הפונקציה של Cloud Run

אפשר לפרוס את הפונקציה של Cloud Run באמצעות Google Cloud CLI או באמצעות מסוף Google Cloud .

gcloud

כדי לפרוס את הפונקציה, מריצים את הפקודה הבאה בספרייה gke_slack:

gcloud functions deploy slackNotifier \
  --gen2 \
  --trigger-topic=TOPIC_NAME \
  --runtime=nodejs24 \
  --entry-point=slackNotifier \
  --region=REGION \
  --source=. \
  --set-env-vars="SLACK_WEBHOOK=WEBHOOK_URL"

מחליפים את מה שכתוב בשדות הבאים:

הפלט אמור להיראות כך:

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: nodejs24
serviceAccountEmail: PROJECT_ID@appspot.gserviceaccount.com
sourceUploadUrl: https://storage.googleapis.com/…
status: ACTIVE
timeout: 60s
updateTime: 'YYYY-MM-DDThh:mm:ssZ'
versionId: '1'

המסוף

  1. נכנסים לדף Cloud Run functions במסוף Google Cloud .

    כניסה לדף Cloud Functions

  2. לוחצים על Create function (יצירת פונקציה).

  3. בדף Configuration, מבצעים את הפעולות הבאות:

    1. ברשימה הנפתחת סביבה, בוחרים באפשרות דור שני.
    2. בשדה Function name (שם הפונקציה), מציינים slackNotifier.
    3. בקטע אזור, מציינים אזור של Compute Engine.
    4. בקטע Trigger, לוחצים על ADD EVENTARC TRIGGER.
    5. בחלון שנפתח, בודקים שברשימה הנפתחת Event provider נבחרה האפשרות Cloud Pub/Sub.
    6. בוחרים את נושא ה-Pub/Sub שיצרתם כשהפעלתם התראות על אשכולות.
    7. בקטע אזור, מציינים את אותו אזור של Compute Engine כמו בפונקציה.
    8. לוחצים על שמירת הטריגר.
    9. מרחיבים את הקטע Runtime, build, connections and security settings (הגדרות של זמן ריצה, build, חיבורים ואבטחה).
    10. בקטע משתני סביבת זמן ריצה, לוחצים על הוספת משתנה.
    11. בשדה Name (שם), מציינים SLACK_WEBHOOK.
    12. בקטע Value (ערך), מציינים את כתובת ה-URL של ה-Webhook הפנימי שנוצר בקטע יצירת אפליקציית Slack.
    13. לוחצים על הבא.
  4. בדף Code, מבצעים את הפעולות הבאות:

    1. בתפריט הנפתח Runtime (סביבת זמן ריצה), בוחרים באפשרות Node.js 24.
    2. בקטע Entry point, מציינים slackNotifier.
    3. בחלונית הניווט, בוחרים באפשרות index.js ומחליפים את הקוד בקוד לדוגמה שמופיע בקטע כתיבת פונקציית Cloud.
    4. בחלונית הניווט, בוחרים באפשרות package.json ומחליפים את הקוד בקוד לדוגמה שמופיע במאמר כתיבת פונקציית Cloud.
    5. לוחצים על פריסה.

אחרי שתסיימו את הפריסה של פונקציית Cloud Run, תקבלו התראה ב-Slack בכל פעם ש-GKE ישלח התראה לגבי אשכול.

אימות ההתראות ב-Slack

אם השתמשתם באשכול Autopilot, תוכלו לאמת את ההתראות באופן הבא:

  1. התחלת שדרוג של מישור הבקרה
  2. ממתינים ש-GKE ישדרג אוטומטית את הצמתים לגרסה החדשה. הזמן שנדרש עשוי להשתנות בהתאם לחלונות התחזוקה וההחרגות שהוגדרו.
  3. אחרי ש-GKE משדרג את הצמתים, בודקים אם יש הודעה ב-Slack.

אם השתמשתם באשכול רגיל, מאמתים את ההתראות באופן הבא:

  1. שדרוג מאגר צמתים ספציפי לגרסה חדשה אם לא רוצים לשנות את גרסת GKE בצמתים, אפשר לשדרג לאותה גרסה שמותקנת כרגע בצמתים.

  2. אחרי ש-GKE משדרג את הצמתים, צריך לבדוק אם יש הודעה ב-Slack.

ההתראה ב-Slack נראית כך:

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

הסרת המשאבים

כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.

מחיקת הפרויקט

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

מחיקת משאבים בודדים

  1. מוחקים את פונקציית Cloud Run שפרסתם במדריך הזה:

    gcloud functions delete slackNotifier
    

    אפשר גם למחוק פונקציות Cloud Run ממסוףGoogle Cloud .

  2. מחיקת נושא Pub/Sub.

  3. מחיקת אפליקציית Slack.

המאמרים הבאים