1. Giới thiệu
Giao diện Private Service Connect là một tài nguyên cho phép mạng Đám mây riêng ảo (VPC) của nhà sản xuất bắt đầu kết nối với nhiều đích đến trong mạng VPC của người dùng. Mạng nhà sản xuất và mạng người tiêu dùng có thể nằm trong các dự án và tổ chức khác nhau.
Nếu một tệp đính kèm mạng chấp nhận kết nối từ một giao diện Kết nối dịch vụ riêng tư, thì Google Cloud sẽ phân bổ cho giao diện đó một địa chỉ IP từ mạng con của người dùng do tệp đính kèm mạng chỉ định. Các mạng lưới người tiêu dùng và nhà sản xuất được kết nối và có thể giao tiếp bằng cách sử dụng địa chỉ IP nội bộ.
Mối kết nối giữa một tệp đính kèm mạng và một giao diện Private Service Connect tương tự như mối kết nối giữa một điểm cuối Private Service Connect và một tệp đính kèm dịch vụ, nhưng có 2 điểm khác biệt chính:
- Tệp đính kèm mạng cho phép mạng nhà sản xuất bắt đầu kết nối với mạng người tiêu dùng (dịch vụ được quản lý theo chiều đi), trong khi điểm cuối cho phép mạng người tiêu dùng bắt đầu kết nối với mạng nhà sản xuất (dịch vụ được quản lý theo chiều đến).
- Kết nối giao diện Private Service Connect là kết nối bắc cầu. Điều này có nghĩa là mạng nhà sản xuất có thể giao tiếp với các mạng khác được kết nối với mạng người tiêu dùng.
Những điểm cần cân nhắc về khả năng tiếp cận PSC-Interface của Vertex AI
- PSC-Interface có khả năng định tuyến lưu lượng truy cập đến VPC hoặc các đích đến tại chỗ trong khối địa chỉ RFC1918.
- PSC-Interface nhắm đến các khối địa chỉ không phải rfc-1918 yêu cầu một proxy rõ ràng được triển khai trong VPC của người dùng có địa chỉ rfc-1918. Trong quá trình triển khai Vertex AI, bạn phải xác định proxy cùng với FQDN của điểm cuối mục tiêu. Xem hình 1 minh hoạ proxy rõ ràng được định cấu hình trong VPC của khách hàng để tạo điều kiện định tuyến đến các CIDR không phải rfc-1918 sau đây:
[1] 240.0.0.0/4
[2] 203.0.113.0/2
[3]10.10.20.0/28 không cần proxy, nằm trong dải rfc1918.
- Khi bạn chỉ định cấu hình triển khai bằng Giao diện PSC, cấu hình đó sẽ giữ lại quyền truy cập Internet mặc định. Lưu lượng truy cập đi ra này sẽ thoát trực tiếp từ mạng lưới người thuê an toàn do Google quản lý.
Những điểm cần lưu ý về VPC-SC PSC-Interface của Vertex AI
- Khi dự án của bạn nằm trong ranh giới VPC Service Controls, quyền truy cập Internet mặc định của các đối tượng thuê do Google quản lý sẽ bị ranh giới chặn để ngăn chặn hành vi trích xuất dữ liệu.
- Để cho phép hoạt động triển khai truy cập vào Internet công cộng trong trường hợp này, bạn phải định cấu hình rõ ràng một đường dẫn truyền dữ liệu an toàn để định tuyến lưu lượng truy cập thông qua VPC của bạn. Cách được đề xuất để đạt được điều này là thiết lập một máy chủ proxy bên trong chu vi VPC bằng địa chỉ RFC1918 và tạo một cổng Cloud NAT để cho phép VM proxy truy cập vào Internet.
Để biết thêm thông tin, hãy tham khảo các tài nguyên sau:
Thiết lập giao diện Private Service Connect cho các tài nguyên Vertex AI | Google Cloud
Sản phẩm bạn sẽ tạo ra
Trong hướng dẫn này, bạn sẽ tạo một quy trình triển khai toàn diện Vertex AI Pipelines bằng Giao diện Kết nối dịch vụ riêng tư (PSC) để cho phép kết nối từ nhà sản xuất đến tài nguyên điện toán của người dùng như minh hoạ trong Hình 1 nhắm đến các điểm cuối không phải rfc-1928.
Hình 2
Bạn sẽ tạo một psc-network-attachment duy nhất trong VPC của người tiêu dùng bằng cách tận dụng tính năng kết nối ngang hàng DNS để phân giải các máy ảo của người tiêu dùng trong dự án thuê bao lưu trữ Vertex AI Training, dẫn đến các trường hợp sử dụng sau:
- Triển khai Vertex AI Pipelines và định cấu hình một VM proxy để hoạt động như một proxy tường minh, cho phép VM này thực hiện một wget đối với một VM trong mạng con Lớp E.
Kiến thức bạn sẽ học được
- Cách tạo thiết bị lưu trữ mạng
- Cách nhà sản xuất có thể sử dụng tệp đính kèm mạng để tạo giao diện PSC
- Cách thiết lập giao tiếp từ nhà sản xuất đến người tiêu dùng bằng cách sử dụng tính năng DNS Peering
- Cách thiết lập giao tiếp với không gian địa chỉ IP ngoài rfc1918 từ Vertex AI Pipelines
Bạn cần có
Dự án trên Google Cloud
Quyền IAM
- Quản trị viên mạng máy tính (roles/compute.networkAdmin)
- Quản trị viên phiên bản máy tính (roles/compute.instanceAdmin)
- Quản trị viên bảo mật điện toán (roles/compute.securityAdmin)
- Quản trị viên DNS (roles/dns.admin)
- Người dùng đường hầm được bảo mật bằng IAP (roles/iap.tunnelResourceAccessor)
- Quản trị viên ghi nhật ký (roles/logging.admin)
- Quản trị viên Notebook (roles/notebooks.admin)
- Quản trị viên IAM dự án (roles/resourcemanager.projectIamAdmin)
- Quản trị viên tài khoản dịch vụ (roles/iam.serviceAccountAdmin)
- Quản trị viên sử dụng dịch vụ (roles/serviceusage.serviceUsageAdmin)
2. Trước khi bắt đầu
Cập nhật dự án để hỗ trợ hướng dẫn
Hướng dẫn này sử dụng $variables để hỗ trợ việc triển khai cấu hình gcloud trong Cloud Shell.
Trong Cloud Shell, hãy thực hiện các bước sau:
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
Bật API
Trong Cloud Shell, hãy thực hiện các bước sau:
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"
3. Thiết lập người tiêu dùng
Tạo VPC người tiêu dùng
Trong Cloud Shell, hãy thực hiện các bước sau:
gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom
Tạo mạng con của người tiêu dùng
Trong Cloud Shell, hãy thực hiện các bước sau:
gcloud compute networks subnets create class-e-subnet --project=$projectid --range=240.0.0.0/4 --network=consumer-vpc --region=us-central1
Trong Cloud Shell, hãy thực hiện các bước sau:
gcloud compute networks subnets create rfc1918-subnet1 --project=$projectid --range=10.10.10.0/28 --network=consumer-vpc --region=us-central1
Tạo mạng con Đính kèm mạng Kết nối dịch vụ riêng tư
Trong Cloud Shell, hãy thực hiện các bước sau:
gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1
Cấu hình Cloud Router và NAT
Trong hướng dẫn này, Cloud NAT được dùng để cung cấp quyền truy cập Internet cho VM proxy (không có địa chỉ IP công khai). Cloud NAT giúp các máy ảo chỉ có địa chỉ IP riêng tư kết nối với Internet, cho phép các máy ảo này thực hiện những tác vụ như cài đặt các gói phần mềm.
Trong Cloud Shell, hãy tạo bộ định tuyến đám mây.
gcloud compute routers create cloud-router-for-nat --network consumer-vpc --region us-central1
Trong Cloud Shell, hãy tạo cổng 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
4. Bật IAP
Để cho phép IAP kết nối với các phiên bản máy ảo, hãy tạo một quy tắc tường lửa có:
- Áp dụng cho tất cả các phiên bản máy ảo mà bạn muốn có thể truy cập bằng IAP.
- Cho phép lưu lượng truy cập vào từ dải IP 35.235.240.0/20. Dải địa chỉ này chứa tất cả địa chỉ IP mà IAP sử dụng để chuyển tiếp TCP.
Trong Cloud Shell, hãy tạo quy tắc tường lửa IAP.
gcloud compute firewall-rules create ssh-iap-consumer \
--network consumer-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20
5. Tạo phiên bản máy ảo cho người tiêu dùng
Trong Cloud Shell, hãy tạo phiên bản vm người dùng, 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"
Trong Cloud Shell, hãy tạo phiên bản máy ảo người dùng (consumer VM), proxy-vm. Phiên bản này sẽ đóng vai trò là proxy rõ ràng cho Vertex AI Pipelines. Chúng ta sẽ sử dụng tinyproxy làm ứng dụng để chuyển lưu lượng truy cập HTTP qua proxy, mặc dù HTTPS cũng được hỗ trợ.
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"
6. Tệp đính kèm mạng Kết nối dịch vụ riêng tư
Tệp đính kèm mạng là tài nguyên theo khu vực, đại diện cho phía người dùng của một giao diện Private Service Connect. Bạn liên kết một mạng con duy nhất với một tệp đính kèm mạng và nhà sản xuất sẽ chỉ định IP cho giao diện Private Service Connect từ mạng con đó. Mạng con phải ở cùng khu vực với thiết bị đính kèm mạng. Thiết bị đính kèm mạng phải ở cùng khu vực với dịch vụ nhà sản xuất.
Tạo tệp đính kèm mạng
Trong Cloud Shell, hãy tạo tệp đính kèm mạng.
gcloud compute network-attachments create psc-network-attachment \
--region=us-central1 \
--connection-preference=ACCEPT_AUTOMATIC \
--subnets=intf-subnet
Liệt kê các tệp đính kèm mạng
Trong Cloud Shell, hãy liệt kê các tệp đính kèm mạng.
gcloud compute network-attachments list
Mô tả các tệp đính kèm mạng
Trong Cloud Shell, hãy mô tả network attachment.
gcloud compute network-attachments describe psc-network-attachment --region=us-central1
Ghi lại tên psc-network-attachment, psc-network-attachment mà nhà sản xuất sẽ dùng khi tạo Giao diện Kết nối dịch vụ riêng tư.
Để xem URL của Network Attachment (Tệp đính kèm mạng) PSC trong Cloud Console, hãy chuyển đến:
Network Services (Dịch vụ mạng) → Private Service Connect (Kết nối dịch vụ riêng tư) → Network Attachment (Tệp đính kèm mạng) → psc-network-attachment
7. Vùng DNS riêng
Bạn sẽ tạo một Vùng DNS trên đám mây cho demo.com và điền sẵn các bản ghi A trỏ đến địa chỉ IP của các VM. Sau đó, tính năng kết nối DNS sẽ được triển khai trong quy trình Vertex AI Pipelines, cho phép quy trình này truy cập vào các bản ghi DNS của người dùng.
Trong Cloud Shell, hãy thực hiện các bước sau:
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"
Trong Cloud Shell, hãy thực hiện thao tác mô tả đối với các phiên bản máy ảo để lấy Địa chỉ IP tương ứng.
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:
Trong Cloud Shell, hãy tạo bộ bản ghi cho VM, class-e-vm, nhớ cập nhật Địa chỉ IP dựa trên đầu ra của môi trường.
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"
Trong Cloud Shell, hãy tạo bộ bản ghi cho VM, proxy-vm, nhớ cập nhật Địa chỉ IP dựa trên đầu ra của môi trường.
gcloud dns --project=$projectid record-sets create proxy-vm.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="10.10.10.2"
Tạo quy tắc Tường lửa trên đám mây để cho phép truy cập từ Giao diện PSC
Trong phần sau, hãy tạo một quy tắc tường lửa cho phép lưu lượng truy cập bắt nguồn từ các tài nguyên điện toán RFC1918 có quyền truy cập vào PSC Network Attachment trong VPC của người dùng.
Trong Cloud Shell, hãy tạo quy tắc tường lửa cho phép lưu lượng truy cập từ mạng con PSC Network Attachment đến proxy-vm.
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
Trong Cloud Shell, hãy tạo quy tắc tường lửa cho phép lưu lượng truy cập từ mạng con proxy-vm đến mạng con 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
8. Cập nhật proxy tường minh
Trong phần sau, bạn sẽ cần ssh vào proxy tường minh và cập nhật tệp cấu hình tinyproxy.conf, sau đó thực hiện thao tác đặt lại.
Từ Cloud Shell
gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid
Mở tệp cấu hình tinyproxy, cập nhật bằng trình chỉnh sửa hoặc lựa chọn của bạn. Dưới đây là ví dụ về cách sử dụng 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
9. Tạo một sổ tay Jupyter
Phần sau đây hướng dẫn bạn cách tạo một Sổ tay Jupyter. Sổ tay này sẽ được dùng để triển khai một Vertex AI Pipelines Job gửi wget từ Vertex AI Pipelines đến các phiên bản thử nghiệm. Datapath giữa Vertex AI Pipelines và mạng người dùng chứa các thực thể sử dụng Giao diện mạng kết nối dịch vụ riêng tư.
Tạo tài khoản dịch vụ do người dùng quản lý
Trong phần sau, bạn sẽ tạo một tài khoản dịch vụ được liên kết với phiên bản Vertex AI Workbench dùng trong hướng dẫn này.
Trong hướng dẫn này, tài khoản dịch vụ sẽ có các vai trò sau:
- Quản trị viên lưu trữ
- Người dùng Vertex AI
- Quản trị viên Artifact Registry
- Trình chỉnh sửa Cloud Build
- Người dùng tài khoản dịch vụ IAM
Trong Cloud Shell, hãy tạo tài khoản dịch vụ.
gcloud iam service-accounts create notebook-sa \
--display-name="notebook-sa"
Trong Cloud Shell, hãy cập nhật tài khoản dịch vụ bằng vai trò Quản trị viên bộ nhớ.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.admin"
Trong Cloud Shell, hãy cập nhật tài khoản dịch vụ bằng vai trò Người dùng Vertex AI.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"
Trong Cloud Shell, hãy cập nhật tài khoản dịch vụ bằng vai trò Quản trị viên Artifact Registry.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"
Trong Cloud Shell, hãy cập nhật tài khoản dịch vụ bằng vai trò Cloud Build Editor.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/cloudbuild.builds.editor"
Trong Cloud Shell, hãy cho phép tài khoản dịch vụ sổ tay sử dụng tài khoản dịch vụ mặc định của 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"
10. Tạo một phiên bản Vertex AI Workbench
Trong phần sau, hãy tạo một phiên bản Vertex AI Workbench kết hợp tài khoản dịch vụ đã tạo trước đó, notebook-sa.
Tạo phiên bản ứng dụng khách riêng tư trong 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
11. Cập nhật tác nhân dịch vụ Vertex AI
Vertex AI thay mặt bạn thực hiện các thao tác như lấy Địa chỉ IP từ mạng con PSC Network Attachment (Tệp đính kèm mạng PSC) dùng để tạo Giao diện PSC. Để làm như vậy, Vertex AI sử dụng một tác nhân dịch vụ (được liệt kê bên dưới) yêu cầu quyền Quản trị viên mạng.
service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com
Trong Cloud Shell, hãy lấy số dự án của bạn.
gcloud projects describe $projectid | grep projectNumber
Trong Cloud Shell, hãy lấy số dự án của bạn.
gcloud projects describe $projectid | grep projectNumber
projectNumber: '234086459238'
Trong Cloud Shell, hãy đặt số dự án của bạn.
projectnumber=YOUR-PROJECT-Number
Trong Cloud Shell, hãy tạo một tài khoản dịch vụ cho AI Platform. Bỏ qua bước này nếu bạn đã có tài khoản dịch vụ trong dự án của mình.
gcloud beta services identity create --service=aiplatform.googleapis.com --project=$projectnumber
Trong Cloud Shell, hãy cập nhật tài khoản đơn vị hỗ trợ dịch vụ bằng vai trò compute.networkAdmin.
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"
Trong Cloud Shell, hãy cập nhật tài khoản đơn vị hỗ trợ dịch vụ bằng vai trò dns.peer
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/dns.peer"
Cập nhật tài khoản dịch vụ mặc định
Bật Compute Engine API và cấp cho tài khoản dịch vụ mặc định của bạn quyền truy cập vào Vertex AI. Xin lưu ý rằng có thể mất một thời gian để thay đổi về quyền truy cập có hiệu lực.
Trong Cloud Shell, hãy cập nhật tài khoản dịch vụ mặc định bằng vai trò aiplatform.user
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/aiplatform.user"
Trong Cloud Shell, hãy cập nhật tài khoản dịch vụ mặc định bằng vai trò storage.admin
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/storage.admin"
Trong Cloud Shell, hãy cập nhật tài khoản dịch vụ mặc định bằng vai trò storage.admin
gcloud projects add-iam-policy-binding $projectid \
--member="serviceAccount:$projectnumber-compute@developer.gserviceaccount.com" \
--role="roles/artifactregistry.admin"
12. Bật Tcpdump
Để xác thực khả năng kết nối IP từ Vertex AI Pipelines, chúng ta có thể sử dụng TCPDUMP. Điều này sẽ cho phép chúng tôi quan sát hoạt động giao tiếp bắt nguồn từ mạng con PSC Network Attachment, 192.168.10.0/28 khi gọi yêu cầu get từ Vertex AI Pipelines đến vm, class-e-vm.demo.com (240.0.0.0/4).
Từ Cloud Shell, hãy ssh vào vm proxy.
gcloud compute ssh --zone us-central1-a "proxy-vm" --tunnel-through-iap --project $projectid
Từ hệ điều hành proxy-vm, hãy thực thi tính năng lọc tcpdump trên lớp-e-vm và mạng con đính kèm mạng PSC.
sudo tcpdump -i any net 240.0.0.0/4 or 192.168.10.0/28 -nn
Mở một thẻ Cloud Shell mới, cập nhật biến dự án và ssh vào class-e-vm
gcloud compute ssh --zone us-central1-a "class-e-vm" --tunnel-through-iap --project $projectid
Từ hệ điều hành class-e-vm, hãy thực thi tính năng lọc tcpdump trên mạng con proxy-vm.
sudo tcpdump -i any net 10.10.10.0/28 -nn
13. Triển khai công việc Vertex AI Pipelines
Trong phần tiếp theo, bạn sẽ tạo một sổ tay để thực hiện thành công lệnh wget từ Vertex AI Pipelines đến proxy rõ ràng. Điều này cho phép bạn truy cập vào các máy ảo không phải RFC 1918, chẳng hạn như class-e-vm. Vertex AI Pipelines không cần có proxy rõ ràng để truy cập vào rfc1918-vm, vì mục tiêu của proxy này là địa chỉ IP RFC 1918.
Chạy quy trình huấn luyện trong phiên bản Vertex AI Workbench.
- Trong bảng điều khiển Google Cloud, hãy chuyển đến thẻ phiên bản trên trang Vertex AI Workbench.
- Bên cạnh tên phiên bản Vertex AI Workbench (workbench-tutorial), hãy nhấp vào Open JupyterLab (Mở JupyterLab). Phiên bản Vertex AI Workbench của bạn sẽ mở ra trong JupyterLab.
- Chọn Tệp > Mới > Sổ tay
- Chọn Kernel > Python 3
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau.
# 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
Trong sổ tay JupyterLab, hãy tạo một ô mới, cập nhật và chạy nội dung sau. Đảm bảo bạn cập nhật PROJECT_ID bằng thông tin chi tiết về môi trường của mình.
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)
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau.
# 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
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy cấu hình bên dưới, lưu ý những điểm nổi bật sau:
- proxy_server = "http://proxy-vm.demo.com:8888" FQDN được liên kết với proxy vm được triển khai trong VPC của người tiêu dùng. Chúng ta sẽ sử dụng tính năng kết nối ngang DNS để phân giải FQDN ở bước sau.
%%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)
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau.
%%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"]
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau.
!gcloud artifacts repositories create pipelines-test-repo-psc --repository-format=docker --location=us-central1
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau.
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
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau.
!gcloud auth configure-docker us-docker.pkg.dev --quiet
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau. Bỏ qua lỗi (gcloud.builds.submit) nếu có.
!gcloud builds submit --tag {IMAGE_URI} --region=us-central1
Trong sổ tay JupyterLab, hãy tạo và chạy ô bên dưới, lưu ý những điểm nổi bật sau:
- Tính năng DNS Peering (DNS ngang hàng) với VPC của người dùng được định cấu hình bằng dnsPeeringConfigs (dnsPeeringConfigs) cho tên miền demo.com.
- Proxy tường minh, được xác định là biến PROXY_VM_IP, là proxy-vm.demo.com. Phân giải được xử lý thông qua việc kết nối DNS ngang hàng trong VPC của người dùng.
- Cổng 8888 là cổng nghe (mặc định) được định cấu hình trong tinyproxy
- Wget đến class-e-vm-demo.com được phân giải thông qua tính năng ngang hàng DNS
- Mã này chỉ định "psc-network-attachment" cho Vertex, cho phép Vertex sử dụng mạng con đính kèm mạng để triển khai 2 phiên bản Giao diện 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))
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau.
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)
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau.
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)
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau.
# 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__))"
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau.
BUCKET_URI = "your-unique-bucket" # Provide a globally unique bucket name
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau.
!gcloud storage buckets create gs://{BUCKET_URI}
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau.
# 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"}
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau.
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")
Trong sổ tay JupyterLab, hãy tạo một ô mới và chạy nội dung sau.
# 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)
14. Xác thực giao diện PSC
Bạn cũng có thể xem IP đính kèm mạng mà Vertax AI Pipelines sử dụng bằng cách chuyển đến phần sau:
Network Services (Dịch vụ mạng) → Private Service Connect (Kết nối dịch vụ riêng tư) → Network Attachment (Tệp đính kèm mạng) → psc-network-attachment
Chọn dự án người thuê nhà (tên dự án kết thúc bằng -tp)
Trường được đánh dấu biểu thị địa chỉ IP mà Vertex AI Pipelines sử dụng từ PSC Network Attachment.
15. Xác thực Cloud Logging
Lần đầu tiên chạy, công việc Vertex AI Pipelines sẽ mất khoảng 14 phút, những lần chạy tiếp theo sẽ mất ít thời gian hơn nhiều. Để xác thực kết quả thành công, hãy thực hiện những thao tác sau:
Chuyển đến Vertex AI → Huấn luyện → Công việc tuỳ chỉnh
Chọn công việc tuỳ chỉnh đã thực thi
Chọn Xem nhật ký
Sau khi Cloud Logging có sẵn, hãy chọn Run Query (Chạy truy vấn) để tạo lựa chọn được đánh dấu bên dưới nhằm xác nhận rằng wget đã thành công từ Vertex AI Pipelines đến class-e-vm.
16. Xác thực TCPDump
Hãy xem xét đầu ra TCPDUMP để xác thực thêm khả năng kết nối với các phiên bản điện toán:
Từ proxy-vm, hãy quan sát HTTP GET và 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
Từ class-e-vm, hãy quan sát HTTP GET và 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
17. Dọn dẹp
Trong Cloud Shell, hãy xoá các thành phần hướng dẫn.
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
18. Xin chúc mừng
Xin chúc mừng! Bạn đã định cấu hình và xác thực thành công Giao diện Private Service Connect bằng Vertex AI Pipelines.
Bạn đã tạo cơ sở hạ tầng người dùng và thêm một tệp đính kèm mạng cho phép nhà sản xuất tạo một máy ảo có nhiều NIC để kết nối thông tin liên lạc giữa người dùng và nhà sản xuất. Bạn đã tìm hiểu cách tạo tính năng kết nối ngang hàng DNS trong khi triển khai một proxy rõ ràng trong mạng VPC của người dùng, cho phép kết nối với phiên bản class-e-vm không thể định tuyến trực tiếp từ Vertex.
Cosmopup cho rằng các hướng dẫn rất hữu ích!!
Tiếp theo là gì?
Tài liệu đọc thêm và video
Tài liệu tham khảo
- Tổng quan về quyền truy cập vào mạng Vertex AI | Google Cloud
- Giới thiệu về việc truy cập các dịch vụ Vertex AI thông qua giao diện Private Service Connect | Google Cloud
- Sử dụng giao diện Private Service Connect cho Vertex AI Training | Google Cloud
- Thiết lập giao diện Private Service Connect cho các tài nguyên Vertex AI | Google Cloud