במדריך הזה נסביר איך לפרוס מאגר עובדים של Cloud Run כדי לעבד הודעות Pub/Sub, ואיך לשנות את גודל המופעים של הצרכן באופן אוטומטי על סמך עומק התור באמצעות שינוי גודל אוטומטי של מדדים חיצוניים של Cloud Run (CREMA).
מטרות
במדריך הזה תלמדו:
- יוצרים נושא ומינוי ב-Pub/Sub כדי לדחוף הודעות לנושא.
- פריסה של מאגר עובדים ב-Cloud Run שצורכים הודעות מ-Pub/Sub.
- פורסים את שירות CREMA של קנה מידה אוטומטי כדי לשנות את גודל מאגר העובדים.
- בודקים את שירות ההתאמה האוטומטית של נפח התעבורה על ידי הפעלת סקריפט Python באופן מקומי כדי ליצור עומס.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של 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.
-
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.
מפעילים את ממשקי ה-API של Cloud Run, Parameter Manager, Artifact Registry, Pub/Sub ו-Cloud Build, אם אחד מהם עדיין לא הופעל.
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, נדרשת ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים- מתקינים ומפעילים את ה-CLI של gcloud.
- מעדכנים את הרכיבים:
gcloud components update
- במדריך הזה נעשה שימוש בכמה משתני סביבה. כדי לשפר את ניפוי הבאגים, מריצים את הפקודה הבאה כדי ליצור שגיאה כשמפנים למשתני סביבה מקומיים שלא הוגדרו:
set -u
- מגדירים את משתני ההגדרה הבאים עבור CREMA שמשמשים במדריך הזה:
מחליפים את PROJECT_ID במזהה הפרויקט. Google Cloudexport PROJECT_ID=PROJECT_ID export REGION=us-central1 export TOPIC_ID=crema-pubsub-topic export SUBSCRIPTION_ID=crema-subscription export CREMA_SA_NAME=crema-service-account export CONSUMER_SA_NAME=consumer-service-account export CONSUMER_WORKER_POOL_NAME=worker-pool-consumer export CREMA_SERVICE_NAME=my-crema-service
- מגדירים את מזהה הפרויקט באמצעות הפקודה הבאה:
gcloud config set project $PROJECT_ID
- החיובים על שירות ההרחבה של Cloud Run מבוססים על תדירות ההפעלה של ההרחבה. למידע נוסף, אפשר להשתמש במחשבון התמחור כדי להעריך את העלויות.
התפקידים הנדרשים
כדי לקבל את ההרשאות שדרושות להשלמת המדריך, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים בפרויקט:
- אדמין של Artifact Registry Repository (
roles/artifactregistry.repoAdmin) - עריכה ב-Cloud Build (
roles/cloudbuild.builds.editor) - אדמין ב-Cloud Run (
roles/run.admin) - יצירת חשבונות שירות (
roles/iam.serviceAccountCreator) - אדמין Pub/Sub (
roles/pubsub.admin) - משתמש בחשבון שירות (
roles/iam.serviceAccountUser) - צרכן שימוש בשירות (
roles/serviceusage.serviceUsageConsumer) - Parameter Manager Admin (
roles/parametermanager.admin)
להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.
יצירת נושא ומינוי ב-Pub/Sub
כדי להגדיר שינוי גודל אוטומטי של העובד, יוצרים מינוי מסוג pull לאפליקציית הצרכן לפי השלבים הבאים:
יוצרים נושא Pub/Sub שמייצג פיד של הודעות:
gcloud pubsub topics create $TOPIC_IDיוצרים מינוי שליפה כדי לצרוך הודעות מנושא Pub/Sub:
gcloud pubsub subscriptions create $SUBSCRIPTION_ID --topic=$TOPIC_ID
יצירת חשבונות שירות בהתאמה אישית
במדריך הזה נדרשים שני חשבונות שירות עם ההרשאות המינימליות הנדרשות לשימוש במשאבים שהוקצו:
חשבון שירות לצרכן: זהות של מאגר העובדים של הצרכן שמטפל בהודעות. מריצים את הפקודה הבאה כדי ליצור את חשבון השירות של הצרכן:
gcloud iam service-accounts create $CONSUMER_SA_NAME \ --display-name="Pub/Sub consumer service account"חשבון שירות CREMA: זהות לצורך שינוי גודל אוטומטי. מריצים את הפקודה הבאה כדי ליצור את חשבון השירות של CREMA:
gcloud iam service-accounts create $CREMA_SA_NAME \ --display-name="CREMA service account"
מתן הרשאות נוספות לחשבונות שירות מותאמים אישית
כדי לשנות את גודל מאגר העובדים, צריך להעניק את ההרשאות הבאות בחשבונות השירות המותאמים אישית:
נותנים לחשבון השירות של CREMA הרשאה לקרוא מ-Parameter Manager:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/parametermanager.parameterViewer"נותנים לחשבון השירות של CREMA הרשאה לשנות את גודל מאגר העובדים:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/run.developer"נותנים לחשבון השירות של CREMA את התפקיד 'משתמש בחשבון שירות':
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/iam.serviceAccountUser"נותנים לחשבון השירות של CREMA הרשאה לצפייה במדדים:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/monitoring.viewer"נותנים לחשבון השירות של CREMA הרשאה לכתוב מדדים:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/monitoring.metricWriter"נותנים לחשבון השירות של CREMA הרשאה לצפייה בהודעות Pub/Sub:
gcloud pubsub subscriptions add-iam-policy-binding $SUBSCRIPTION_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/pubsub.viewer"נותנים לחשבון השירות הפרטי הרשאה לשלוף הודעות מהמינוי:
gcloud pubsub subscriptions add-iam-policy-binding $SUBSCRIPTION_ID \ --member="serviceAccount:$CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/pubsub.subscriber"
פריסת מאגר עובדים ב-Cloud Run
כדי לפרוס מאגר עובדים שצורכים הודעות ממינויים ל-Pub/Sub, פועלים לפי השלבים הבאים:
יוצרים תיקייה בשם
consumerועוברים אליה:mkdir consumer cd consumerיוצרים קובץ בשם
worker.pyומוסיפים את הקוד הבא:import os import time from google.cloud import pubsub_v1 from concurrent.futures import TimeoutError # Configuration PROJECT_ID = os.environ.get('PROJECT_ID') SUBSCRIPTION_ID = os.environ.get('SUBSCRIPTION_ID') subscription_path = f"projects/{PROJECT_ID}/subscriptions/{SUBSCRIPTION_ID}" print(f"Worker Pool instance starting. Watching {subscription_path}...") subscriber = pubsub_v1.SubscriberClient() def callback(message): try: data = message.data.decode("utf-8") print(f"Processing job: {data}") time.sleep(5) # Simulate work print(f"Done {data}") message.ack() except Exception as e: print(f"Error processing message: {e}") message.nack() streaming_pull_future = subscriber.subscribe(subscription_path, callback=callback) print(f"Listening for messages on {subscription_path}...") # Wrap subscriber in a 'with' block to automatically call close() when done. with subscriber: try: # When `timeout` is not set, result() will block indefinitely, # unless an exception is encountered first. streaming_pull_future.result() except TimeoutError: streaming_pull_future.cancel() # Trigger the shutdown. streaming_pull_future.result() # Block until the shutdown is complete. except Exception as e: print(f"Streaming pull failed: {e}")יוצרים קובץ Dockerfile ומוסיפים את הקוד הבא:
FROM python:3.12-slim RUN pip install google-cloud-pubsub COPY worker.py . CMD ["python", "-u", "worker.py"]פורסים את מאגר העובדים של הצרכן עם 0 מופעים כדי ש-CREMA יגדיל את הקיבולת:
gcloud run worker-pools deploy $CONSUMER_WORKER_POOL_NAME \ --source . \ --region $REGION \ --service-account="$CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --instances=0 \ --set-env-vars PROJECT_ID=$PROJECT_ID,SUBSCRIPTION_ID=$SUBSCRIPTION_ID
פריסת שירות CREMA של התאמה אוטומטית לעומס
אחרי שפורסים את מאגר העובדים כדי לצרוך הודעות מ-Pub/Sub, צריך להגדיר את CREMA autoscaler כדי להקצות מופעי עובדים על סמך נפח ההודעות.
הגדרת התכונה לשינוי אוטומטי של מספר השרתים
במדריך הזה נעשה שימוש ב-Parameter Manager כדי לאחסן את קובץ התצורה של CREMA בפורמט YAML.
יוצרים פרמטר ב-Parameter Manager כדי לאחסן גרסאות של פרמטרים עבור CREMA:
PARAMETER_ID=crema-config PARAMETER_REGION=global gcloud parametermanager parameters create $PARAMETER_ID --location=$PARAMETER_REGION --parameter-format=YAMLעוברים לספריית הבסיס של הפרויקט באמצעות הפקודה הבאה:
cdבתיקיית השורש, יוצרים קובץ YAML,
my-crema-config.yaml, כדי להגדיר את התצורה של קנה המידה האוטומטי:apiVersion: crema/v1 kind: CremaConfig spec: pollingInterval: 30 triggerAuthentications: - metadata: name: adc-trigger-auth spec: podIdentity: provider: gcp scaledObjects: - spec: scaleTargetRef: name: projects/PROJECT_ID/locations/us-central1/workerpools/worker-pool-consumer triggers: - type: gcp-pubsub metadata: subscriptionName: "crema-subscription" # Target number of undelivered messages per worker instance value: "10" mode: "SubscriptionSize" authenticationRef: name: adc-trigger-authמחליפים את PROJECT_ID במזהה Google Cloud הפרויקט.
מעלים את קובץ ה-YAML המקומי כגרסה חדשה של הפרמטר:
LOCAL_YAML_CONFIG_FILE=my-crema-config.yaml PARAMETER_VERSION=1 gcloud parametermanager parameters versions create $PARAMETER_VERSION \ --location=$PARAMETER_REGION \ --parameter=$PARAMETER_ID \ --payload-data-from-file=$LOCAL_YAML_CONFIG_FILEכדי לוודא שהוספתם את הפרמטר בהצלחה, מריצים את הפקודה הבאה:
gcloud parametermanager parameters versions list \ --parameter=$PARAMETER_ID \ --location=$PARAMETER_REGIONאמור להופיע נתיב הפרמטר, כמו
projects/PROJECT_ID/locations/global/parameters/crema-config/versions/1.
פריסת השירות כדי להרחיב את עומסי העבודה
כדי לפרוס את השירות כדי להרחיב את מאגר העובדים, מריצים את הפקודה הבאה עם קובץ אימג' של קונטיינר שנבנה מראש:
CREMA_CONFIG_PARAM_VERSION=projects/$PROJECT_ID/locations/$PARAMETER_REGION/parameters/$PARAMETER_ID/versions/$PARAMETER_VERSION
IMAGE=us-central1-docker.pkg.dev/cloud-run-oss-images/crema-v1/autoscaler:1.0
gcloud run deploy $CREMA_SERVICE_NAME \
--image=${IMAGE} \
--region=${REGION} \
--service-account="${CREMA_SA_NAME}" \
--no-allow-unauthenticated \
--no-cpu-throttling \
--base-image=us-central1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/java25 \
--labels=created-by=crema \
--set-env-vars="CREMA_CONFIG=${CREMA_CONFIG_PARAM_VERSION},OUTPUT_SCALER_METRICS=True"
בדיקת שירות ההתאמה לעומס
כדי לבדוק את שירות CREMA, יוצרים סקריפט שמפיק 100 הודעות ושולח אותן לתור Pub/Sub:
בתיקיית השורש, יוצרים קובץ בשם
load-pubsub.shומוסיפים את הקוד הבא:#!/bin/bash TOPIC_ID=${TOPIC_ID} PROJECT_ID=${PROJECT_ID} NUM_MESSAGES=100 echo "Publishing $NUM_MESSAGES messages to topic $TOPIC_ID..." for i in $(seq 1 $NUM_MESSAGES); do gcloud pubsub topics publish $TOPIC_ID --message="job-$i" --project=$PROJECT_ID & if (( $i % 10 == 0 )); then wait echo "Published $i messages..." fi done wait echo "Done. All messages published."מריצים את בדיקת העומס:
chmod +x load-pubsub.sh ./load-pubsub.sh
הפקודה הזו יוצרת 100 הודעות ושולחת אותן למינוי Pub/Sub.
מעקב אחר התאמה לעומס
אחרי שהסקריפט load-pubsub.sh מסתיים, מחכים שלוש עד ארבע דקות לפני שבודקים את היומנים של השירות, my-crema-service. שירות ה-autoscaler של CREMA מגדיל את מספר המופעים של העובדים הצרכניים מ-0.
אלה היומנים שיוצגו:
כל הודעה ביומן מסומנת בתווית של הרכיב שיצר אותה.
[INFO] [METRIC-PROVIDER] Starting metric collection cycle
[INFO] [METRIC-PROVIDER] Successfully fetched scaled object metrics ...
[INFO] [METRIC-PROVIDER] Sending scale request ...
[INFO] [SCALER] Received ScaleRequest ...
[INFO] [SCALER] Current instances ...
[INFO] [SCALER] Recommended instances ...
לחלופין, מריצים את הפקודה הבאה כדי לוודא ששירות CREMA ממליץ על מכונות וירטואליות על סמך עומק התור:
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$CREMA_SERVICE_NAME AND textPayload:SCALER" \
--limit=20 \
--format="value(textPayload)" \
--freshness=5m
כדי לראות את היומנים של הצרכן שצורכים הודעות, מריצים את הפקודה הבאה:
gcloud run worker-pools logs tail $CONSUMER_WORKER_POOL_NAME --region=$REGION
אמורים להופיע יומנים בפורמט Done job-100.
הסרת המשאבים
כדי להימנע מחיובים נוספים בחשבון Google Cloud , מוחקים את כל המשאבים שהצבתם באמצעות המדריך הזה.
מחיקת הפרויקט
אם יצרתם פרויקט חדש בשביל המדריך הזה, מוחקים את הפרויקט. אם השתמשתם בפרויקט קיים ואתם רוצים לשמור אותו בלי השינויים שהוספתם במדריך הזה, תצטרכו למחוק את המשאבים שיצרתם לצורך המדריך.
הדרך הקלה ביותר לבטל את החיוב היא למחוק את הפרויקט שיצרתם בשביל המדריך.
כדי למחוק את הפרויקט:
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מחיקת משאבים של מדריך
מוחקים את שירות Cloud Run שפרסתם במדריך הזה. שירותי Cloud Run לא צוברים עלויות עד שהם מקבלים בקשות.
כדי למחוק את שירות Cloud Run, מריצים את הפקודה הבאה:
gcloud run services delete SERVICE-NAME
מחליפים את SERVICE-NAME בשם השירות.
אפשר גם למחוק שירותים של Cloud Run מGoogle Cloud המסוף.
מסירים את הגדרת ברירת המחדל של האזור
gcloudשהוספתם במהלך ההגדרה של המדריך:gcloud config unset run/regionמסירים את הגדרת הפרויקט:
gcloud config unset projectמחיקת משאבי Pub/Sub:
gcloud pubsub subscriptions delete $SUBSCRIPTION_ID gcloud pubsub topics delete $TOPIC_IDמחיקה של Google Cloud משאבים אחרים שנוצרו במדריך הזה:
המאמרים הבאים
- למדריך מפורט, אפשר לעיין ב-Codelab Autoscale Cloud Run worker pools based on the Pub/Sub queue volume using CREMA (שינוי קנה מידה אוטומטי של מאגרי עובדים ב-Cloud Run על סמך נפח התור ב-Pub/Sub באמצעות CREMA).
- מידע נוסף על מאגרי עובדים ב-Cloud Run
- דוגמאות, מדריכים וסרטוני הדגמה נוספים של Cloud Run
- הגדרת סקלרים אחרים של KEDA באמצעות CREMA.