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.
- 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"
- 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"
- 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
- 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}")
- Tạo một
Dockerfile
FROM python:3.12-slim
RUN pip install google-cloud-pubsub
COPY consumer.py .
CMD ["python", "-u", "consumer.py"]
- 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
- Chuyển về thư mục gốc của dự án.
cd ..
- 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
- 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
- Xác minh rằng
crema-config.yamlcủ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
- 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.
- Đặ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
- 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
- Đặ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
- 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
- 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
- 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."
- Chạy kiểm tra tải
chmod +x load-pubsub.sh
./load-pubsub.sh
- 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
- 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
- Xoá dịch vụ CREMA của Cloud Run
gcloud run services delete $CREMA_SERVICE_NAME --region=$REGION --quiet
- Xoá người dùng nhóm worker Cloud Run
gcloud beta run worker-pools delete $CONSUMER_WORKER_POOL_NAME --region=$REGION --quiet
- Xoá gói thuê bao và chủ đề Pub/Sub
gcloud pubsub subscriptions delete $SUBSCRIPTION_ID --quiet
gcloud pubsub topics delete $TOPIC_ID --quiet
- 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
- 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.