במדריך הזה נסביר איך להגדיר שירותי העברת הודעות של צד שלישי כדי לקבל התראות על אשכולות של 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 . אנחנו ממליצים למשתמשים חדשים ב- Google Cloud ליצור חשבון כדי שיוכלו להעריך את הביצועים של המוצרים שלנו בתרחישים מהעולם האמיתי. לקוחות חדשים מקבלים בחינם גם קרדיט בשווי 300$ להרצה, לבדיקה ולפריסה של עומסי העבודה.
-
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the GKE, Cloud Run functions, Cloud Build, Eventarc and Pub/Sub APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init -
אחרי שתאתחלו את ה-CLI של gcloud, עדכנו אותו והתקינו את הרכיבים הנדרשים:
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.
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 theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the GKE, Cloud Run functions, Cloud Build, Eventarc and Pub/Sub APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
Install the Google Cloud CLI.
-
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init -
אחרי שתאתחלו את ה-CLI של gcloud, עדכנו אותו והתקינו את הרכיבים הנדרשים:
gcloud components update gcloud components install alpha beta
- מפעילים התראות על אשכול GKE.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות להגדרת התראות ב-Slack לגבי אשכולות, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
- Cloud Functions Developer (
roles/cloudfunctions.developer) - אדמין ב-Kubernetes Engine (
roles/container.admin)
כדי לוודא שלחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine יש את ההרשאות שנדרשות להפעלת פונקציית Cloud Run, צריך לבקש מהאדמין להקצות לחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine את תפקיד ה-IAM מפעיל של Cloud Functions (roles/cloudfunctions.invoker) בפרויקט.
התראות ב-Slack
כדי להגדיר התראות ב-Slack, צריך ליצור אפליקציית Slack, להפעיל את Incoming Webhooks באפליקציה ולהתקין את האפליקציה בסביבת עבודה ב-Slack.
יצירת אפליקציית Slack
מצטרפים לסביבת עבודה ב-Slack, באמצעות הרשמה עם כתובת האימייל או באמצעות הזמנה שנשלחה על ידי אדמין בסביבת העבודה.
נכנסים ל-Slack באמצעות שם סביבת העבודה ופרטי הכניסה לחשבון Slack.
-
- בתיבת הדו-שיח Create an app, לוחצים על From scratch.
- מציינים שם לאפליקציה ובוחרים את סביבת העבודה שלכם ב-Slack.
- לחצו על Create App.
- בקטע Add features and functionality, לוחצים על Incoming Webhooks.
- לוחצים על המתג הפעלת Webhooks לשיחות נכנסות.
- בקטע Webhook URLs for Your Workspace (כתובות URL של Webhook לסביבת העבודה), לוחצים על Add New Webhook to Workspace (הוספת Webhook חדש לסביבת העבודה).
- בדף ההרשאה שנפתח, בוחרים ערוץ לקבלת התראות.
- לוחצים על אישור.
- בקטע Webhook URLs for Your Workspace מופיע ה-webhook של האפליקציה ב-Slack. שומרים את כתובת ה-URL למועד מאוחר יותר.
כתיבת פונקציית Cloud Run
כש-GKE מפרסם התראה על אשכול בנושא Pub/Sub, האירוע מפעיל פונקציות Cloud Run כדי לשלוח התראה ב-Slack.
יוצרים ספרייה חדשה בשם
gke_slackועוברים אליה:mkdir ~/gke_slack && cd $_יוצרים את הקבצים הבאים בספרייה 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 שמציין את כתובת ה-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"
מחליפים את מה שכתוב בשדות הבאים:
-
TOPIC_NAME: השם של נושא Pub/Sub שיצרתם כשהפעלתם את ההתראות באשכול. -
REGION: האזור ב-Compute Engine שבו הפונקציה פועלת. -
WEBHOOK_URL: כתובת ה-URL של ה-webhook שנוצרה לאפליקציית Slack שלכם בקטע יצירת אפליקציית Slack.
הפלט אמור להיראות כך:
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'
המסוף
נכנסים לדף Cloud Run functions במסוף Google Cloud .
לוחצים על Create function (יצירת פונקציה).
בדף Configuration, מבצעים את הפעולות הבאות:
- בתפריט הנפתח סביבה, בוחרים באפשרות דור שני.
- בשם הפונקציה מציינים slackNotifier.
- בקטע אזור, מציינים אזור של Compute Engine.
- בקטע Trigger, לוחצים על ADD EVENTARC TRIGGER.
- בחלון שנפתח, בודקים שברשימה הנפתחת Event provider נבחרה האפשרות Cloud Pub/Sub.
- בוחרים את נושא ה-Pub/Sub שיצרתם כשהפעלתם התראות על אשכולות.
- בקטע אזור, מציינים את אותו אזור של Compute Engine כמו בפונקציה.
- לוחצים על SAVE TRIGGER.
- מרחיבים את הקטע Runtime, build, connections and security settings (הגדרות של זמן ריצה, build, חיבורים ואבטחה).
- בקטע משתני סביבת זמן ריצה, לוחצים על הוספת משתנה.
- בשם, מציינים SLACK_WEBHOOK.
- בשדה Value (ערך), מציינים את כתובת ה-URL של ה-Webhook הפנימי שנוצר בשלב יצירת אפליקציית Slack.
- לוחצים על הבא.
בדף Code, מבצעים את השלבים הבאים:
- בתפריט הנפתח Runtime, בוחרים באפשרות Node.js 24.
- בשדה Entry point, מציינים את slackNotifier.
- בחלונית הניווט, בוחרים באפשרות index.js ומחליפים את הקוד בקוד לדוגמה שבקטע כתיבת פונקציה של Cloud Functions.
- בחלונית הניווט, בוחרים באפשרות package.json ומחליפים את הקוד בקוד לדוגמה שבקטע כתיבת הפונקציה של Cloud Functions.
- לוחצים על פריסה.
אחרי שתסיימו את הפריסה של פונקציית Cloud Run, תקבלו התראה ב-Slack בכל פעם ש-GKE ישלח התראה לגבי אשכול.
אימות ההתראות ב-Slack
אם השתמשתם באשכול Autopilot, אתם יכולים לאמת את ההתראות באופן הבא:
- התחלת שדרוג של מישור הבקרה
- מחכים ש-GKE ישדרג אוטומטית את הצמתים לגרסה החדשה. הזמן שנדרש עשוי להשתנות בהתאם לחלונות זמן לתחזוקה וההחרגות שהוגדרו.
- אחרי ש-GKE משדרג את הצמתים, כדאי לבדוק אם יש הודעה ב-Slack.
אם השתמשתם באשכול Standard, מאמתים את ההתראות באופן הבא:
שדרוג מאגר צמתים ספציפי לגרסה חדשה. אם אתם לא רוצים לשנות את גרסת GKE בצמתים, אתם יכולים לשדרג לאותה גרסה שמותקנת כרגע בצמתים.
אחרי ש-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 בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
מחיקת הפרויקט
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מחיקת משאבים בודדים
מוחקים את פונקציית Cloud Run שפרסתם במדריך הזה:
gcloud functions delete slackNotifierאפשר גם למחוק פונקציות Cloud Run מGoogle Cloud המסוף.
המאמרים הבאים
- מידע על סוגי ההתראות בלוח המחוונים
- כדאי לעיין במסמכי התיעוד של פונקציות Cloud Run ושל Pub/Sub.
- מידע נוסף על פיתוח אפליקציות ל-Slack