Tutorial ini menunjukkan cara men-deploy worker pool Cloud Run untuk memproses pesan Pub/Sub, dan menskalakan instance konsumen secara otomatis berdasarkan kedalaman antrean menggunakan Penskalaan Otomatis Metrik Eksternal Cloud Run (CREMA).
Tujuan
Dalam tutorial ini, Anda akan:
- Buat topik dan langganan Pub/Sub untuk mendorong pesan ke topik.
- Men-deploy worker pool Cloud Run yang menggunakan pesan dari Pub/Sub.
- Deploy layanan CREMA autoscaler untuk menskalakan worker pool Anda.
- Uji layanan penskalaan otomatis Anda dengan menjalankan skrip python secara lokal untuk menghasilkan beban.
Biaya
Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:
Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda,
gunakan kalkulator harga.
Sebelum memulai
- Login ke akun Google Cloud Anda. Jika Anda baru menggunakan Google Cloud, buat akun untuk mengevaluasi performa produk kami dalam skenario dunia nyata. Pelanggan baru juga mendapatkan kredit gratis senilai $300 untuk menjalankan, menguji, dan men-deploy workload.
-
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.
Aktifkan Cloud Run, Parameter Manager, Artifact Registry, Pub/Sub, dan Cloud Build API, jika belum diaktifkan.
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan izin
serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Service Usage Admin (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.- Instal dan lakukan inisialisasi gcloud CLI.
- Perbarui komponen:
gcloud components update
- Tutorial ini menggunakan beberapa variabel lingkungan. Untuk meningkatkan proses debug, jalankan perintah berikut untuk menghasilkan error saat Anda membuat referensi ke variabel lingkungan lokal yang tidak ditetapkan:
set -u
- Tetapkan variabel konfigurasi berikut untuk CREMA yang digunakan dalam tutorial ini:
Ganti PROJECT_ID dengan ID project Google Cloud Anda.export 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
- Tetapkan project ID Anda dengan menjalankan perintah berikut:
gcloud config set project $PROJECT_ID
- Anda akan dikenai biaya untuk layanan penskalaan Cloud Run berdasarkan seberapa sering Anda memicu penskalaan. Untuk mengetahui informasi selengkapnya, perkirakan biaya dengan kalkulator harga.
Peran yang diperlukan
Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan tutorial, minta administrator Anda untuk memberi Anda peran IAM berikut di project Anda:
- Artifact Registry Repository Administrator (
roles/artifactregistry.repoAdmin) - Editor Cloud Build (
roles/cloudbuild.builds.editor) - Cloud Run Admin (
roles/run.admin) - Create Service Accounts (
roles/iam.serviceAccountCreator) - Pub/Sub Admin (
roles/pubsub.admin) - Service Account User (
roles/iam.serviceAccountUser) - Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer) - Parameter Manager Admin (
roles/parametermanager.admin)
Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.
Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.
Membuat topik dan langganan Pub/Sub
Untuk menskalakan worker secara otomatis, buat langganan pull untuk aplikasi konsumen Anda menggunakan langkah-langkah berikut:
Buat topik Pub/Sub yang merepresentasikan feed pesan:
gcloud pubsub topics create $TOPIC_IDBuat langganan pull untuk menggunakan pesan dari topik Pub/Sub Anda:
gcloud pubsub subscriptions create $SUBSCRIPTION_ID --topic=$TOPIC_ID
Membuat akun layanan kustom
Tutorial ini memerlukan dua akun layanan berikut dengan izin minimum yang diperlukan untuk menggunakan resource yang disediakan:
Akun layanan konsumen: identitas untuk worker pool konsumen yang memproses pesan. Jalankan perintah berikut untuk membuat akun layanan konsumen:
gcloud iam service-accounts create $CONSUMER_SA_NAME \ --display-name="Pub/Sub consumer service account"Akun layanan CREMA: identitas untuk autoscaler. Jalankan perintah berikut untuk membuat akun layanan CREMA:
gcloud iam service-accounts create $CREMA_SA_NAME \ --display-name="CREMA service account"
Memberikan izin tambahan ke akun layanan kustom Anda
Untuk menskalakan worker pool, berikan izin berikut pada akun layanan kustom:
Beri akun layanan CREMA Anda izin untuk membaca dari Parameter Manager:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/parametermanager.parameterViewer"Beri akun layanan CREMA Anda izin untuk menskalakan worker pool:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/run.developer"Berikan peran pengguna akun layanan kepada akun layanan CREMA Anda:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/iam.serviceAccountUser"Beri akun layanan CREMA Anda izin untuk melihat metrik:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/monitoring.viewer"Beri izin akun layanan CREMA Anda untuk menulis metrik:
gcloud projects add-iam-policy-binding $PROJECT_ID \ --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/monitoring.metricWriter"Beri akun layanan CREMA Anda izin untuk melihat pesan 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"Beri akun layanan konsumen Anda izin untuk mengambil pesan dari langganan:
gcloud pubsub subscriptions add-iam-policy-binding $SUBSCRIPTION_ID \ --member="serviceAccount:$CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \ --role="roles/pubsub.subscriber"
Men-deploy pool worker Cloud Run
Untuk men-deploy worker pool yang menggunakan pesan dari langganan Pub/Sub, ikuti langkah-langkah berikut:
Buat folder bernama
consumerdan ubah direktori ke dalamnya:mkdir consumer cd consumerBuat file bernama
worker.pydan tambahkan kode berikut: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}")Buat Dockerfile dan tambahkan kode berikut:
FROM python:3.12-slim RUN pip install google-cloud-pubsub COPY worker.py . CMD ["python", "-u", "worker.py"]Deploy kumpulan worker konsumen dengan 0 instance agar CREMA dapat melakukan penskalaan:
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
Men-deploy layanan CREMA autoscaler
Setelah Anda men-deploy worker pool untuk menggunakan pesan dari Pub/Sub, konfigurasikan autoscaler CREMA untuk menyediakan worker instance berdasarkan volume pesan.
Mengonfigurasi autoscaler
Tutorial ini menggunakan Parameter Manager untuk menyimpan file konfigurasi YAML untuk CREMA.
Buat parameter di Parameter Manager untuk menyimpan versi parameter untuk CREMA:
PARAMETER_ID=crema-config PARAMETER_REGION=global gcloud parametermanager parameters create $PARAMETER_ID --location=$PARAMETER_REGION --parameter-format=YAMLBuka direktori utama project Anda dengan menjalankan perintah berikut:
cdDi direktori root, buat file YAML,
my-crema-config.yamluntuk menentukan konfigurasi autoscaler: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-authGanti PROJECT_ID dengan project ID Google Cloud .
Upload file YAML lokal Anda sebagai versi parameter baru:
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_FILEJalankan perintah berikut untuk memverifikasi bahwa penambahan parameter Anda berhasil:
gcloud parametermanager parameters versions list \ --parameter=$PARAMETER_ID \ --location=$PARAMETER_REGIONAnda akan melihat jalur parameter, seperti
projects/PROJECT_ID/locations/global/parameters/crema-config/versions/1.
Men-deploy layanan untuk menskalakan workload Anda
Untuk men-deploy layanan guna menskalakan worker pool, jalankan perintah berikut dengan image container bawaan:
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"
Menguji layanan penskalaan otomatis
Uji layanan CREMA Anda dengan membuat skrip yang menghasilkan 100 pesan dan mengirimkannya ke antrean Pub/Sub:
Di direktori root, buat file bernama
load-pubsub.sh, lalu tambahkan kode berikut:#!/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."Jalankan uji beban:
chmod +x load-pubsub.sh ./load-pubsub.sh
Perintah ini menghasilkan dan mengirim 100 pesan ke langganan Pub/Sub.
Memantau Penskalaan
Setelah skrip load-pubsub.sh selesai, tunggu tiga hingga empat menit sebelum
memeriksa log untuk layanan, my-crema-service. Layanan autoscaler CREMA meningkatkan skala instance worker konsumen dari 0.
Anda akan melihat log berikut:
Setiap pesan log diberi label dengan komponen yang memunculkannya.
[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 ...
Atau, jalankan perintah berikut untuk memverifikasi bahwa layanan CREMA merekomendasikan instance berdasarkan kedalaman antrean:
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
Untuk melihat log konsumen yang menggunakan pesan, jalankan perintah berikut:
gcloud run worker-pools logs tail $CONSUMER_WORKER_POOL_NAME --region=$REGION
Anda akan melihat log yang mengikuti format, Done job-100.
Pembersihan
Agar akun Google Cloud Anda tidak dikenai biaya tambahan, hapus semua resource yang Anda deploy dengan tutorial ini.
Menghapus project
Jika Anda membuat project baru untuk tutorial ini, hapus project tersebut. Jika Anda menggunakan project yang ada dan perlu mempertahankannya tanpa perubahan yang Anda tambahkan dalam tutorial ini, hapus resource yang Anda buat untuk tutorial.
Cara termudah untuk menghilangkan penagihan adalah dengan menghapus project yang Anda buat untuk tutorial.
Untuk menghapus project:
- Di konsol Google Cloud , buka halaman Manage resources.
- Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
- Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.
Menghapus resource tutorial
Hapus layanan Cloud Run yang Anda deploy dalam tutorial ini. Layanan Cloud Run tidak dikenai biaya hingga menerima permintaan.
Untuk menghapus layanan Cloud Run, jalankan perintah berikut:
gcloud run services delete SERVICE-NAME
Ganti SERVICE-NAME dengan nama layanan Anda.
Anda juga dapat menghapus layanan Cloud Run dari konsolGoogle Cloud .
Hapus konfigurasi region default
gcloudyang Anda tambahkan selama penyiapan tutorial:gcloud config unset run/regionHapus konfigurasi project:
gcloud config unset projectHapus resource Pub/Sub:
gcloud pubsub subscriptions delete $SUBSCRIPTION_ID gcloud pubsub topics delete $TOPIC_IDHapus resource Google Cloud lain yang dibuat dalam tutorial ini:
Langkah berikutnya
- Untuk panduan mendetail tentang tutorial ini, lihat codelab Menskalakan worker pool Cloud Run secara otomatis berdasarkan volume antrean Pub/Sub menggunakan CREMA.
- Pelajari lebih lanjut worker pool Cloud Run.
- Pelajari demo, tutorial, dan contoh Cloud Run lainnya.
- Konfigurasikan penskala KEDA lainnya dengan CREMA.