במדריך הזה נסביר איך לפרוס מאגר עובדים של 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, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (
roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאהserviceusage.services.enable. איך מקצים תפקידים- מתקינים ומפעילים את ה-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 (
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 את התפקיד Service Account User:
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}")יוצרים קובץ Docker ומוסיפים את הקוד הבא:
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
- דוגמאות, מדריכים ודוגמאות קוד נוספים של Cloud Run
- הגדרת סקלרים אחרים של KEDA באמצעות CREMA.