Vertex AI Pipelines PSC Interface SWP

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 (đầu ra của dịch vụ được quản lý), 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 (đầu vào của dịch vụ được quản lý).
  • 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.

d7dc28d6567e6283.pngHình:1

Những điểm cần lưu ý về khả năng tiếp cận PSC-Interface của Vertex AI

  • Vertex AI PSC-Interface có khả năng định tuyến lưu lượng truy cập đến các đích đến trong một VPC hoặc 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ạ chế độ proxy rõ ràng Secure Web Proxy (SWP) được định cấu hình trong VPC của người dù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/24
  3. 10.10.20.0/28 không cần proxy, nằm trong dải RFC-1918.
  4. Lưu lượng ra Internet

Kết nối Internet cho Mạng người thuê nhà do Google quản lý:

Vertex AI PSC-Interface không có VPC-SC

  • 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ê do Google quản lý.

Vertex AI PSC-Interface với VPC-SC

  • 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 đối tượng thuê do Google quản lý sẽ bị ranh giới này chặn để ngăn chặn việc đánh cắp 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 đi ra an toàn để định tuyến lưu lượng truy cập thông qua VPC được kết nối với Vertex AI. Triển khai một Máy chủ proxy bên trong mạng VPC có địa chỉ RFC 1918, kết hợp với một cổng Cloud NAT là một cách để đạt được điều này. Xin lưu ý rằng bạn cũng có thể sử dụng Secure Web Proxy để chuyển tiếp lưu lượng truy cập đến Internet. Việc tạo Proxy web an toàn sẽ tự động tạo một cổng Cloud NAT.

Để 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 Vertex AI Pipelines toàn diện có Giao diện Private Service Connect (PSC) để cho phép khả năng kết nối từ nhà sản xuất đến tài nguyên điện toán của người tiêu dùng như minh hoạ trong Hình 1 nhắm đến điểm cuối không phải RFC 1918 trong class-e-subnet.

2d095dc2f4de6b4b.pngHì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 Secure Web Proxy ở chế độ proxy rõ ràng, cho phép proxy này thực hiện 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 tính năng Kết nối ngang hàng DNS để phân giải các miền riêng tư được định cấu hình trong Mạng VPC của người dùng từ Mạng VPC do Google quản lý
  • Cách chuyển tiếp lưu lượng truy cập từ Giao diện PSC của Vertex AI đến Secure Web Proxy
  • Cách thiết lập giao tiếp với không gian địa chỉ IP không phải RFC-1918 từ Vertex AI Pipelines

Bạn cần có

Dự án trên Google Cloud

Quyền IAM

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-ID]
projectid=YOUR-PROJECT-ID
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"
gcloud services enable "networkservices.googleapis.com"
gcloud services enable "networksecurity.googleapis.com"
gcloud services enable "certificatemanager.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 --enable-private-ip-google-access

Tạo mạng con chỉ dành cho proxy

gcloud compute networks subnets create proxy-only-uscentral1 \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE \
    --region=us-central1 \
    --network=consumer-vpc \
    --range=10.10.100.0/26

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 \
--enable-private-ip-google-access

Cấu hình Cloud Router và NAT

Proxy web an toàn của Google Cloud tự động cấp phép và quản lý một cổng Cloud NAT và một Cloud Router được liên kết trong khu vực nơi cổng này được triển khai.

4. Bật IAP

Để cho phép IAP (proxy nhận biết danh tính) 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:

  • Á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 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 thực thể máy ảo 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 \ 
    --private-network-ip=240.0.0.2

6. Secure Web Proxy

Chế độ rõ ràng của Secure Web Proxy (hoặc Chế độ định tuyến proxy rõ ràng) là một phương thức triển khai mà các khối lượng công việc của máy khách phải được định cấu hình rõ ràng để sử dụng địa chỉ IP nội bộ hoặc Tên miền đủ điều kiện và cổng của SWP làm proxy chuyển tiếp.

Trong các bước bên dưới, hãy nhớ sửa đổi YOUR-PROJECT-ID thành mã dự án của bạn

Tạo một proxy web:

Trong Cloud Shell, hãy tạo tệp policy.yaml bằng trình chỉnh sửa văn bản:

cat > policy.yaml << EOF
description: basic Secure Web Proxy policy
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1
EOF

Trong Cloud Shell, hãy tạo chính sách Secure Web Proxy:

gcloud network-security gateway-security-policies import policy1 \
    --source=policy.yaml \
    --location=us-central1

Trong phần sau, hãy tạo một quy tắc để cho phép truy cập vào class-e-vm dựa trên máy chủ lưu trữ sessionMatcher.

Trong Cloud Shell, hãy tạo tệp rule1.yaml bằng trình chỉnh sửa văn bản:

cat > rule1.yaml << EOF
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1/rules/allow-nonrfc-classe
description: Allow nonrfc class-e
enabled: true
priority: 1
basicProfile: ALLOW
sessionMatcher: host() == 'class-e-vm.demo.com'
EOF

Trong phần sau, hãy tạo một quy tắc để cho phép sổ tay Jupyter truy cập nhằm cho phép cài đặt apache2 trên VM "class-e".

Trong Cloud Shell, hãy tạo tệp rule2.yaml bằng trình chỉnh sửa văn bản:

cat > rule2.yaml << EOF
name: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1/rules/allow-apache2
description: Allow Apache2 install on class-e VM
enabled: true
priority: 2
basicProfile: ALLOW
sessionMatcher: inIpRange(source.ip,'240.0.0.2')
EOF

Trong Cloud Shell, hãy tạo quy tắc 1 của chính sách bảo mật:

gcloud network-security gateway-security-policies rules import allow-nonrfc-classe \
    --source=rule1.yaml \
    --location=us-central1 \
    --gateway-security-policy=policy1

Trong Cloud Shell, hãy tạo quy tắc chính sách bảo mật 2:

gcloud network-security gateway-security-policies rules import allow-apache2 \
    --source=rule2.yaml \
    --location=us-central1 \
    --gateway-security-policy=policy1

Để hỗ trợ hoạt động Huấn luyện bằng Vertex AI, hãy định cấu hình cổng Secure Web Proxy bằng các chế độ cài đặt sau:

  • Cổng nghe: Sử dụng cùng một cổng được định cấu hình trong chế độ cài đặt proxy rõ ràng của mã ứng dụng Vertex AI (ví dụ: 8080).
  • Địa chỉ: Chỉ định một địa chỉ IP riêng tư trong dải RFC 1918.
  • Chế độ định tuyến: Đặt chế độ này thành EXPLICIT_ROUTING_MODE

Trong Cloud Shell, hãy tạo một tệp gateway.yaml để xác định cổng Secure Web Proxy:

cat > gateway.yaml << EOF
name: projects/$projectid/locations/us-central1/gateways/swp1
type: SECURE_WEB_GATEWAY
addresses: ["10.10.10.5"]
ports: [8080]
gatewaySecurityPolicy: projects/$projectid/locations/us-central1/gatewaySecurityPolicies/policy1
network: projects/$projectid/global/networks/consumer-vpc
subnetwork: projects/$projectid/regions/us-central1/subnetworks/rfc1918-subnet1
routingMode: EXPLICIT_ROUTING_MODE
EOF

Trong Cloud Shell, hãy tạo phiên bản Secure Web Proxy:

gcloud network-services gateways import swp1 \
    --source=gateway.yaml \
    --location=us-central1

Có thể mất vài phút để triển khai một Secure Web Proxy.

e8a4cf23bfc63030.png

7. Thiết bị mạng Private Service Connect

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 nằm trong 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_MANUAL \
    --subnets=intf-subnet

Lưu ý: Bạn không cần đề cập rõ ràng đến mã dự án được chấp nhận trong tệp đính kèm này. Khi Vertex AI được định cấu hình, dự án đối tượng thuê do Google quản lý sẽ tự động được thêm như thể dự án đó được định cấu hình là "Tự động chấp nhận"

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 tệp đính kèm mạng PSC, psc-network-attachment, mà nhà cung cấp sẽ dùng khi tạo Giao diện Private Service Connect.

Để 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

b969cca5242d9c8a.png

8. Vùng DNS riêng

Bạn sẽ tạo một Vùng Cloud DNS 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 ngang hàng 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 tạo bộ bản ghi cho máy ảo, 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 Secure Web Proxy, 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 explicit-swp.demo.com. --zone="private-dns-codelab" --type="A" --ttl="300" --rrdatas="10.10.10.5"

Tạo quy tắc Tường lửa đá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ừ PSC Network Attachment truy cập vào tài nguyên điện toán RFC 1918 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 chỉ có proxy đến mạng con class-e. Vì SWP bắt đầu kết nối với mạng con chỉ dùng proxy làm địa chỉ nguồn.

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.100.0/28" \
    --destination-ranges="240.0.0.0/4" \
    --enable-logging

9. Tạo sổ tay Jupyter

Phần sau đây sẽ 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. Đường dẫn dữ liệu giữa Vertex AI Pipelines và mạng người dùng chứa các phiên bản sử dụng giao diện Private Service Connect.

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:

Đăng nhập vào Cloud Shell rồi thực hiện các thao tác sau:

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

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

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"

Cập nhật tài khoản dịch vụ bằng vai trò Người dùng Nền tảng Trí tuệ nhân tạo.

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

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"

Cập nhật tài khoản dịch vụ bằng vai trò Người chỉnh sửa Cloud Build.

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

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 thực thể Vertex AI Workbench kết hợp với tài khoản dịch vụ đã tạo trước đó, notebook-sa.

Tạo thực thể ứng dụng 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 dùng để tạo PSC Interface. Để 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

Lưu ý: Trước khi cập nhật quyền của tác nhân dịch vụ, hãy chuyển đến Vertex AI trong bảng điều khiển Cloud để đảm bảo bạn đã bật Vertex AI API.

Trong Cloud Shell:

Lấy số dự án của bạn.

gcloud projects describe $projectid | grep projectNumber

Đặt số dự án.

projectnumber=YOUR-PROJECT-NUMBER

Tạo tài khoản dịch vụ cho Nền tảng Trí tuệ nhân tạo. 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

Cập nhật tài khoản tác nhân 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"

Cập nhật tài khoản tác nhân 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.

Sử dụng Cloud Shell để cập nhật tài khoản dịch vụ mặc định như sau:

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"

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"

Cập nhật tài khoản dịch vụ mặc định bằng vai trò artifactregistry.admin

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

12. Cài đặt Apache2 và bật Tcpdump trên "class-e-vm":

Từ class-e-vm, hãy cài đặt apache2 thông qua Secure Web Proxy:

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
sudo apt-get -o Acquire::http::Proxy="http://10.10.10.5:8080" update
sudo apt-get -o Acquire::http::Proxy="http://10.10.10.5:8080" install apache2 -y
sudo service apache2 restart
echo 'class-e Server !!' | sudo tee /var/www/html/index.html

Thực thi hoạt động lọc tcpdump trên mạng con chỉ dành cho proxy, được Secure Web Proxy dùng để chuyển tiếp lưu lượng truy cập đến các mục tiêu.

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.100.0/24 -nn

Lưu ý: Đảm bảo rằng bạn đang bật chế độ Truy cập riêng tư vào Google trên mạng con của thực thể hướng dẫn trên bàn làm việc để mở Phiên JupyterLab.

13. Triển khai Vertex AI Pipelines Job

Trong phần sau, bạn sẽ tạo một sổ tay để thực hiện thành công 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 VM không phải RFC 1918, chẳng hạn như class-e-vm. Vertex AI Pipelines không cần có một proxy rõ ràng để truy cập vào rfc1918-vm, vì mục tiêu của proxy này là một địa chỉ IP RFC 1918.

Chạy quy trình huấn luyện trong phiên bản Vertex AI Workbench.

  1. Trong bảng điều khiển Cloud của Google, hãy chuyển đến thẻ thực thể trên trang Vertex AI Workbench.
  2. 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.
  3. Chọn File > New > Notebook (Tệp > Mới > Sổ tay)
  4. Chọn Kernel > Python 3

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://explicit-swp.demo.com:8080"
  • FQDN được liên kết với VM proxy đượ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 nonRFC-1918 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://explicit-swp.demo.com:8080" # replace it with your Secure Web proxy Ip-address and the 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 Kết nối ngang hàng DNS 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 web ở chế độ định tuyến rõ ràng ở đây là explicit-swp.demo.com. Quá trình phân giải được xử lý thông qua tính năng kết nối ngang hàng DNS trong VPC của người dùng.
  • Cổng 8080 là cổng nghe (mặc định) được định cấu hình trong Secure Web Proxy
  • wget đến class-e-vm-demo.com được phân giải thông qua tính năng kết nối 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 = "explicit-swp.demo.com" #@param {type:"string"}
PROXY_VM_PORT = "8080" #@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 các 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)

a2e0b6d6243f26f1.png

Trường được đánh dấu biểu thị địa chỉ IP mà Vertex AI Pipelines sử dụng từ PSC Network Attachment.

11e411ea919d3bad.png

15. Xác thực Cloud Logging

Lần đầu tiên, công việc Vertex AI Pipelines sẽ mất khoảng 14 phút để chạy, những lần chạy tiếp theo sẽ ngắn 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 → Training (Huấn luyện) → Custom jobs (Công việc tuỳ chỉnh)

Chọn công việc tuỳ chỉnh đã thực thi

2f467254aa0c2e3a.png

Chọn Xem nhật ký

8d525d3b152bcc61.png

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 wget thành công từ Vertex AI Pipelines đến class-e-vm.

a4f9e9167f4ce1ae.png

38972f834aa2bd1d.png

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ừ class-e-vm, hãy quan sát HTTP GET và 200 OK

XXXXXXXXX@class-e-vm:~$ sudo tcpdump -i any net 10.10.100.0/28 -nn
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
05:51:14.173641 ens4  In  IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [S], seq 1747181041, win 65535, options [mss 1420,sackOK,TS val 3942828403 ecr 0,nop,wscale 8], length 0
05:51:14.173668 ens4  Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [S.], seq 3013226100, ack 1747181042, win 64768, options [mss 1420,sackOK,TS val 1886125065 ecr 3942828403,nop,wscale 7], length 0
05:51:14.174977 ens4  In  IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [.], ack 1, win 1054, options [nop,nop,TS val 3942828405 ecr 1886125065], length 0
05:51:14.175066 ens4  In  IP 10.10.100.8.55306 > 240.0.0.2.80: Flags [P.], seq 1:223, ack 1, win 1054, options [nop,nop,TS val 3942828405 ecr 1886125065], length 222: HTTP: GET / HTTP/1.1
05:51:14.175096 ens4  Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [.], ack 223, win 505, options [nop,nop,TS val 1886125066 ecr 3942828405], length 0
05:51:14.239042 ens4  Out IP 240.0.0.2.80 > 10.10.100.8.55306: Flags [P.], seq 1:246, ack 223, win 505, options [nop,nop,TS val 1886125130 ecr 3942828405], length 245: 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 workbench instances delete workbench-tutorial --project=$projectid --location=us-central1-a

gcloud network-security gateway-security-policies rules delete allow-nonrfc-classe \
    --gateway-security-policy=policy1 \
    --location=us-central1

gcloud network-security gateway-security-policies rules delete allow-apache2 \
    --gateway-security-policy=policy1 \
    --location=us-central1

gcloud network-security gateway-security-policies delete policy1 \
    --location=us-central1
gcloud network-services gateways delete swp1 \
    --location=us-central1

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 explicit-swp.demo.com --zone=private-dns-codelab  --type=A

gcloud dns managed-zones delete private-dns-codelab

gcloud computeinstances delete class-e-vm --project=$projectid --zone=us-central1-a --quiet
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 một kết nối giữa Giao diện Private Service Connect của Vertex AI Pipelines với các dải IP không phải RFC thông qua Secure Web Proxy.

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 VM 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 mối quan hệ 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 thực thể class-e-vm không thể định tuyến trực tiếp từ Vertex.

678ba30d64a76795.png

Tiếp theo là gì?

Tài liệu đọc thêm và video

Tài liệu tham khảo