Интерфейс PSC Vertex AI Pipelines Явный прокси

1. Введение

Интерфейс Private Service Connect — это ресурс, позволяющий сети виртуальной частной сети (VPC) производителя инициировать соединения с различными пунктами назначения в сети VPC потребителя. Сети производителя и потребителя могут находиться в разных проектах и ​​организациях.

Если сетевое соединение принимает подключение от интерфейса Private Service Connect, Google Cloud выделяет этому интерфейсу IP-адрес из подсети потребителя, указанной в сетевом соединении. Сети потребителя и производителя соединяются и могут обмениваться данными, используя внутренние IP-адреса.

Соединение между сетевым устройством и интерфейсом Private Service Connect аналогично соединению между конечной точкой Private Service Connect и сервисным устройством, но имеет два ключевых отличия:

  • Сетевое подключение позволяет сети-производителю инициировать соединения с сетью-потребителем (исходящий трафик управляемых сервисов), а конечная точка позволяет сети-потребителю инициировать соединения с сетью-производителем (входящий трафик управляемых сервисов).
  • Соединение через интерфейс Private Service Connect является транзитивным. Это означает, что сеть-производитель может взаимодействовать с другими сетями, подключенными к сети потребителя.

Вопросы доступности интерфейса PSC в Vertex AI

  • PSC-Interface способен маршрутизировать трафик к адресам в VPC или локальной сети в пределах адресного блока RFC1918.
  • Для работы PSC-интерфейса с блоками адресов, отличными от RFC-1918, требуется явное развертывание прокси-сервера в VPC потребителя с адресом RFC-1918. В развертывании Vertex AI прокси-сервер должен быть определен вместе с полным доменным именем (FQDN) целевой конечной точки. На рисунке 1 показан явный прокси-сервер, настроенный в VPC клиентов для обеспечения маршрутизации к следующим CIDR, отличным от RFC-1918:

[1] 240.0.0.0/4

[2] 203.0.113.0/2

[3]10.10.20.0/28, прокси не требуется, попадает в диапазон rfc1918.

  • При настройке развертывания только с использованием интерфейса PSC сохраняется доступ к интернету по умолчанию. Исходящий трафик проходит напрямую из защищенной сети арендатора, управляемой Google.

476f87a96f153b95.png

Вопросы, касающиеся интерфейса Vertex AI PSC и VPC-SC.

  • Когда ваш проект является частью периметра 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

782ba8f1f3c3f522.png

Вам потребуется создать единое сетевое соединение psc-network-attachment в потребительской VPC, используя DNS-пиринг для разрешения имен виртуальных машин потребителей в проекте арендатора, на котором размещено обучение Vertex AI, что приведет к следующим сценариям использования:

  1. Разверните Vertex AI Pipelines и настройте прокси-виртуальную машину, чтобы она выступала в качестве явного прокси, позволяя ей выполнять команду wget к виртуальной машине в подсети класса E.

Что вы узнаете

  • Как создать сетевое подключение
  • Как производитель может использовать сетевое подключение для создания интерфейса PSC
  • Как установить связь между производителем и потребителем с помощью DNS-пиринга
  • Как установить связь с адресным пространством IP, не входящим в RFC1918, из Vertex AI Pipelines

Что вам понадобится

Проект Google Cloud

Разрешения IAM

2. Прежде чем начать

Обновите проект, чтобы он соответствовал учебному пособию.

В этом руководстве переменные `$variables` используются для упрощения настройки gcloud в Cloud Shell.

Внутри Cloud Shell выполните следующие действия:

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

Включение API

Внутри Cloud Shell выполните следующие действия:

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

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 Network Attachment).

Внутри 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 создайте экземпляр виртуальной машины потребителя, класс 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. В качестве приложения для проксирования HTTP-трафика мы будем использовать tinyproxy, хотя 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, которое будет использоваться производителем при создании интерфейса Private Service Connect.

Чтобы просмотреть URL-адрес сетевого подключения PSC в консоли Cloud Console, перейдите по следующей ссылке:

Сетевые службы → Подключение к частной сети → Подключение к сети → psc-network-attachment

e191e54a103d2222.png

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 выполните команду `describe` для экземпляров виртуальных машин, чтобы получить соответствующие 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 создайте набор записей для виртуальной машины класса 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 к виртуальной машине-прокси.

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 создайте правило входящего трафика брандмауэра, разрешающее доступ из подсети прокси-виртуальных машин в подсеть класса 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, используемым в этом руководстве.

В данном руководстве к учетной записи службы будут применены следующие роли:

Внутри 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».

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

Внутри Cloud Shell обновите учетную запись службы, присвоив ей роль администратора реестра артефактов.

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).

Подключайтесь к виртуальной машине-прокси через SSH из Cloud Shell.

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

С операционной системы прокси-VM выполните фильтрацию tcpdump для виртуальной машины класса e и подсети подключения к сети PSC.

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

Откройте новую вкладку Cloud Shell, обновите переменную проекта и подключитесь к виртуальной машине класса e по SSH.

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

С операционной системы виртуальной машины класса e выполните фильтрацию tcpdump в подсети прокси-виртуальной машины.

sudo tcpdump -i any net 10.10.10.0/28 -nn

13. Развертывание конвейеров искусственного интеллекта Vertex.

В следующем разделе вы создадите ноутбук для успешного выполнения команды wget из Vertex AI Pipelines к явному прокси-серверу. Это позволит вам получить доступ к виртуальным машинам, не соответствующим RFC 1918, таким как class-e-vm. Явный прокси-сервер не требуется для доступа Vertex AI Pipelines к rfc1918-vm, поскольку его целью является IP-адрес, соответствующий RFC 1918.

Запустите задачу обучения в экземпляре Vertex AI Workbench.

  1. В консоли Google Cloud перейдите на вкладку «Экземпляры» на странице Vertex AI Workbench.
  2. Рядом с именем вашего экземпляра Vertex AI Workbench (workbench-tutorial) нажмите «Открыть JupyterLab». Ваш экземпляр Vertex AI Workbench откроется в JupyterLab.
  3. Выберите Файл > Создать > Блокнот
  4. Выберите Ядро > 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. Для разрешения FQDN на более позднем этапе мы используем 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.
  • Запрос к 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).

f47150235fedb8ce.png

Выделенное поле обозначает IP-адрес, используемый Vertex AI Pipelines при подключении к сети PSC.

39e7b251aeb4f191.png

15. Проверка достоверности данных облачного логирования

Первое выполнение задачи в Vertex AI Pipelines займет приблизительно 14 минут, последующие запуски займут гораздо меньше времени. Для подтверждения успешного результата выполните следующие действия:

Перейдите в Vertex AI → Обучение → Пользовательские задания

Выберите выполненное пользовательское задание

a9be0395c842aa6f.png

Выберите «Просмотреть журналы».

53e30765ba5827f3.png

После того, как станет доступна функция Cloud Logging, выберите «Выполнить запрос», который сгенерирует выделенный ниже фрагмент текста, подтверждающий успешную загрузку wget из Vertex AI Pipelines на виртуальную машину класса e.

f2c5d9fdf5cc8bed.png

3b3788603bb433ee.png

16. Проверка TCPDump

Давайте рассмотрим вывод TCPDUMP, который дополнительно подтверждает подключение к вычислительным экземплярам:

На виртуальной машине прокси отслеживайте HTTP GET-запрос и код ответа 200 OK.

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

В виртуальной машине класса e-vm отслеживается HTTP GET-запрос и ответ 200 OK.

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

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 считает, что обучающие материалы — это здорово!!

c911c127bffdee57.jpeg

Что дальше?

Дополнительная литература и видеоматериалы

Справочная документация