במדריך הזה מוסבר איך להגדיר שירותי העברת הודעות של צד שלישי כדי לקבל התראות על אשכולות של 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.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
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.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
התקינו את ה-CLI של Google Cloud.
-
אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.
-
כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:
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.
-
- בתיבת הדו-שיח יצירת אפליקציה, לוחצים על מאפס.
- מציינים שם אפליקציה ובוחרים את סביבת העבודה שלכם ב-Slack.
- לחצו על Create App.
- בקטע הוספת תכונות ופונקציונליות, לוחצים על Incoming Webhooks (הודעות webhook נכנסות).
- לוחצים על המתג הפעלת וווב-הוקים לשיחות נכנסות.
- בקטע Webhook URLs for Your Workspace (כתובות URL של Webhook לסביבת העבודה), לוחצים על Add New Webhook to Workspace (הוספת Webhook חדש לסביבת העבודה).
- בדף ההרשאה שנפתח, בוחרים ערוץ לקבלת התראות.
- לוחצים על אישור.
- Webhook לאפליקציית Slack מוצג בקטע Webhook URLs for Your Workspace (כתובות webhook לאזור העבודה). שומרים את כתובת ה-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 שמציין את כתובת ה-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"
מחליפים את מה שכתוב בשדות הבאים:
-
TOPIC_NAME: השם של נושא ה-Pub/Sub שיצרתם כשהפעלתם התראות על אשכולות. -
REGION: האזור ב-Compute Engine שבו הפונקציה פועלת. -
WEBHOOK_URL: כתובת ה-Webhook URL שנוצרה לאפליקציית 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, מבצעים את הפעולות הבאות:
- ברשימה הנפתחת סביבה, בוחרים באפשרות דור שני.
- בשדה Function name (שם הפונקציה), מציינים slackNotifier.
- בקטע אזור, מציינים אזור של Compute Engine.
- בקטע Trigger, לוחצים על ADD EVENTARC TRIGGER.
- בחלון שנפתח, בודקים שברשימה הנפתחת Event provider נבחרה האפשרות Cloud Pub/Sub.
- בוחרים את נושא ה-Pub/Sub שיצרתם כשהפעלתם התראות על אשכולות.
- בקטע אזור, מציינים את אותו אזור של Compute Engine כמו בפונקציה.
- לוחצים על שמירת הטריגר.
- מרחיבים את הקטע Runtime, build, connections and security settings (הגדרות של זמן ריצה, build, חיבורים ואבטחה).
- בקטע משתני סביבת זמן ריצה, לוחצים על הוספת משתנה.
- בשדה Name (שם), מציינים SLACK_WEBHOOK.
- בקטע Value (ערך), מציינים את כתובת ה-URL של ה-Webhook הפנימי שנוצר בקטע יצירת אפליקציית Slack.
- לוחצים על הבא.
בדף Code, מבצעים את הפעולות הבאות:
- בתפריט הנפתח Runtime (סביבת זמן ריצה), בוחרים באפשרות Node.js 24.
- בקטע Entry point, מציינים slackNotifier.
- בחלונית הניווט, בוחרים באפשרות index.js ומחליפים את הקוד בקוד לדוגמה שמופיע בקטע כתיבת פונקציית Cloud.
- בחלונית הניווט, בוחרים באפשרות package.json ומחליפים את הקוד בקוד לדוגמה שמופיע במאמר כתיבת פונקציית Cloud.
- לוחצים על פריסה.
אחרי שתסיימו את הפריסה של פונקציית Cloud Run, תקבלו התראה ב-Slack בכל פעם ש-GKE ישלח התראה לגבי אשכול.
אימות ההתראות ב-Slack
אם השתמשתם באשכול Autopilot, תוכלו לאמת את ההתראות באופן הבא:
- התחלת שדרוג של מישור הבקרה
- ממתינים ש-GKE ישדרג אוטומטית את הצמתים לגרסה החדשה. הזמן שנדרש עשוי להשתנות בהתאם לחלונות התחזוקה וההחרגות שהוגדרו.
- אחרי ש-GKE משדרג את הצמתים, בודקים אם יש הודעה ב-Slack.
אם השתמשתם באשכול רגיל, מאמתים את ההתראות באופן הבא:
שדרוג מאגר צמתים ספציפי לגרסה חדשה אם לא רוצים לשנות את גרסת 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