1. परिचय
खास जानकारी
इस ट्यूटोरियल में, Pub/Sub मैसेज को प्रोसेस करने के लिए, Cloud Run वर्कर पूल (उपयोगकर्ता) को डिप्लॉय करने का तरीका बताया गया है. साथ ही, इसमें Cloud Run External Metrics Autoscaling (CREMA) का इस्तेमाल करके, कतार की गहराई के आधार पर उपभोक्ता इंस्टेंस को अपने-आप स्केल करने का तरीका बताया गया है.
आपको क्या सीखने को मिलेगा
इस कोडलैब में, आपको ये काम करने का तरीका बताया जाएगा:
- Pub/Sub विषय और सदस्यता बनाएं. साथ ही, उस विषय पर मैसेज पुश करें.
- Cloud Run वर्कर पूल (उपयोगकर्ता) को डिप्लॉय करें, जो Pub/Sub से मैसेज इस्तेमाल करता है.
- CREMA प्रोजेक्ट को GitHub पर Cloud Run सेवा के तौर पर डिप्लॉय करें, ताकि Pub/Sub सदस्यता में मौजूद मैसेज की संख्या के आधार पर, वर्कर पूल अपने-आप स्केल हो जाए.
- स्थानीय तौर पर Python स्क्रिप्ट चलाकर लोड जनरेट करें और ऑटोस्केलिंग कॉन्फ़िगरेशन की जांच करें.
2. एनवायरमेंट वैरिएबल कॉन्फ़िगर करना
इस कोडलैब में कई एनवायरमेंट वैरिएबल का इस्तेमाल किया जाता है. इसलिए, हमारा सुझाव है कि आप
set -u
यह आपको चेतावनी देगा, अगर आपने किसी ऐसे एनवायरमेंट वैरिएबल का इस्तेमाल करने की कोशिश की है जिसे अभी तक सेट नहीं किया गया है. इस सेटिंग को पहले जैसा करने के लिए, set +u चलाएं
सबसे पहले, इस वैरिएबल को अपने प्रोजेक्ट आईडी में बदलें.
export PROJECT_ID=<YOUR_PROJECT_ID>
इसके बाद, इसे इस कोडलैब के लिए प्रोजेक्ट के तौर पर सेट करें.
gcloud config set project $PROJECT_ID
इसके बाद, इस कोडलैब में इस्तेमाल किए गए एनवायरमेंट वैरिएबल सेट करें.
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
इस कोडलैब के लिए एक डायरेक्ट्री बनाएं
mkdir crema-pubsub-codelab
cd crema-pubsub-codelab
एपीआई चालू करें
gcloud services enable \
artifactregistry.googleapis.com \
cloudbuild.googleapis.com \
run.googleapis.com \
parametermanager.googleapis.com
आखिर में, पक्का करें कि gcloud का नया वर्शन इस्तेमाल किया जा रहा हो
gcloud components update
3. Pub/Sub सेटअप करना
वह विषय और पुल सदस्यता बनाएं जिसे आपका वर्कर पूल प्रोसेस करेगा. बैश
विषय बनाएं.
gcloud pubsub topics create $TOPIC_ID
सदस्यता बनाएं.
gcloud pubsub subscriptions create $SUBSCRIPTION_ID --topic=$TOPIC_ID
4. IAM और सेवा खाते
हमारा सुझाव है कि हर Cloud Run संसाधन के लिए एक सेवा खाता बनाएं. इस कोडलैब में, आपको ये बनाने का तरीका पता चलेगा:
- कंज्यूमर एसए: यह वर्कर पूल की पहचान है. यह Pub/Sub मैसेज प्रोसेस करता है.
- CREMA SA: CREMA autoscaler सेवा के लिए पहचान.
सेवा खाते बनाना
वर्कलोड पूल के उपभोक्ता एसए को बनाएं:
gcloud iam service-accounts create $CONSUMER_SA_NAME \
--display-name="PubSub Consumer Service Account"
CREMA सेवा के लिए वर्कर पूल का सेवा खाता बनाएं:
gcloud iam service-accounts create $CREMA_SA_NAME \
--display-name="CREMA Autoscaler Service Account"
Consumer SA को अनुमतियां देना
वर्क़र पूल के उपभोक्ता एसए को सदस्यता से मैसेज पाने की अनुमतियां दें.
gcloud pubsub subscriptions add-iam-policy-binding $SUBSCRIPTION_ID \
--member="serviceAccount:$CONSUMER_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/pubsub.subscriber"
CREMA SA को अनुमतियां देना
CREMA को पैरामीटर पढ़ने, वर्कर पूल को स्केल करने, और Pub/Sub मेट्रिक की निगरानी करने की अनुमतियां चाहिए.
- पैरामीटर मैनेजर (कॉन्फ़िगरेशन रीडर) को ऐक्सेस करने की अनुमति:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/parametermanager.parameterViewer"
- वर्कर पूल को स्केल करना (Cloud Run डेवलपर):
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/run.developer"
- Pub/Sub की निगरानी करें:
निगरानी करने वाले दर्शक की भूमिका असाइन करें.
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member="serviceAccount:$CREMA_SA_NAME@$PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/monitoring.viewer"
CREMA service SA के लिए सदस्यता से जुड़ी कोई नीति जोड़ें, ताकि वह उसे देख सके
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 को भी सेवा खाते के उपयोगकर्ता की भूमिका की ज़रूरत होती है. इसकी मदद से, इंस्टेंस की संख्या बदली जा सकती है:
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. SA की अनुमतियों की पुष्टि करना
कोड लैब के साथ आगे बढ़ने से पहले, पुष्टि करें कि CREMA सेवा के एसए के पास प्रोजेक्ट-लेवल की सही भूमिकाएं हैं.
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"
इससे ये नतीजे मिलने चाहिए:
roles/monitoring.viewer
roles/parametermanager.parameterViewer
roles/run.developer
पुष्टि करें कि Pub/Sub सदस्यता में ऐसी नीति हो जो CREMA सेवा के एसए को इसे देखने की अनुमति देती हो.
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)"
इससे यह नतीजा मिलना चाहिए
roles/pubsub.viewer
और पुष्टि करें कि CREMA SA के पास सेवा खाते के उपयोगकर्ता की भूमिका है
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"
इससे यह नतीजा मिलना चाहिए
bindings:
members: serviceAccount:crema-service-account@<PROJECT_ID>.iam.gserviceaccount.com
role: roles/iam.serviceAccountUser
साथ ही, Worker Pool Consumer SA के पास 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)"
इससे यह नतीजा मिलना चाहिए
ROLE
roles/pubsub.subscriber
6. उपयोगकर्ता वर्कर पूल बनाना और उसे डिप्लॉय करना
अपने उपभोक्ता कोड के लिए एक डायरेक्ट्री बनाएं और उसे डालें.
mkdir consumer
cd consumer
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}")
Dockerfileबनाएं
FROM python:3.12-slim
RUN pip install google-cloud-pubsub
COPY consumer.py .
CMD ["python", "-u", "consumer.py"]
- उपयोगकर्ता के लिए वर्कर पूल डिप्लॉय करना
इस कोडलैब में, वर्कर पूल को शुरू में शून्य इंस्टेंस के साथ डिप्लॉय करने का सुझाव दिया गया है. इससे, आपको यह देखने में मदद मिलेगी कि सदस्यता में Pub/Sub मैसेज का पता चलने पर, CREMA वर्कर पूल को कैसे स्केल करता है.
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. CREMA को कॉन्फ़िगर करना
- अपने प्रोजेक्ट की रूट डायरेक्ट्री पर वापस जाएं.
cd ..
- कॉन्फ़िगरेशन फ़ाइल बनाना
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
- वैरिएबल बदलना
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
- पुष्टि करें कि आपका
crema-config.yamlसही है
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
- पैरामीटर मैनेजर में अपलोड करें
पैरामीटर मैनेजर के लिए अतिरिक्त एनवायरमेंट वैरिएबल सेट करना
export PARAMETER_ID=crema-config
export PARAMETER_REGION=global
export PARAMETER_VERSION=1
पैरामीटर संसाधन बनाना
gcloud parametermanager parameters create $PARAMETER_ID \
--location=$PARAMETER_REGION \
--parameter-format=YAML
पैरामीटर का पहला वर्शन बनाएं
gcloud parametermanager parameters versions create $PARAMETER_VERSION \
--parameter=crema-config \
--project=$PROJECT_ID \
--location=$PARAMETER_REGION \
--payload-data-from-file=crema-config.yaml
पुष्टि करें कि पैरामीटर जोड़ दिया गया है
gcloud parametermanager parameters versions list \
--parameter=$PARAMETER_ID \
--location=$PARAMETER_REGION
आपको इस तरह की विंडो दिखेगी
projects/<YOUR_PROJECT_ID>/locations/global/parameters/crema-config/versions/1
8. CREMA सेवा को डिप्लॉय करना
इस सेक्शन में, CREMA की अपने-आप स्केल होने वाली सेवा को डिप्लॉय किया जाएगा. आपको सार्वजनिक तौर पर उपलब्ध इमेज का इस्तेमाल करना होगा.
- CREMA के लिए ज़रूरी एनवायरमेंट वैरिएबल सेट करें
CREMA_CONFIG_PARAM_VERSION=projects/$PROJECT_ID/locations/$PARAMETER_REGION/parameters/$PARAMETER_ID/versions/$PARAMETER_VERSION
- वर्शन के नाम के पाथ की पुष्टि करना
echo $CREMA_CONFIG_PARAM_VERSION
यह ऐसा दिखना चाहिए
projects/<YOUR_PROJECT>/locations/global/parameters/crema-config/versions/1
- CREMA इमेज के लिए env var सेट करें
IMAGE=us-central1-docker.pkg.dev/cloud-run-oss-images/crema-v1/autoscaler:1.0
- और CREMA सेवा को डिप्लॉय करें
ध्यान दें कि बेस इमेज ज़रूरी है.
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. लोड टेस्टिंग
- ऐसी स्क्रिप्ट बनाएं जो Pub/Sub विषय पर मैसेज पब्लिश करे
touch load-pubsub.sh
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
- स्केलिंग की प्रोसेस पर नज़र रखें. तीन से चार मिनट इंतज़ार करें. CREMA के लॉग देखें. इससे पता चलेगा कि यह नए authenticationRef कॉन्फ़िगरेशन के आधार पर इंस्टेंस का सुझाव दे रहा है या नहीं.
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 beta run worker-pools logs tail $CONSUMER_WORKER_POOL_NAME --region=$REGION
आपको इस तरह के लॉग दिखेंगे
Done job-100
10. समस्या का हल
सबसे पहले, आपको यह पता लगाना होगा कि समस्या CREMA सेवा के कॉन्फ़िगरेशन में है या PubSub उपभोक्ता के कॉन्फ़िगरेशन में.
PubSub उपभोक्ता के ऑटोसकेलर को 0 के बजाय 1 पर सेट करें. अगर यह Pub/Sub मैसेज को तुरंत प्रोसेस करना शुरू कर देता है, तो यह CREMA से जुड़ी समस्या है. अगर यह pubsub मैसेज प्रोसेस नहीं करता है, तो pubsub उपभोक्ता में कोई समस्या है.
11. बधाई हो!
कोडलैब पूरा करने के लिए बधाई!
हमारा सुझाव है कि आप Cloud Run का दस्तावेज़ पढ़ें.
हमने क्या-क्या शामिल किया है
- Pub/Sub विषय और सदस्यता बनाने का तरीका. साथ ही, उस विषय पर मैसेज पुश करने का तरीका.
- Pub/Sub से मैसेज पाने वाले Cloud Run वर्कर पूल (उपयोगकर्ता) को कैसे डिप्लॉय करें.
- CREMA प्रोजेक्ट को Cloud Run सेवा के तौर पर GitHub पर कैसे डिप्लॉय करें, ताकि Pub/Sub सदस्यता में मौजूद मैसेज की संख्या के आधार पर, वर्कर पूल अपने-आप स्केल हो जाए.
- स्थानीय तौर पर Python स्क्रिप्ट चलाकर, लोड जनरेट करके ऑटोस्केलिंग कॉन्फ़िगरेशन की जांच करने का तरीका.
12. व्यवस्थित करें
इस ट्यूटोरियल में इस्तेमाल किए गए संसाधनों के लिए, अपने Google Cloud खाते से शुल्क न लिए जाने के लिए, आपके पास दो विकल्प हैं. पहला, इस कोडलैब में बनाए गए संसाधनों को मिटाएं. दूसरा, पूरे प्रोजेक्ट को मिटाएं.
इस कोडलैब में इस्तेमाल किए गए संसाधनों को मिटाना
- Cloud Run CREMA सेवा मिटाना
gcloud run services delete $CREMA_SERVICE_NAME --region=$REGION --quiet
- Cloud Run वर्कर पूल के उपभोक्ता को मिटाना
gcloud beta run worker-pools delete $CONSUMER_WORKER_POOL_NAME --region=$REGION --quiet
- Pub/Sub सदस्यता और विषय मिटाएं
gcloud pubsub subscriptions delete $SUBSCRIPTION_ID --quiet
gcloud pubsub topics delete $TOPIC_ID --quiet
- पैरामीटर मैनेजर का कॉन्फ़िगरेशन मिटाएं
पैरामीटर में मौजूद वर्शन मिटाएं
gcloud parametermanager parameters versions delete $PARAMETER_VERSION \
--parameter=$PARAMETER_ID \
--location=$PARAMETER_REGION \
--quiet
अब खाली पैरामीटर मिटाएं
gcloud parametermanager parameters delete $PARAMETER_ID \
--location=$PARAMETER_REGION \
--quiet
- सेवा खाते मिटाना
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
इसके अलावा, पूरे प्रोजेक्ट को मिटाना
पूरे प्रोजेक्ट को मिटाने के लिए, संसाधन मैनेज करें पर जाएं. इसके बाद, दूसरे चरण में बनाया गया प्रोजेक्ट चुनें और मिटाएं को चुनें. प्रोजेक्ट मिटाने पर, आपको Cloud SDK में प्रोजेक्ट बदलने होंगे. gcloud projects list कमांड चलाकर, सभी उपलब्ध प्रोजेक्ट की सूची देखी जा सकती है.