Menskalakan otomatis kumpulan pekerja Cloud Run berdasarkan volume antrean Pub/Sub menggunakan CREMA

1. Pengantar

Ringkasan

Tutorial ini menunjukkan cara men-deploy kumpulan pekerja Cloud Run (konsumen) untuk memproses pesan Pub/Sub, dan menskalakan instance konsumen Anda secara otomatis berdasarkan kedalaman antrean menggunakan Penskalaan Otomatis Metrik Eksternal Cloud Run (CREMA).

Yang akan Anda pelajari

Dalam codelab ini, Anda akan:

  • Buat topik dan langganan Pub/Sub, lalu kirim pesan ke topik tersebut.
  • Deploy pool worker Cloud Run (konsumen) yang menggunakan pesan dari Pub/Sub.
  • Deploy project CREMA di GitHub sebagai layanan Cloud Run untuk menskalakan kumpulan pekerja Anda secara otomatis berdasarkan jumlah pesan dalam langganan Pub/Sub.
  • Uji konfigurasi penskalaan otomatis Anda dengan membuat beban dengan menjalankan skrip python secara lokal.

2. Mengonfigurasi Variabel Lingkungan

Karena banyak variabel lingkungan yang digunakan di sepanjang codelab ini, sebaiknya jalankan

set -u

yang akan memperingatkan Anda jika Anda mencoba menggunakan variabel lingkungan yang belum ditetapkan. Untuk mengurungkan setelan ini, jalankan set +u

Pertama, ubah variabel berikut ke project ID Anda.

export PROJECT_ID=<YOUR_PROJECT_ID>

lalu tetapkan sebagai project untuk codelab ini.

gcloud config set project $PROJECT_ID

Selanjutnya, tetapkan variabel lingkungan yang digunakan oleh codelab ini.

export REGION=us-central1
export TOPIC_ID=crema-pubsub-topic
export SUBSCRIPTION_ID=crema-pubsub-sub
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

Buat direktori untuk codelab ini

mkdir crema-pubsub-codelab
cd crema-pubsub-codelab

Mengaktifkan API

gcloud services enable \
        artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        run.googleapis.com \
        parametermanager.googleapis.com

Terakhir, pastikan gcloud Anda menggunakan Versi terbaru

gcloud components update

3. Penyiapan Pub/Sub

Buat topik dan langganan pull yang akan diproses oleh kumpulan pekerja Anda. Bash

Buat topik.

gcloud pubsub topics create $TOPIC_ID

Buat langganan.

gcloud pubsub subscriptions create $SUBSCRIPTION_ID --topic=$TOPIC_ID

4. IAM & Akun Layanan

Sebaiknya buat akun layanan untuk setiap resource Cloud Run. Dalam codelab ini, Anda akan membuat hal berikut:

  • SA Konsumen: Identitas untuk kumpulan pekerja yang memproses pesan Pub/Sub.
  • CREMA SA: Identitas untuk layanan penskalaan otomatis CREMA.

Create Service Accounts

Buat SA konsumen kumpulan pekerja:

gcloud iam service-accounts create $CONSUMER_SA_NAME \
  --display-name="PubSub Consumer Service Account"

Buat layanan CREMA SA worker pool:

gcloud iam service-accounts create $CREMA_SA_NAME \
  --display-name="CREMA Autoscaler Service Account"

Memberikan Izin kepada Consumer SA

Beri akun SA konsumen kumpulan pekerja izin untuk menarik 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"

Memberikan Izin kepada CREMA SA

CREMA memerlukan izin untuk membaca parameter, menskalakan worker pool, dan memantau metrik Pub/Sub.

  1. Mengakses Parameter Manager (Config Reader):
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/parametermanager.parameterViewer"
  1. Menskalakan Kumpulan Pekerja (Developer Cloud Run):
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/run.developer"
  1. Memantau Pub/Sub:

Berikan peran pelihat pemantauan.

gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/monitoring.viewer"

Tambahkan kebijakan ke langganan untuk SA layanan CREMA agar dapat melihatnya

gcloud pubsub subscriptions add-iam-policy-binding $SUBSCRIPTION_ID \
  --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/pubsub.viewer"

CREMA SA juga memerlukan Service Account User, yang diperlukan untuk mengubah jumlah instance:

gcloud iam service-accounts add-iam-policy-binding \
    $CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com \
    --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/iam.serviceAccountUser"

5. Memverifikasi izin SA

Sebelum melanjutkan codelab, pastikan SA layanan CREMA memiliki peran tingkat project yang benar.

gcloud projects get-iam-policy $PROJECT_ID \
  --flatten="bindings[].members" \
  --format="table(bindings.role)" \
  --filter="bindings.members:serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com"

Akan menghasilkan berikut ini:

roles/monitoring.viewer
roles/parametermanager.parameterViewer
roles/run.developer

Pastikan langganan Pub/Sub memiliki kebijakan yang mengizinkan SA layanan CREMA untuk melihatnya.

gcloud pubsub subscriptions get-iam-policy $SUBSCRIPTION_ID \
  --flatten="bindings[].members" \
  --filter="bindings.members:serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
  --format="table(bindings.role)"

Harus menghasilkan

roles/pubsub.viewer

dan pastikan SA CREMA memiliki peran Service Account User

gcloud iam service-accounts get-iam-policy \
  $CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com \
  --flatten="bindings[].members" \
  --filter="bindings.members:serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com"

Akan menghasilkan yang berikut

bindings:
  members: serviceAccount:crema-service-account@<PROJECT_ID>.iam.gserviceaccount.com
  role: roles/iam.serviceAccountUser

Selain itu, SA Worker Pool Consumer memiliki peran pelanggan Pub/Sub

gcloud pubsub subscriptions get-iam-policy $SUBSCRIPTION_ID \
  --flatten="bindings[].members" \
  --filter="bindings.members:serviceAccount:$CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
  --format="table(bindings.role)"

Harus menghasilkan

ROLE
roles/pubsub.subscriber

6. Membangun dan Men-deploy Kumpulan Pekerja Konsumen

Buat direktori untuk kode konsumen Anda dan masukkan.

mkdir consumer
cd consumer
  1. Membuat file consumer.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}")
  1. Membuat Dockerfile
FROM python:3.12-slim
RUN pip install google-cloud-pubsub
COPY consumer.py .
CMD ["python", "-u", "consumer.py"]
  1. Men-deploy Kumpulan Pekerja Konsumen

Codelab ini merekomendasikan deployment worker pool dengan 0 instance untuk memulai, sehingga Anda dapat melihat CREMA menskalakan worker pool saat mendeteksi pesan Pub/Sub dalam langganan.

gcloud beta 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

7. Mengonfigurasi CREMA

  1. Kembali ke direktori root project Anda.
cd ..
  1. Buat File Konfigurasi Buat file bernama 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_PLACEHOLDER/locations/REGION_PLACEHOLDER/workerpools/CONSUMER_WORKER_POOL_NAME_PLACEHOLDER
        triggers:
          - type: gcp-pubsub
            metadata:
              subscriptionName: "SUBSCRIPTION_ID_PLACEHOLDER"
              # Target number of undelivered messages per worker instance
              value: "10"
              mode: "SubscriptionSize"
            authenticationRef:
              name: adc-trigger-auth
  1. Mengganti Variabel
sed -i "s/PROJECT_ID_PLACEHOLDER/$PROJECT_ID/g" crema-config.yaml
sed -i "s/REGION_PLACEHOLDER/$REGION/g" crema-config.yaml
sed -i "s/CONSUMER_WORKER_POOL_NAME_PLACEHOLDER/$CONSUMER_WORKER_POOL_NAME/g" crema-config.yaml
sed -i "s/SUBSCRIPTION_ID_PLACEHOLDER/$SUBSCRIPTION_ID/g" crema-config.yaml
  1. Verifikasi bahwa crema-config.yaml Anda sudah benar
if grep -q "_PLACEHOLDER" crema-config.yaml; then
  echo "❌ ERROR: Validations failed. '_PLACEHOLDER' was found in crema-config.yaml."
  echo "Please check your environment variables and run the 'sed' commands again."
else
  echo "✅ Config check passed: No placeholders found."
fi
  1. Mengupload ke Parameter Manager

Menetapkan variabel lingkungan tambahan untuk Parameter Manager

export PARAMETER_ID=crema-config
export PARAMETER_REGION=global
export PARAMETER_VERSION=1

Buat resource Parameter

gcloud parametermanager parameters create $PARAMETER_ID \
  --location=$PARAMETER_REGION \
  --parameter-format=YAML

Buat Parameter Versi 1

gcloud parametermanager parameters versions create $PARAMETER_VERSION \
  --parameter=crema-config \
  --project=$PROJECT_ID \
  --location=$PARAMETER_REGION \
  --payload-data-from-file=crema-config.yaml

Pastikan parameter berhasil ditambahkan

gcloud parametermanager parameters versions list \
  --parameter=$PARAMETER_ID \
  --location=$PARAMETER_REGION

Anda akan melihat sesuatu seperti

projects/<YOUR_PROJECT_ID>/locations/global/parameters/crema-config/versions/1

8. Men-deploy Layanan CREMA

Di bagian ini, Anda akan men-deploy layanan penskala otomatis CREMA. Anda akan menggunakan gambar yang tersedia untuk publik.

  1. Tetapkan variabel lingkungan yang diperlukan untuk CREMA
CREMA_CONFIG_PARAM_VERSION=projects/$PROJECT_ID/locations/$PARAMETER_REGION/parameters/$PARAMETER_ID/versions/$PARAMETER_VERSION
  1. Verifikasi jalur nama versi
echo $CREMA_CONFIG_PARAM_VERSION

Tampilannya akan terlihat seperti

projects/<YOUR_PROJECT>/locations/global/parameters/crema-config/versions/1
  1. Setel variabel lingkungan untuk gambar CREMA
IMAGE=us-central1-docker.pkg.dev/cloud-run-oss-images/crema-v1/autoscaler:1.0
  1. dan men-deploy layanan CREMA

Perhatikan bahwa gambar dasar wajib diisi.

gcloud beta run deploy $CREMA_SERVICE_NAME \
  --image=$IMAGE \
  --region=${REGION} \
  --service-account="${CREMA_SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com" \
  --no-allow-unauthenticated \
  --no-cpu-throttling \
  --labels=created-by=crema \
  --base-image=us-central1-docker.pkg.dev/serverless-runtimes/google-24/runtimes/java25 \
  --set-env-vars="CREMA_CONFIG=${CREMA_CONFIG_PARAM_VERSION},OUTPUT_SCALER_METRICS=True,ENABLE_CLOUD_LOGGING=True"

9. Pengujian Beban

  1. Buat skrip yang akan memublikasikan pesan ke topik Pub/Sub
touch load-pubsub.sh
  1. Tambahkan kode berikut ke file 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."
  1. Menjalankan Uji Beban
chmod +x load-pubsub.sh
./load-pubsub.sh
  1. Pantau Penskalaan Tunggu 3-4 menit. Lihat log CREMA untuk melihatnya merekomendasikan instance berdasarkan konfigurasi authenticationRef baru.
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
  1. Monitor Pemrosesan Lihat log Konsumen untuk melihatnya berputar.
gcloud beta run worker-pools logs tail $CONSUMER_WORKER_POOL_NAME --region=$REGION

Anda akan melihat log seperti

Done job-100

10. Pemecahan masalah

Pertama, Anda harus menentukan apakah masalahnya terkait dengan konfigurasi layanan CREMA atau konfigurasi konsumen PubSub.

Tetapkan penskalaan otomatis konsumen PubSub ke 1, bukan 0. Jika segera mulai memproses pesan pubsub, berarti ada masalah pada CREMA. Jika tidak memproses pesan pubsub, ada masalah pada konsumen pubsub.

11. Selamat!

Selamat, Anda telah menyelesaikan codelab.

Sebaiknya tinjau dokumentasi Cloud Run.

Yang telah kita bahas

  • Cara membuat topik dan langganan Pub/Sub serta mengirim pesan ke topik tersebut.
  • Cara men-deploy kumpulan pekerja Cloud Run (konsumen) yang menggunakan pesan dari Pub/Sub.
  • Cara men-deploy project CREMA di GitHub sebagai layanan Cloud Run untuk menskalakan kumpulan pekerja Anda secara otomatis berdasarkan jumlah pesan dalam langganan Pub/Sub.
  • Cara menguji konfigurasi penskalaan otomatis dengan membuat beban dengan menjalankan skrip python secara lokal.

12. Pembersihan

Agar akun Google Cloud Anda tidak dikenai biaya untuk resource yang digunakan dalam tutorial ini, Anda dapat menghapus resource yang dibuat dalam codelab ini atau menghapus seluruh project.

Menghapus resource yang digunakan dalam codelab ini

  1. Menghapus layanan CREMA Cloud Run
gcloud run services delete $CREMA_SERVICE_NAME --region=$REGION --quiet
  1. Menghapus konsumen kumpulan pekerja Cloud Run
gcloud beta run worker-pools delete $CONSUMER_WORKER_POOL_NAME --region=$REGION --quiet
  1. Menghapus langganan dan topik Pub/Sub
gcloud pubsub subscriptions delete $SUBSCRIPTION_ID --quiet
gcloud pubsub topics delete $TOPIC_ID --quiet
  1. Hapus konfigurasi Parameter Manager

Menghapus versi di dalam parameter

gcloud parametermanager parameters versions delete $PARAMETER_VERSION \
  --parameter=$PARAMETER_ID \
  --location=$PARAMETER_REGION \
  --quiet

Sekarang hapus parameter kosong

gcloud parametermanager parameters delete $PARAMETER_ID \
  --location=$PARAMETER_REGION \
  --quiet
  1. Menghapus Akun Layanan
gcloud iam service-accounts delete "$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" --quiet
gcloud iam service-accounts delete "$CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" --quiet

Atau menghapus seluruh project

Untuk menghapus seluruh project, buka Manage Resources, pilih project yang Anda buat di Langkah 2, lalu pilih Delete. Jika menghapus project, Anda harus mengubah project di Cloud SDK. Anda dapat melihat daftar semua project yang tersedia dengan menjalankan gcloud projects list.