Tự động mở rộng quy mô nhóm worker Cloud Run dựa trên số lượng hàng đợi Pub/Sub bằng CREMA

1. Giới thiệu

Tổng quan

Hướng dẫn này cho bạn biết cách triển khai một nhóm worker Cloud Run (người dùng) để xử lý các thông báo Pub/Sub và tự động mở rộng quy mô các phiên bản người dùng dựa trên độ sâu hàng đợi bằng cách sử dụng Tính năng tự động mở rộng quy mô dựa trên chỉ số bên ngoài của Cloud Run (CREMA).

Kiến thức bạn sẽ học được

Trong lớp học lập trình này, bạn sẽ:

  • Tạo một chủ đề và gói thuê bao Pub/Sub, sau đó đẩy thông báo đến chủ đề đó.
  • Triển khai một nhóm worker Cloud Run (người dùng) sử dụng tin nhắn từ Pub/Sub.
  • Triển khai dự án CREMA trên GitHub dưới dạng một dịch vụ Cloud Run để tự động mở rộng nhóm worker dựa trên số lượng thông báo trong gói thuê bao Pub/Sub.
  • Kiểm thử cấu hình tự động mở rộng quy mô bằng cách tạo tải bằng cách chạy tập lệnh Python cục bộ.

2. Định cấu hình các biến môi trường

Vì nhiều biến môi trường được dùng trong suốt lớp học lập trình này, nên bạn nên chạy

set -u

thao tác này sẽ cảnh báo bạn nếu bạn cố gắng sử dụng một biến môi trường chưa được đặt. Để huỷ chế độ cài đặt này, hãy chạy set +u

Trước tiên, hãy thay đổi biến sau đây thành mã dự án của bạn.

export PROJECT_ID=<YOUR_PROJECT_ID>

rồi đặt làm dự án cho lớp học lập trình này.

gcloud config set project $PROJECT_ID

Tiếp theo, hãy thiết lập các biến môi trường mà lớp học lập trình này sử dụng.

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

Tạo một thư mục cho lớp học lập trình này

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

Bật API

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

Cuối cùng, hãy đảm bảo gcloud của bạn đang sử dụng phiên bản mới nhất

gcloud components update

3. Thiết lập Pub/Sub

Tạo chủ đề và thuê bao kéo mà nhóm worker của bạn sẽ xử lý. Bash

Tạo chủ đề.

gcloud pubsub topics create $TOPIC_ID

Tạo gói thuê bao.

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

4. IAM và tài khoản dịch vụ

Bạn nên tạo một tài khoản dịch vụ cho mỗi tài nguyên Cloud Run. Trong lớp học lập trình này, bạn sẽ tạo những nội dung sau:

  • SA người dùng: Danh tính cho nhóm nhân viên xử lý thông báo Pub/Sub.
  • CREMA SA: Danh tính cho dịch vụ điều chỉnh quy mô tự động CREMA.

Tạo tài khoản dịch vụ

Tạo SA người dùng nhóm nhân viên:

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

Tạo SA dịch vụ CREMA của nhóm nhân viên:

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

Cấp quyền cho SA người tiêu dùng

Cấp quyền cho SA người dùng nhóm worker để kéo thông báo từ gói thuê bao.

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

Cấp quyền cho CREMA SA

CREMA cần có quyền đọc các thông số, mở rộng nhóm worker và theo dõi các chỉ số Pub/Sub.

  1. Truy cập vào Trình quản lý tham số (Trình đọc cấu hình):
gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
  --role="roles/parametermanager.parameterViewer"
  1. Mở rộng Nhóm nhân viên (Nhà phát triển 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. Giám sát Pub/Sub:

Cấp vai trò người xem giám sát.

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

Thêm một chính sách vào gói thuê bao cho dịch vụ CREMA SA để xem chính sách đó

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 cũng cần có Người dùng tài khoản dịch vụ để thay đổi số lượng phiên bản:

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. Xác minh quyền của quản trị viên cấp cao

Trước khi tiếp tục với lớp học lập trình này, hãy xác minh rằng SA dịch vụ CREMA có các vai trò chính xác ở cấp dự án.

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"

Sẽ dẫn đến kết quả sau:

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

Xác minh rằng thuê bao Pub/Sub có một chính sách cho phép SA dịch vụ CREMA xem thuê bao đó.

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)"

Sẽ dẫn đến

roles/pubsub.viewer

và xác minh rằng CREMA SA có vai trò Người dùng tài khoản dịch vụ

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"

Sẽ dẫn đến kết quả sau

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

SA Worker Pool Consumer có vai trò người đăng ký 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)"

Sẽ dẫn đến

ROLE
roles/pubsub.subscriber

6. Xây dựng và triển khai Nhóm nhân viên người tiêu dùng

Tạo một thư mục cho mã người tiêu dùng rồi nhập thư mục đó.

mkdir consumer
cd consumer
  1. Tạo tệp 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. Tạo một Dockerfile
FROM python:3.12-slim
RUN pip install google-cloud-pubsub
COPY consumer.py .
CMD ["python", "-u", "consumer.py"]
  1. Triển khai Nhóm nhân viên người tiêu dùng

Lớp học lập trình này đề xuất triển khai nhóm worker với 0 phiên bản để bắt đầu, nhờ đó, bạn có thể xem CREMA mở rộng quy mô nhóm worker khi phát hiện thấy các thông báo Pub/Sub trong gói thuê bao.

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. Định cấu hình CREMA

  1. Chuyển về thư mục gốc của dự án.
cd ..
  1. Tạo tệp cấu hình Tạo một tệp có tên 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. Biến thay thế
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. Xác minh rằng crema-config.yaml của bạn là chính xác
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. Tải lên Trình quản lý tham số

Đặt các biến môi trường bổ sung cho Trình quản lý tham số

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

Tạo tài nguyên Tham số

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

Tạo tham số phiên bản 1

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

Xác minh rằng bạn đã thêm tham số thành công

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

Bạn sẽ thấy nội dung như sau

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

8. Triển khai Dịch vụ CREMA

Trong phần này, bạn sẽ triển khai dịch vụ bộ điều chỉnh quy mô tự động CREMA. Bạn sẽ sử dụng hình ảnh công khai.

  1. Đặt các biến môi trường cần thiết cho CREMA
CREMA_CONFIG_PARAM_VERSION=projects/$PROJECT_ID/locations/$PARAMETER_REGION/parameters/$PARAMETER_ID/versions/$PARAMETER_VERSION
  1. Xác minh đường dẫn tên phiên bản
echo $CREMA_CONFIG_PARAM_VERSION

Giá trị này sẽ có dạng như sau

projects/<YOUR_PROJECT>/locations/global/parameters/crema-config/versions/1
  1. Đặt biến môi trường cho hình ảnh CREMA
IMAGE=us-central1-docker.pkg.dev/cloud-run-oss-images/crema-v1/autoscaler:1.0
  1. và triển khai dịch vụ CREMA

Xin lưu ý rằng bạn phải cung cấp hình ảnh cơ sở.

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. Kiểm thử tải

  1. Tạo một tập lệnh sẽ xuất bản thông báo lên chủ đề Pub/Sub
touch load-pubsub.sh
  1. Thêm đoạn mã sau đây vào tệp 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. Chạy kiểm tra tải
chmod +x load-pubsub.sh
./load-pubsub.sh
  1. Chờ 3 đến 4 phút để điều chỉnh tỷ lệ màn hình. Xem nhật ký CREMA để xem nhật ký này đề xuất các phiên bản dựa trên cấu hình authenticationRef mới.
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. Giám sát quá trình xử lý Xem nhật ký Người tiêu dùng để xem quá trình này đang diễn ra.
gcloud beta run worker-pools logs tail $CONSUMER_WORKER_POOL_NAME --region=$REGION

Bạn sẽ thấy nhật ký như

Done job-100

10. Khắc phục sự cố

Trước tiên, bạn cần xác định xem vấn đề nằm ở cấu hình dịch vụ CREMA hay cấu hình người dùng PubSub.

Đặt bộ điều chỉnh quy mô tự động của người dùng PubSub thành 1 thay vì 0. Nếu ứng dụng bắt đầu xử lý ngay các thông báo pubsub, thì đó là vấn đề với CREMA. Nếu không xử lý các thông báo pubsub, thì có vấn đề với người dùng pubsub.

11. Xin chúc mừng!

Chúc mừng bạn đã hoàn thành lớp học lập trình này!

Bạn nên xem tài liệu về Cloud Run.

Nội dung đã đề cập

  • Cách tạo chủ đề và gói thuê bao Pub/Sub, đồng thời đẩy thông báo đến chủ đề đó.
  • Cách triển khai một nhóm worker Cloud Run (người dùng) sử dụng tin nhắn từ Pub/Sub.
  • Cách triển khai dự án CREMA trên GitHub dưới dạng một dịch vụ Cloud Run để tự động mở rộng nhóm worker dựa trên số lượng thông báo trong gói thuê bao Pub/Sub.
  • Cách kiểm thử cấu hình điều chỉnh quy mô tự động bằng cách tạo tải bằng cách chạy tập lệnh Python cục bộ.

12. Dọn dẹp

Để tránh bị tính phí cho tài khoản Google Cloud đối với các tài nguyên được dùng trong hướng dẫn này, bạn có thể xoá các tài nguyên mà bạn đã tạo trong lớp học lập trình này hoặc xoá toàn bộ dự án.

Xoá tài nguyên được dùng trong lớp học lập trình này

  1. Xoá dịch vụ CREMA của Cloud Run
gcloud run services delete $CREMA_SERVICE_NAME --region=$REGION --quiet
  1. Xoá người dùng nhóm worker Cloud Run
gcloud beta run worker-pools delete $CONSUMER_WORKER_POOL_NAME --region=$REGION --quiet
  1. Xoá gói thuê bao và chủ đề Pub/Sub
gcloud pubsub subscriptions delete $SUBSCRIPTION_ID --quiet
gcloud pubsub topics delete $TOPIC_ID --quiet
  1. Xoá cấu hình Parameter Manager

Xoá phiên bản trong tham số

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

Bây giờ, hãy xoá thông số trống

gcloud parametermanager parameters delete $PARAMETER_ID \
  --location=$PARAMETER_REGION \
  --quiet
  1. Xoá tài khoản dịch vụ
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

Hoặc xoá toàn bộ dự án

Để xoá toàn bộ dự án, hãy chuyển đến mục Quản lý tài nguyên, chọn dự án bạn đã tạo ở Bước 2 rồi chọn Xoá. Nếu xoá dự án, bạn sẽ cần thay đổi dự án trong Cloud SDK. Bạn có thể xem danh sách tất cả các dự án có sẵn bằng cách chạy gcloud projects list.