1. Введение
Интерфейс Private Service Connect — это ресурс, позволяющий сети виртуального частного облака (VPC) производителя инициировать соединения с различными пунктами назначения в сети VPC потребителя. Сети производителя и потребителя могут находиться в разных проектах и организациях.
Если сетевое подключение принимает соединение через интерфейс Private Service Connect, Google Cloud выделяет интерфейсу IP-адрес из подсети потребителя, указанной сетевым подключением. Сети потребителя и поставщика соединены и могут взаимодействовать друг с другом, используя внутренние IP-адреса.
Соединение между сетевым подключением и интерфейсом Private Service Connect похоже на соединение между конечной точкой Private Service Connect и подключением к службе, но имеет два ключевых отличия:
- Сетевое присоединение позволяет сети-производителю инициировать соединения с сетью-потребителем (управляемый выход сервиса), в то время как конечная точка позволяет сети-потребителю инициировать соединения с сетью-производителем (управляемый вход сервиса).
- Интерфейсное соединение Private Service Connect является транзитным. Это означает, что сеть-производитель может взаимодействовать с другими сетями, подключенными к сети-потребителю.
Вопросы достижимости интерфейса Vertex AI PSC
- Интерфейс PSC способен маршрутизировать трафик в VPC или локальные пункты назначения в пределах блока адресов RFC1918.
- Для интерфейса PSC, ориентированного на блоки адресов, не соответствующие стандарту RFC-1918, требуется явный прокси-сервер, развёрнутый в VPC потребителя с адресом RFC-1918. В рамках развертывания Vertex AI прокси-сервер должен быть определён вместе с полным доменным именем целевой конечной точки. На рисунке 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 сохраняется доступ к Интернету по умолчанию. Исходящий трафик отправляется непосредственно из безопасной сети арендаторов, управляемой Google.
Соображения относительно VPC-SC интерфейса Vertex AI PSC
- Если ваш проект является частью периметра VPC Service Controls, доступ к Интернету по умолчанию для арендаторов, управляемых Google, блокируется периметром, чтобы предотвратить утечку данных.
- Чтобы разрешить развертыванию доступ к публичному Интернету в этом сценарии, необходимо явно настроить безопасный выходной путь, который будет направлять трафик через вашу VPC. Рекомендуемый способ добиться этого — настроить прокси-сервер внутри периметра вашей VPC с адресом RFC1918 и создать шлюз Cloud NAT, чтобы разрешить прокси-виртуальной машине доступ к Интернету.
Дополнительную информацию можно найти на следующих ресурсах:
Настройка интерфейса Private Service Connect для ресурсов Vertex AI | Google Cloud
Что вы построите
В этом руководстве вы создадите комплексное развертывание Vertex AI Pipelines с интерфейсом Private Service Connect (PSC), чтобы обеспечить подключение от производителя к вычислительным ресурсам потребителя, как показано на рисунке 1, ориентированное на конечные точки, не соответствующие стандарту RFC-1928.
Рисунок 2
Вы создадите один psc-network-attachment в потребительском VPC, используя пиринг DNS для разрешения виртуальных машин потребителей в проекте арендатора, на котором размещено обучение Vertex AI. В результате будут реализованы следующие варианты использования:
- Разверните Vertex AI Pipelines и настройте прокси-виртуальную машину для работы в качестве явного прокси-сервера, что позволит ей выполнять wget в отношении виртуальной машины в подсети класса E.
Чему вы научитесь
- Как создать сетевое присоединение
- Как производитель может использовать сетевое подключение для создания интерфейса PSC
- Как установить связь от производителя к потребителю с помощью DNS-пиринга
- Как установить связь с пространством IP-адресов, не соответствующим RFC1918, из Vertex AI Pipelines
Что вам понадобится
Проект Google Cloud
Разрешения IAM
- Администратор вычислительной сети (roles/compute.networkAdmin)
- Администратор экземпляра вычислений (roles/compute.instanceAdmin)
- Администратор безопасности вычислений (roles/compute.securityAdmin)
- Администратор DNS (roles/dns.admin)
- Пользователь туннеля, защищенного IAP (roles/iap.tunnelResourceAccessor)
- Администратор журнала (roles/logging.admin)
- Администратор блокнотов (roles/notebooks.admin)
- Администратор IAM проекта (roles/resourcemanager.projectIamAdmin)
- Администратор учетной записи службы (roles/iam.serviceAccountAdmin)
- Администратор использования услуг (roles/serviceusage.serviceUsageAdmin)
2. Прежде чем начать
Обновите проект для поддержки руководства.
В этом руководстве используются $переменные для упрощения реализации конфигурации 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"
3. Потребительская настройка
Создайте потребительскую 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
Внутри 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
4. Включить 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
5. Создайте экземпляры виртуальных машин потребителя
Внутри 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"
6. Сетевое подключение Private Service Connect
Сетевые подключения — это региональные ресурсы, представляющие сторону потребителя интерфейса 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, которое будет использоваться производителем при создании интерфейса подключения частной службы.
Чтобы просмотреть URL-адрес сетевого прикрепления PSC в Cloud Console, перейдите по следующему пути:
Сетевые службы → Подключение частной службы → Сетевое подключение → psc-network-attachment
7. Частная DNS-зона
Вы создадите зону Cloud DNS для demo.com и заполните её записями A, указывающими на IP-адреса ваших виртуальных машин. Позже в задании Vertex AI Pipelines будет развёрнут DNS-пиринг, что позволит ему получить доступ к 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, получать доступ к вычислительным ресурсам RFC1918 в потребительском VPC.
В Cloud Shell создайте правило входящего брандмауэра, разрешающее доступ из подсети PSC Network Attachment к 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
В 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
8. Обновите явный прокси-сервер.
В следующем разделе вам нужно будет подключиться по SSH к явному прокси-серверу и обновить файл конфигурации tinyproxy.conf, а затем выполнить сброс настроек.
Из Cloud Shell
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
9. Создайте блокнот Jupyter
В следующем разделе описывается создание блокнота Jupyter. Этот блокнот будет использоваться для развертывания задания Vertex AI Pipelines, которое отправляет wget-запрос из Vertex AI Pipelines на тестовые экземпляры. Путь передачи данных между Vertex AI Pipelines и сетью потребителей, содержащей экземпляры, использует сетевой интерфейс Private Service Connect.
Создайте учетную запись службы, управляемую пользователем
В следующем разделе вы создадите учетную запись службы, которая будет связана с экземпляром Vertex AI Workbench, используемым в этом руководстве.
В этом руководстве к учетной записи службы будут применены следующие роли:
- Администратор хранилища
- Пользователь Vertex AI
- Администратор реестра артефактов
- Редактор облачной сборки
- Пользователь учетной записи службы IAM
Внутри Cloud Shell создайте учетную запись службы.
gcloud iam service-accounts create notebook-sa \
--display-name="notebook-sa"
Внутри Cloud Shell обновите учетную запись службы, назначив ей роль администратора хранилища.
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"
10. Создайте экземпляр Vertex AI Workbench
В следующем разделе создайте экземпляр 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
11. Обновление агента службы Vertex AI
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 создайте учётную запись службы для AI Platform. Пропустите этот шаг, если в вашем проекте уже есть учётная запись службы.
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"
Обновление учетной записи службы по умолчанию
Включите API Compute Engine и предоставьте вашей учётной записи службы по умолчанию доступ к 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"
12. Включить Tcpdump
Для проверки IP-подключения от Vertex AI Pipelines можно использовать TCPDUMP. Это позволит нам наблюдать за трафиком, исходящим из подсети PSC Network Attachment 192.168.10.0/28 при вызове get-запроса от Vertex AI Pipelines к виртуальной машине class-e-vm.demo.com (240.0.0.0/4).
Из 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
Из ОС класса e-vm выполните фильтрацию tcpdump в подсети proxy-vm.
sudo tcpdump -i any net 10.10.10.0/28 -nn
13. Развертывание задания Vertex AI Pipelines
В следующем разделе вы создадите блокнот для успешного выполнения команды wget из Vertex AI Pipelines на явный прокси-сервер. Это позволит вам обращаться к виртуальным машинам, не поддерживающим RFC 1918, например, к class-e-vm. Для доступа Vertex AI Pipelines к rfc1918-vm явный прокси-сервер не требуется, поскольку его целью является IP-адрес RFC 1918.
Запустите задание обучения в экземпляре Vertex AI Workbench.
- В консоли Google Cloud перейдите на вкладку «Экземпляры» на странице Vertex AI Workbench.
- Рядом с именем вашего экземпляра Vertex AI Workbench (workbench-tutorial) нажмите «Открыть JupyterLab». Ваш экземпляр Vertex AI Workbench откроется в JupyterLab.
- Выберите Файл > Создать > Блокнот.
- Выберите Ядро > Python 3
В блокноте 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-пиринг для разрешения полного доменного имени на более позднем этапе.
%%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-пиринг для VPC-клиентов настраивается с помощью dnsPeeringConfigs (dnsPeeringConfigs) для доменного имени demo.com.
- Явный прокси-сервер, определяемый как переменная PROXY_VM_IP, — proxy-vm.demo.com. Разрешение осуществляется через DNS-пиринг в VPC потребителя.
- Порт 8888 — это порт прослушивания (по умолчанию), настроенный в tinyproxy.
- Wget для class-e-vm-demo.com разрешается через DNS-пиринг
- Код определяет «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)
14. Проверка интерфейса PSC
Вы также можете просмотреть IP-адреса сетевых подключений, используемые Vertax AI Pipelines, перейдя по следующей ссылке:
Сетевые службы → Подключение частной службы → Сетевое подключение → psc-network-attachment
Выберите проект-арендатор (имя проекта заканчивается на -tp)
Выделенное поле обозначает IP-адрес, используемый Vertex AI Pipelines из сетевого подключения PSC.
15. Проверка облачного логирования
Первый запуск задания Vertex AI Pipelines займёт около 14 минут, последующие запуски будут значительно короче. Для подтверждения успешного результата выполните следующие действия:
Перейдите в Vertex AI → Обучение → Пользовательские задания.
Выберите выполненное индивидуальное задание
Выберите «Просмотреть журналы».
После того, как ведение журнала в облаке станет доступно, выберите «Выполнить запрос», который сгенерирует выделенный ниже выбор, подтверждающий успешный wget из Vertex AI Pipelines в class-e-vm.
16. Проверка 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
Из class-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
17. Уборка
Из 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
18. Поздравления
Поздравляем, вы успешно настроили и проверили интерфейс Private Service Connect с Vertex AI Pipelines.
Вы создали инфраструктуру потребителя и добавили сетевое подключение, которое позволило производителю создать виртуальную машину с несколькими сетевыми картами для связи потребителя и производителя. Вы научились создавать DNS-пиринг при развертывании явного прокси-сервера в сети VPC потребителя, что позволило подключиться к экземпляру виртуальной машины класса E, который не маршрутизируется напрямую из Vertex.
Cosmopup считает, что обучающие материалы — это здорово!
Что дальше?
Дополнительные материалы и видео
Справочные документы
- Обзор сетевого доступа Vertex AI | Google Cloud
- О доступе к сервисам Vertex AI через интерфейсы Private Service Connect | Google Cloud
- Используйте интерфейс Private Service Connect для обучения Vertex AI | Google Cloud
- Настройка интерфейса Private Service Connect для ресурсов Vertex AI | Google Cloud