پروکسی صریح رابط PSC Pipelines Vertex AI

۱. مقدمه

رابط اتصال سرویس خصوصی منبعی است که به یک شبکه ابر خصوصی مجازی (VPC) تولیدکننده اجازه می‌دهد تا اتصالاتی را به مقاصد مختلف در یک شبکه VPC مصرف‌کننده آغاز کند. شبکه‌های تولیدکننده و مصرف‌کننده می‌توانند در پروژه‌ها و سازمان‌های مختلف باشند.

اگر یک اتصال شبکه، اتصالی را از رابط Private Service Connect بپذیرد، Google Cloud یک آدرس IP از زیرشبکه مصرف‌کننده که توسط اتصال شبکه مشخص شده است، به رابط اختصاص می‌دهد. شبکه‌های مصرف‌کننده و تولیدکننده به هم متصل هستند و می‌توانند با استفاده از آدرس‌های IP داخلی ارتباط برقرار کنند.

اتصال بین یک اتصال شبکه و یک رابط Private Service Connect مشابه اتصال بین یک نقطه پایانی Private Service Connect و یک اتصال سرویس است، اما دو تفاوت کلیدی دارد:

  • یک اتصال شبکه به شبکه تولیدکننده اجازه می‌دهد تا اتصالاتی را به شبکه مصرف‌کننده آغاز کند (خروجی سرویس مدیریت‌شده)، در حالی که یک نقطه پایانی به شبکه مصرف‌کننده اجازه می‌دهد تا اتصالاتی را به شبکه تولیدکننده آغاز کند (ورودی سرویس مدیریت‌شده).
  • اتصال رابط Private Service Connect از نوع انتقالی است. این بدان معناست که یک شبکه تولیدکننده می‌تواند با شبکه‌های دیگری که به شبکه مصرف‌کننده متصل هستند، ارتباط برقرار کند.

ملاحظات دسترسی‌پذیری رابط کاربری PSC در Vertex AI

  • رابط PSC قادر به مسیریابی ترافیک به VPC یا مقصدهای مبتنی بر شبکه داخلی در بلوک آدرس RFC1918 است.
  • رابط PSC که بلوک‌های آدرس غیر rfc-1918 را هدف قرار می‌دهد، نیاز به یک پروکسی صریح مستقر در VPC مصرف‌کننده با آدرس rfc-1918 دارد. در استقرار Vertex AI، پروکسی باید همراه با یک FQDN از نقطه پایانی هدف تعریف شود. به شکل 1 مراجعه کنید که پروکسی صریح پیکربندی شده در VPCهای مشتریان را برای تسهیل مسیریابی به CIDRهای غیر rfc-1918 زیر نشان می‌دهد:

[1] 240.0.0.0/4

[2] 203.0.113.0/2

‎[3]10.10.20.0/28 نیازی به پروکسی ندارد، در محدوده rfc1918 قرار می‌گیرد.

  • وقتی که شما سیستم خود را فقط با رابط PSC پیکربندی می‌کنید، دسترسی پیش‌فرض به اینترنت حفظ می‌شود. این ترافیک خروجی مستقیماً از شبکه امن و تحت مدیریت گوگل خارج می‌شود.

476f87a96f153b95.png

ملاحظات رابط VPC-SC در Vertex AI PSC

  • وقتی پروژه شما بخشی از محیط کنترل‌های سرویس VPC است، دسترسی پیش‌فرض اینترنت مستاجران تحت مدیریت گوگل توسط محیط مسدود می‌شود تا از نشت داده‌ها جلوگیری شود.
  • برای اینکه در این سناریو به ماشین مجازی اجازه دسترسی به اینترنت عمومی داده شود، باید یک مسیر خروجی امن پیکربندی کنید که ترافیک را از طریق VPC شما هدایت کند. روش پیشنهادی برای دستیابی به این هدف، راه‌اندازی یک سرور پروکسی در محیط VPC شما با آدرس RFC1918 و ایجاد یک دروازه Cloud NAT است تا به ماشین مجازی پروکسی اجازه دسترسی به اینترنت را بدهد.

برای اطلاعات تکمیلی، به منابع زیر مراجعه کنید:

راه‌اندازی رابط سرویس خصوصی برای منابع هوش مصنوعی Vertex | گوگل کلود

آنچه خواهید ساخت

در این آموزش، شما قصد دارید یک پیاده‌سازی جامع از Vertex AI Pipelines با رابط Private Service Connect (PSC) ایجاد کنید تا امکان اتصال از تولیدکننده به رایانه مصرف‌کننده را فراهم کند، همانطور که در شکل 1 نشان داده شده است و نقاط پایانی غیر rfc-1928 را هدف قرار می‌دهد.

شکل ۲

782ba8f1f3c3f522.png

شما یک پیوست شبکه psc واحد در VPC مصرف‌کننده ایجاد خواهید کرد که از DNS peering برای حل مشکلات ماشین‌های مجازی مصرف‌کننده در پروژه مستاجر میزبان Vertex AI Training استفاده می‌کند و موارد استفاده زیر را به همراه خواهد داشت:

  1. Vertex AI Pipelines را مستقر کنید و یک ماشین مجازی پروکسی را طوری پیکربندی کنید که به عنوان یک پروکسی صریح عمل کند و به آن اجازه دهد wget را در برابر یک ماشین مجازی در زیرشبکه کلاس E انجام دهد.

آنچه یاد خواهید گرفت

  • نحوه ایجاد پیوست شبکه
  • چگونه یک تولیدکننده می‌تواند از یک اتصال شبکه برای ایجاد رابط PSC استفاده کند
  • نحوه برقراری ارتباط از تولیدکننده به مصرف‌کننده با استفاده از DNS Peering
  • نحوه برقراری ارتباط با فضای آدرس IP غیر rfc1918 از طریق Vertex AI Pipelines

آنچه نیاز دارید

پروژه ابری گوگل

مجوزهای IAM

۲. قبل از شروع

پروژه را برای پشتیبانی از آموزش به‌روزرسانی کنید

این آموزش از متغیرها (variables) برای کمک به پیاده‌سازی پیکربندی gcloud در Cloud Shell استفاده می‌کند.

درون Cloud Shell، موارد زیر را انجام دهید:

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid

فعال‌سازی API

درون Cloud Shell، موارد زیر را انجام دهید:

gcloud services enable "compute.googleapis.com"
gcloud services enable "aiplatform.googleapis.com"
gcloud services enable "dns.googleapis.com"
gcloud services enable "notebooks.googleapis.com"
gcloud services enable "storage.googleapis.com"
gcloud services enable "cloudresourcemanager.googleapis.com"
gcloud services enable "artifactregistry.googleapis.com"
gcloud services enable "cloudbuild.googleapis.com"

۳. تنظیمات مصرف‌کننده

ایجاد VPC مصرف‌کننده

درون Cloud Shell، موارد زیر را انجام دهید:

gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom

زیرشبکه‌های مصرف‌کننده را ایجاد کنید

درون Cloud Shell، موارد زیر را انجام دهید:

gcloud compute networks subnets create class-e-subnet --project=$projectid --range=240.0.0.0/4 --network=consumer-vpc --region=us-central1

درون Cloud Shell، موارد زیر را انجام دهید:

gcloud compute networks subnets create rfc1918-subnet1 --project=$projectid --range=10.10.10.0/28 --network=consumer-vpc --region=us-central1

زیرشبکه اتصال شبکه خصوصی (Private Service Connect Network Attachment subnet) را ایجاد کنید.

درون Cloud Shell، موارد زیر را انجام دهید:

gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1

پیکربندی روتر ابری و NAT

در این آموزش، از Cloud NAT برای فراهم کردن دسترسی به اینترنت برای ماشین مجازی پروکسی استفاده می‌شود که آدرس IP عمومی ندارد. Cloud NAT به ماشین‌های مجازی که فقط آدرس‌های IP خصوصی دارند، امکان اتصال به اینترنت را می‌دهد و به آنها اجازه می‌دهد کارهایی مانند نصب بسته‌های نرم‌افزاری را انجام دهند.

درون Cloud Shell، روتر ابری را ایجاد کنید.

gcloud compute routers create cloud-router-for-nat --network consumer-vpc --region us-central1

درون Cloud Shell، دروازه NAT را ایجاد کنید.

gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-for-nat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1 --enable-logging --log-filter=ALL

۴. فعال کردن پرداخت درون برنامه‌ای (IAP)

برای اینکه به IAP اجازه دهید به ماشین‌های مجازی شما متصل شود، یک قانون فایروال ایجاد کنید که:

  • برای تمام نمونه‌های ماشین مجازی که می‌خواهید با استفاده از IAP به آنها دسترسی داشته باشید، اعمال می‌شود.
  • اجازه ورود ترافیک از محدوده IP 35.235.240.0/20 را می‌دهد. این محدوده شامل تمام آدرس‌های IP است که IAP برای ارسال TCP استفاده می‌کند.

در داخل Cloud Shell، قانون فایروال IAP را ایجاد کنید.

gcloud compute firewall-rules create ssh-iap-consumer \
    --network consumer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

۵. ایجاد نمونه‌های ماشین مجازی مصرف‌کننده

درون Cloud Shell، نمونه ماشین مجازی مصرف‌کننده، class-e-vm، را ایجاد کنید.

gcloud compute instances create class-e-vm \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --shielded-secure-boot \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=class-e-subnet \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install tcpdump
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Class-e server !!' | tee /var/www/html/index.html
      EOF"

در داخل Cloud Shell، نمونه ماشین مجازی مصرف‌کننده، proxy-vm، را ایجاد کنید که به عنوان پروکسی صریح برای Vertex AI Pipelines عمل خواهد کرد. ما از tinyproxy به عنوان برنامه‌ای برای پروکسی ترافیک HTTP استفاده خواهیم کرد، اگرچه HTTPS نیز پشتیبانی می‌شود.

gcloud compute instances create proxy-vm \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --can-ip-forward \
    --shielded-secure-boot \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=rfc1918-subnet1 \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install tcpdump
      sudo apt-get install tinyproxy -y
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'proxy server !!' | tee /var/www/html/index.html
      EOF"

۶. اتصال شبکه سرویس خصوصی

پیوست‌های شبکه، منابع منطقه‌ای هستند که سمت مصرف‌کننده‌ی یک رابط Private Service Connect را نشان می‌دهند. شما یک زیرشبکه‌ی واحد را با یک پیوست شبکه مرتبط می‌کنید و تولیدکننده، IPها را از آن زیرشبکه به رابط Private Service Connect اختصاص می‌دهد. زیرشبکه باید در همان منطقه‌ی پیوست شبکه باشد. یک پیوست شبکه باید در همان منطقه‌ی سرویس تولیدکننده باشد.

پیوست شبکه را ایجاد کنید

درون Cloud Shell، پیوست شبکه را ایجاد کنید.

gcloud compute network-attachments create psc-network-attachment \
    --region=us-central1 \
    --connection-preference=ACCEPT_AUTOMATIC \
    --subnets=intf-subnet

فهرست کردن پیوست‌های شبکه

درون Cloud Shell، پیوست شبکه را فهرست کنید.

gcloud compute network-attachments list

پیوست‌های شبکه را شرح دهید

درون Cloud Shell، پیوست شبکه را شرح دهید.

gcloud compute network-attachments describe psc-network-attachment --region=us-central1

نام psc-network-attachment، psc-network-attachment، را که توسط تولیدکننده هنگام ایجاد رابط اتصال سرویس خصوصی استفاده خواهد شد، یادداشت کنید.

برای مشاهده آدرس اینترنتی پیوست شبکه PSC در Cloud Console، به مسیر زیر بروید:

سرویس‌های شبکه → اتصال سرویس خصوصی → پیوست شبکه → psc-network-attachment

e191e54a103d2222.png

۷. منطقه DNS خصوصی

شما یک منطقه DNS ابری برای demo.com ایجاد خواهید کرد و آن را با رکوردهای A که به آدرس‌های IP ماشین‌های مجازی شما اشاره می‌کنند، پر خواهید کرد. بعداً، DNS peering در کار Vertex AI Pipelines مستقر خواهد شد که به آن اجازه دسترسی به رکوردهای DNS مصرف‌کننده را می‌دهد.

درون Cloud Shell، موارد زیر را انجام دهید:

gcloud dns --project=$projectid managed-zones create private-dns-codelab --description="" --dns-name="demo.com." --visibility="private" --networks="https://compute.googleapis.com/compute/v1/projects/$projectid/global/networks/consumer-vpc"

در داخل Cloud Shell، برای بدست آوردن آدرس‌های IP مربوطه، یک توصیف روی نمونه‌های ماشین مجازی انجام دهید.

gcloud compute instances describe class-e-vm --zone=us-central1-a | grep  networkIP:

gcloud compute instances describe proxy-vm --zone=us-central1-a | grep  networkIP:

درون Cloud Shell، رکوردهای مربوط به ماشین مجازی، class-e-vm، را ایجاد کنید و مطمئن شوید که آدرس IP را بر اساس خروجی محیط خود به‌روزرسانی می‌کنید.

gcloud dns --project=$projectid record-sets create class-e-vm.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="240.0.0.2"

درون Cloud Shell، رکوردهای تنظیم‌شده برای ماشین مجازی، proxy-vm، را ایجاد کنید و مطمئن شوید که آدرس IP را بر اساس خروجی محیط خود به‌روزرسانی می‌کنید.

gcloud dns --project=$projectid record-sets create proxy-vm.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="10.10.10.2"

یک قانون فایروال ابری ایجاد کنید تا دسترسی از رابط PSC امکان‌پذیر باشد

در بخش بعدی، یک قانون فایروال ایجاد کنید که به ترافیک ناشی از PSC Network Attachment اجازه دسترسی به منابع محاسباتی RFC1918 در VPC مصرف‌کنندگان را بدهد.

در Cloud Shell، قانون فایروال ورودی را ایجاد کنید که امکان دسترسی از زیرشبکه PSC Network Attachment به ماشین مجازی پروکسی را فراهم می‌کند.

gcloud compute firewall-rules create allow-access-to-proxy \
    --network=consumer-vpc \
    --action=ALLOW \
    --rules=ALL \
    --direction=INGRESS \
    --priority=1000 \
    --source-ranges="192.168.10.0/28" \
    --destination-ranges="10.10.0.0/19" \
    --enable-logging

در Cloud Shell، قانون فایروال ورودی را ایجاد کنید که امکان دسترسی از زیرشبکه proxy-vm به زیرشبکه class-e را فراهم می‌کند.

gcloud compute firewall-rules create allow-access-to-class-e \
    --network=consumer-vpc \
    --action=ALLOW \
    --rules=ALL \
    --direction=INGRESS \
    --priority=1000 \
    --source-ranges="10.10.10.0/28" \
    --destination-ranges="240.0.0.0/4" \
    --enable-logging

۸. پروکسی صریح را به‌روزرسانی کنید

در بخش بعدی، باید از طریق ssh به پروکسی صریح دسترسی پیدا کنید و فایل پیکربندی tinyproxy.conf را به‌روزرسانی کنید و سپس آن را ریست کنید.

از پوسته ابری

gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid

فایل پیکربندی tinyproxy را باز کنید، با استفاده از یک ویرایشگر یا انتخاب خودتان آن را به‌روزرسانی کنید. در زیر مثالی با استفاده از VIM آورده شده است.

sudo vim /etc/tinyproxy/tinyproxy.conf

# Locate the "Listen" configuration line to restrict listening to only its private IP address of the Proxy-VM, rather than all interfaces. 

Listen 10.10.10.2

# Locate the "Allow" configuration line to allow requests ONLY from the PSC Network Attachment Subnet

Allow 192.168.10.0/24

Save the configs by the following steps:
1. Press the `ESC` key to enter Command Mode.
2. Type `:wq` to save (w) and quit (q).
3. Press `Enter`

Restart the tinyproxy service to apply the changes:
sudo systemctl restart tinyproxy

Validate the tinyproxy service is running:
sudo systemctl status tinyproxy

Perform an exit returning to cloud shell
exit

۹. یک دفترچه یادداشت ژوپیتر ایجاد کنید

بخش زیر شما را در ایجاد یک Jupyter Notebook راهنمایی می‌کند. این Notebook برای استقرار یک Vertex AI Pipelines Job استفاده می‌شود که یک wget از Vertex AI Pipelines به نمونه‌های آزمایشی ارسال می‌کند. مسیر داده بین Vertex AI Pipelines و شبکه مصرف‌کننده حاوی نمونه‌ها از یک رابط شبکه Private Service Connect استفاده می‌کند.

ایجاد یک حساب کاربری مدیریت‌شده توسط کاربر برای سرویس

در بخش بعدی، یک حساب کاربری سرویس ایجاد خواهید کرد که با نمونه Vertex AI Workbench که در آموزش استفاده شده است، مرتبط خواهد بود.

در این آموزش، حساب کاربری سرویس نقش‌های زیر را خواهد داشت:

در داخل Cloud Shell، حساب کاربری سرویس را ایجاد کنید.

gcloud iam service-accounts create notebook-sa \
    --display-name="notebook-sa"

در داخل Cloud Shell، حساب کاربری سرویس را با نقش Storage Admin به‌روزرسانی کنید.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.admin"

در داخل Cloud Shell، حساب کاربری سرویس را با نقش Vertex AI User به‌روزرسانی کنید.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"

در داخل Cloud Shell، حساب کاربری سرویس را با نقش Artifact Registry Admin به‌روزرسانی کنید.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"

درون Cloud Shell، حساب کاربری سرویس را با نقش Cloud Build Editor به‌روزرسانی کنید.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/cloudbuild.builds.editor"

در داخل Cloud Shell، به حساب سرویس نوت‌بوک اجازه دهید از حساب سرویس پیش‌فرض Compute Engine استفاده کند.

gcloud iam service-accounts add-iam-policy-binding \
    $(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)')-compute@developer.gserviceaccount.com \
    --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" \
    --role="roles/iam.serviceAccountUser"

۱۰. یک نمونه از میز کار Vertex AI ایجاد کنید

در بخش بعدی، یک نمونه Vertex AI Workbench ایجاد کنید که حساب سرویس قبلاً ایجاد شده، notebook-sa، را در خود جای دهد.

درون Cloud Shell، نمونه‌ی کلاینت خصوصی را ایجاد کنید.

gcloud workbench instances create workbench-tutorial --vm-image-project=cloud-notebooks-managed --vm-image-family=workbench-instances --machine-type=n1-standard-4 --location=us-central1-a --subnet-region=us-central1 --subnet=rfc1918-subnet1 --disable-public-ip --shielded-secure-boot=true --shielded-integrity-monitoring=true --shielded-vtpm=true --service-account-email=notebook-sa@$projectid.iam.gserviceaccount.com

۱۱. به‌روزرسانی عامل سرویس هوش مصنوعی ورتکس

Vertex AI از طرف شما برای انجام عملیاتی مانند دریافت آدرس IP از زیرشبکه پیوست شبکه PSC که برای ایجاد رابط PSC استفاده می‌شود، عمل می‌کند. برای انجام این کار، Vertex AI از یک عامل سرویس (که در زیر ذکر شده است) استفاده می‌کند که به مجوز مدیر شبکه نیاز دارد.

service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com

در داخل Cloud Shell، شماره پروژه خود را دریافت کنید.

gcloud projects describe $projectid | grep projectNumber

در داخل Cloud Shell، شماره پروژه خود را دریافت کنید.

gcloud projects describe $projectid | grep projectNumber
projectNumber: '234086459238'

در داخل Cloud Shell، شماره پروژه خود را تنظیم کنید.

projectnumber=YOUR-PROJECT-Number

در داخل Cloud Shell، یک حساب کاربری سرویس برای پلتفرم هوش مصنوعی ایجاد کنید. اگر در پروژه خود یک حساب کاربری سرویس دارید، از این مرحله صرف نظر کنید.

gcloud beta services identity create --service=aiplatform.googleapis.com --project=$projectnumber

در داخل Cloud Shell، حساب کاربری عامل سرویس را با نقش compute.networkAdmin به‌روزرسانی کنید.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"

در داخل Cloud Shell، حساب کاربری عامل سرویس را با نقش dns.peer به‌روزرسانی کنید.

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/dns.peer"

به‌روزرسانی حساب کاربری سرویس پیش‌فرض

رابط برنامه‌نویسی کاربردی موتور محاسبات (Compute Engine API) را فعال کنید و به حساب کاربری سرویس پیش‌فرض خود دسترسی به Vertex AI را اعطا کنید . توجه داشته باشید که ممکن است مدتی طول بکشد تا تغییر دسترسی اعمال شود.

درون Cloud Shell، حساب کاربری پیش‌فرض سرویس را با نقش aiplatform.user به‌روزرسانی کنید.

gcloud projects add-iam-policy-binding $projectid \
  --member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
    --role="roles/aiplatform.user"

در داخل Cloud Shell، حساب کاربری سرویس پیش‌فرض را با نقش storage.admin به‌روزرسانی کنید.

gcloud projects add-iam-policy-binding $projectid \
  --member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
    --role="roles/storage.admin"

در داخل Cloud Shell، حساب کاربری سرویس پیش‌فرض را با نقش storage.admin به‌روزرسانی کنید.

gcloud projects add-iam-policy-binding $projectid \
  --member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
    --role="roles/artifactregistry.admin"

۱۲. فعال کردن Tcpdump

برای اعتبارسنجی اتصال IP از Vertex AI Pipelines، می‌توانیم از TCPDUMP استفاده کنیم. این به ما امکان می‌دهد هنگام فراخوانی درخواست get از Vertex AI Pipelines به ماشین مجازی، class-e-vm.demo.com (240.0.0.0/4)، ارتباطاتی را که از زیرشبکه PSC Network Attachment، 192.168.10.0/28، سرچشمه می‌گیرد، مشاهده کنیم.

از Cloud Shell ssh به ماشین مجازی پروکسی.

gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid

از طریق سیستم عامل proxy-vm، فیلترینگ tcpdump را روی زیرشبکه اتصال شبکه class-e-vm و PSC اجرا کنید.

sudo tcpdump -i any net 240.0.0.0/4 or 192.168.10.0/28 -nn

یک تب جدید Cloud Shell باز کنید، متغیر پروژه خود را به‌روزرسانی کنید و با استفاده از ssh به class-e-vm دسترسی پیدا کنید.

gcloud compute ssh --zone us-central1-a "class-e-vm" --tunnel-through-iap --project $projectid

از سیستم عامل class-e-vm، فیلترینگ tcpdump را روی زیرشبکه proxy-vm اجرا کنید.

sudo tcpdump -i any net 10.10.10.0/28 -nn

۱۳. استقرار شغل Vertex AI Pipelines

در بخش بعدی، شما یک دفترچه یادداشت برای انجام یک wget موفق از Vertex AI Pipelines به پروکسی صریح ایجاد خواهید کرد. این به شما امکان می‌دهد به ماشین‌های مجازی غیر RFC 1918، مانند class-e-vm، دسترسی پیدا کنید. برای دسترسی Vertex AI Pipelines به rfc1918-vm، نیازی به پروکسی صریح نیست، زیرا هدف آن یک آدرس IP RFC 1918 است.

کار آموزشی را در نمونه Vertex AI Workbench اجرا کنید.

  1. در کنسول گوگل کلود، به تب نمونه‌ها در صفحه Vertex AI Workbench بروید.
  2. در کنار نام نمونه Vertex AI Workbench خود (workbench-tutorial)، روی Open JupyterLab کلیک کنید. نمونه Vertex AI Workbench شما در JupyterLab باز می‌شود.
  3. فایل > جدید > دفترچه یادداشت را انتخاب کنید
  4. هسته > پایتون ۳ را انتخاب کنید

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید.

# Install gcloud
!pip install google-cloud

# Install the pipeline required packages
!pip install --upgrade google-cloud-aiplatform \
                         google-cloud-storage \
                         kfp \
                         google-cloud-pipeline-components

# Import libraries
from time import gmtime, strftime
import json
import requests

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید، موارد زیر را به‌روزرسانی و اجرا کنید. مطمئن شوید که PROJECT_ID را با جزئیات محیط خود به‌روزرسانی می‌کنید.

import json
import requests
import pprint

PROJECT_ID = 'YOUR-PROJECT-ID' #Enter your project ID
PROJECT_NUMBER=!gcloud projects list --filter="project_id:$PROJECT_ID" --format="value(PROJECT_NUMBER)"
PROJECT_NUMBER=str(PROJECT_NUMBER).strip('[').strip(']').strip("'")
print(PROJECT_NUMBER)

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید.

# us-central1 is used for the codelab
REGION = "us-central1" #@param {type:"string"}
SERVICE_NAME = "aiplatform" #@param {type:"string"}
SERVICE ="{}.googleapis.com".format(SERVICE_NAME)
ENDPOINT="{}-{}.googleapis.com".format(REGION, SERVICE_NAME)
API_VERSION = "v1" # @param {type: "string"}

LOCATION = REGION

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و پیکربندی زیر را اجرا کنید، به نکات برجسته زیر توجه کنید:

  • proxy_server = "http://proxy-vm.demo.com:8888" FQDN با ماشین مجازی پروکسی مستقر در VPC مصرف‌کننده مرتبط است. ما در مرحله بعدی از DNS peering برای حل FQDN استفاده خواهیم کرد.
%%writefile main.py

import logging
import socket
import sys
import os

def make_api_request(url: str, proxy_vm_ip: str, proxy_vm_port: str):
    """
    Makes a GET request to a non-rfc1918 API and saves the response.

    Args:
        url: The URL of the API to send the request to.
    """
    import requests

    try:
        # response = requests.get(url)
        proxy_server = f"http://proxy-vm.demo.com:8888" # replace with you VM's IP and proxy port.

        proxies = {
          "http": proxy_server,
          "https": proxy_server,
        }

        response = requests.get(url, proxies=proxies)
        logging.info(response.text)

        response.raise_for_status()  # Raise an exception for bad status codes
        logging.info(f"Successfully fetched data from {url}")
    except requests.exceptions.RequestException as e:
        logging.error(f"An error occurred: {e}")
        raise e

if __name__ == '__main__':
  # Configure logging to print clearly to the console
  logging.basicConfig(
      level=logging.INFO,
      format='%(levelname)s: %(message)s',
      stream=sys.stdout
  )
  url_to_test = os.environ['NONRFC_URL']
  proxy_vm_ip = os.environ['PROXY_VM_IP']
  proxy_vm_port = os.environ['PROXY_VM_PORT']

  logging.info(f"url_to_test: {url_to_test}")
  logging.info(f"proxy_vm_ip: {proxy_vm_ip}")
  logging.info(f"proxy_vm_port: {proxy_vm_port}")
  make_api_request(url_to_test, proxy_vm_ip, proxy_vm_port)

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید.

%%writefile Dockerfile
FROM python:3.9-slim

RUN apt-get update && \
  apt-get install -y iputils-ping && \
  apt-get install -y wget

RUN pip install cloudml-hypertune requests kfp

COPY main.py /main.py

ENTRYPOINT ["python3", "/main.py"]

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید.

!gcloud artifacts repositories create pipelines-test-repo-psc --repository-format=docker --location=us-central1

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید.

IMAGE_PROJECT = PROJECT_ID
IMAGE_REPO = 'pipelines-test-repo-psc' 
IMAGE_NAME = 'nonrfc-ip-call'
TAG = 'v1'

IMAGE_URI= f'us-central1-docker.pkg.dev/{IMAGE_PROJECT}/{IMAGE_REPO}/{IMAGE_NAME}:{TAG}'
IMAGE_URI

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید.

!gcloud auth configure-docker us-docker.pkg.dev --quiet

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید. در صورت وجود خطا (gcloud.builds.submit) آن را نادیده بگیرید.

!gcloud builds submit --tag {IMAGE_URI} --region=us-central1

در نوت‌بوک JupyterLab خود، سلول زیر را ایجاد و اجرا کنید، به نکات برجسته زیر توجه کنید:

  • DNS Peering به VPC های مصرف کننده با استفاده از dnsPeeringConfigs (dnsPeeringConfigs) برای نام دامنه demo.com پیکربندی شده است.
  • پروکسی صریح، که به عنوان متغیر PROXY_VM_IP تعریف شده است، proxy-vm.demo.com است. تفکیک از طریق DNS peering در VPC مصرف‌کننده انجام می‌شود.
  • پورت ۸۸۸۸ پورتی است که به صورت پیش‌فرض در tinyproxy پیکربندی شده و در حال گوش دادن به اطلاعات است.
  • دستور wget به class-e-vm-demo.com از طریق DNS peering قابل اجرا است.
  • این کد، "psc-network-attachment" را برای Vertex مشخص می‌کند و آن را قادر می‌سازد تا از زیرشبکه‌ی اتصال شبکه برای استقرار دو نمونه‌ی رابط PSC استفاده کند.
import json
from datetime import datetime


JOB_ID_PREFIX='test_psci-nonRFC' #@param {type:"string"}
JOB_ID = '{}_{}'.format(JOB_ID_PREFIX, datetime.now().strftime("%Y%m%d%H%M%S"))

# PSC-I configs

PRODUCER_PROJECT_ID = PROJECT_ID
DNS_DOMAIN = 'class-e-vm.demo.com' #@param {type:"string"}
NON_RFC_URL = f"http://{DNS_DOMAIN}"

PROXY_VM_IP = "proxy-vm.demo.com" #@param {type:"string"}
PROXY_VM_PORT = "8888" #@param {type:"string"}

CUSTOM_JOB = {
  "display_name": JOB_ID,
  "job_spec": {
      "worker_pool_specs": [
          {
           "machine_spec": {
             "machine_type": "n1-standard-4",
           },
           "replica_count": 1,
           "container_spec": {
             "image_uri": IMAGE_URI,
             "env": [{
               "name": "NONRFC_URL",
               "value": NON_RFC_URL
             },
             {
               "name": "PROXY_VM_IP",
               "value": PROXY_VM_IP
             },
             {
               "name": "PROXY_VM_PORT",
               "value": PROXY_VM_PORT
             }]
           },
         },
      ],
      "enable_web_access": True,
      "psc_interface_config": {
        "network_attachment": "psc-network-attachment",
        "dns_peering_configs": [
          {
            "domain": "demo.com.",
            "target_project": PROJECT_ID,
            "target_network": "consumer-vpc"
          },
        ]
      },
  }
}

print(json.dumps(CUSTOM_JOB, indent=2))

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید.

import requests
bearer_token = !gcloud auth application-default print-access-token
headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer {}'.format(bearer_token[0]),
}

request_uri = f"https://{REGION}-aiplatform.googleapis.com/{API_VERSION}/projects/{PROJECT_NUMBER}/locations/{REGION}/customJobs/"

print("request_uri: ", request_uri)

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید.

response_autopush = requests.post(request_uri, json=CUSTOM_JOB, headers=headers)
response = response_autopush
print("response:", response)
if response.reason == 'OK':
  job_name = response.json()['name']
  job_id = job_name.split('/')[-1]
  print("Created Job: ", response.json()['name'])
else:
  print(response.text)

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید.

# Print KFP SDK version (should be >= 1.6)
! python3 -c "import kfp; print('KFP SDK version: {}'.format(kfp.__version__))"

# Print AI Platform version
! python3 -c "from google.cloud import aiplatform; print('AI Platform version: {}'.format(aiplatform.__version__))"

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید.

BUCKET_URI = "your-unique-bucket" # Provide a globally unique bucket name

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید.

!gcloud storage buckets create gs://{BUCKET_URI}

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید.

# pipeline parameters
CACHE_PIPELINE = False # @param {type: "string"}
_DEFAULT_IMAGE = IMAGE_URI
BUCKET_URI = "gs://{BUCKET_URI}"  # @param {type: "string"}
PIPELINE_ROOT = f"{BUCKET_URI}/pipeline_root/intro"
PIPELINE_DISPLAY_NAME = "pipeline_nonRFCIP" # @param {type: "string"}

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید.

from re import S
import kfp
from kfp import dsl
from kfp.dsl import container_component, ContainerSpec
from kfp import compiler
from google.cloud import aiplatform


# ==== Component with env variable ====

@container_component
def dns_peering_test_op(dns_domain: str, proxy_vm_ip:str, proxy_vm_port:str):
    return ContainerSpec(
        image=_DEFAULT_IMAGE,
        command=["bash", "-c"],
        args=[
            ""&&;"
            apt-get update  apt-get install inetutils-traceroute inetutils-ping netcat-openbsd curl -y

            echo "Local IP(s): $(hostname -I)"

            echo "Attempting to trace route to %s"
            traceroute -w 1 -m 7 "%s"

            echo "Sending curl requests to http://%s via proxy %s:%s and recording trace..."
            if curl -L -v --trace-ascii /dev/stdout -x http://%s:%s "http://%s"; then
                echo "Curl request succeeded!"
            else
                echo "Curl request failed!"
                exit 1
            fi
            """ % (dns_domain, dns_domain, dns_domain, proxy_vm_ip, proxy_vm_port, proxy_vm_ip, proxy_vm_port, dns_domain)

        ]
    )

# ==== Pipeline ====
@dsl.pipeline(
    name="dns-peering-test-pipeline",
    description="Test DNS Peering using env variable",
    pipeline_root=PIPELINE_ROOT,
)
def dns_peering_test_pipeline(dns_domain: str, proxy_vm_ip:str, proxy_vm_port:str):
    dns_test_task = dns_peering_test_op(dns_domain=dns_domain, proxy_vm_ip=proxy_vm_ip, proxy_vm_port=proxy_vm_port)
    dns_test_task.set_caching_options(enable_caching=CACHE_PIPELINE)

# ==== Compile pipeline ====
if __name__ == "__main__":
    aiplatform.init(project=PROJECT_ID, location=LOCATION)

    compiler.Compiler().compile(
        pipeline_func=dns_peering_test_pipeline,
        package_path="dns_peering_test_pipeline.yaml",
    )
    print("✅ Pipeline compiled to dns_peering_test_pipeline.yaml")

در نوت‌بوک JupyterLab خود، یک سلول جدید ایجاد کنید و دستور زیر را اجرا کنید.

# Define the PipelineJob body; see API Reference https://cloud.google.com/vertex-ai/docs/reference/rest/v1/projects.locations.pipelineJobs/create

import requests, json
import datetime

bearer_token = !gcloud auth application-default print-access-token
headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer {}'.format(bearer_token[0]),
}

request_uri = f"https://{REGION}-aiplatform.googleapis.com/{API_VERSION}/projects/{PROJECT_NUMBER}/locations/{REGION}/pipelineJobs/"

print("request_uri: ", request_uri)

۱۴. اعتبارسنجی رابط PSC

همچنین می‌توانید IPهای اتصال شبکه مورد استفاده توسط Vertax AI Pipelines را با رفتن به مسیر زیر مشاهده کنید:

سرویس‌های شبکه → اتصال سرویس خصوصی → پیوست شبکه → psc-network-attachment

پروژه مستاجر را انتخاب کنید (نام پروژه به -tp ختم می‌شود)

f47150235fedb8ce.png

فیلد هایلایت شده، آدرس IP مورد استفاده توسط Vertex AI Pipelines از پیوست شبکه PSC را نشان می‌دهد.

39e7b251aeb4f191.png

۱۵. اعتبارسنجی ثبت وقایع ابری

اجرای اولین بار Vertex AI Pipelines تقریباً ۱۴ دقیقه طول می‌کشد، اجراهای بعدی بسیار کوتاه‌تر هستند. برای اعتبارسنجی یک نتیجه موفقیت‌آمیز، موارد زیر را انجام دهید:

به Vertex AI → Training → Custom jobs بروید

کار سفارشی اجرا شده را انتخاب کنید

a9be0395c842aa6f.png

مشاهده گزارش‌ها را انتخاب کنید

53e30765ba5827f3.png

پس از در دسترس قرار گرفتن Cloud Logging، گزینه Run Query را انتخاب کنید که گزینه هایلایت شده زیر را ایجاد می‌کند و تایید می‌کند که wget از Vertex AI Pipelines به class-e-vm با موفقیت انجام شده است.

f2c5d9fdf5cc8bed.png

3b3788603bb433ee.png

۱۶. اعتبارسنجی TCPDump

بیایید خروجی TCPDUMP را که اتصال به نمونه‌های محاسباتی را بیشتر تأیید می‌کند، بررسی کنیم:

از proxy-vm، HTTP GET و 200 OK را مشاهده کنید.

03:05:34.778574 ens4  Out IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 1:63, ack 1, win 511, options [nop,nop,TS val 1435446009 ecr 2475360885], length 62: HTTP: GET / HTTP/1.0
03:05:34.778946 ens4  In  IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 63, win 506, options [nop,nop,TS val 2475360889 ecr 1435446009], length 0
03:05:34.778974 ens4  Out IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 63:185, ack 1, win 511, options [nop,nop,TS val 1435446010 ecr 2475360889], length 122: HTTP
03:05:34.781999 ens4  In  IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 185, win 506, options [nop,nop,TS val 2475360892 ecr 1435446010], length 0
03:05:34.906678 ens4  In  IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [P.], seq 1:265, ack 185, win 506, options [nop,nop,TS val 2475361016 ecr 1435446010], length 264: HTTP: HTTP/1.1 200 OK

از کلاس-e-vm، HTTP GET و 200 OK را مشاهده کنید.

03:05:34.778768 ens4  In  IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 1:63, ack 1, win 511, options [nop,nop,TS val 1435446009 ecr 2475360885], length 62: HTTP: GET / HTTP/1.0
03:05:34.778819 ens4  Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 63, win 506, options [nop,nop,TS val 2475360889 ecr 1435446009], length 0
03:05:34.781815 ens4  In  IP 10.10.10.2.40326 > 240.0.0.2.80: Flags [P.], seq 63:185, ack 1, win 511, options [nop,nop,TS val 1435446010 ecr 2475360889], length 122: HTTP
03:05:34.781856 ens4  Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [.], ack 185, win 506, options [nop,nop,TS val 2475360892 ecr 1435446010], length 0
03:05:34.906503 ens4  Out IP 240.0.0.2.80 > 10.10.10.2.40326: Flags [P.], seq 1:265, ack 185, win 506, options [nop,nop,TS val 2475361016 ecr 1435446010], length 264: HTTP: HTTP/1.1 200 OK

۱۷. تمیز کردن

از Cloud Shell، اجزای آموزشی را حذف کنید.

gcloud compute instances delete proxy-vm --zone=us-central1-a --quiet

gcloud compute instances delete workbench-tutorial --zone=us-central1-a --quiet

gcloud compute routers delete cloud-router-for-nat --region=us-central1 --quiet

gcloud compute network-attachments delete psc-network-attachment --region=us-central1 --quiet

gcloud compute networks subnets delete intf-subnet rfc1918-subnet1 --region=us-central1 --quiet

gcloud dns record-sets delete class-e-vm.demo.com --zone=private-dns-codelab  --type=A
gcloud dns record-sets delete proxy-vm.demo.com --zone=private-dns-codelab  --type=A

gcloud dns managed-zones delete private-dns-codelab
gcloud compute networks delete consumer-vpc --quiet

۱۸. تبریک

تبریک می‌گوییم، شما با موفقیت یک رابط اتصال سرویس خصوصی با Vertex AI Pipelines پیکربندی و اعتبارسنجی کردید.

شما زیرساخت مصرف‌کننده را ایجاد کردید و یک پیوست شبکه اضافه کردید که به تولیدکننده اجازه می‌دهد یک ماشین مجازی چندکاره برای ایجاد پل ارتباطی بین مصرف‌کننده و تولیدکننده ایجاد کند. شما یاد گرفتید که چگونه DNS peering ایجاد کنید و در عین حال یک پروکسی صریح در شبکه VPC مصرف‌کننده مستقر کنید که امکان اتصال به نمونه class-e-vm را که مستقیماً از Vertex قابل مسیریابی نیست، فراهم می‌کند.

کازموپاپ فکر می‌کند آموزش‌ها فوق‌العاده هستند!!

c911c127bffdee57.jpeg

بعدش چی؟

مطالعه بیشتر و ویدیوها

اسناد مرجع