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

Вопросы достижимости интерфейса 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.

476f87a96f153b95.png

Соображения относительно 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

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. Прежде чем начать

Обновите проект для поддержки руководства.

В этом руководстве используются $переменные для упрощения реализации конфигурации 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

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

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

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

  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. Мы используем 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)

f47150235fedb8ce.png

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

39e7b251aeb4f191.png

15. Проверка облачного логирования

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

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

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

a9be0395c842aa6f.png

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

53e30765ba5827f3.png

После того, как ведение журнала в облаке станет доступно, выберите «Выполнить запрос», который сгенерирует выделенный ниже выбор, подтверждающий успешный wget из Vertex AI Pipelines в class-e-vm.

f2c5d9fdf5cc8bed.png

3b3788603bb433ee.png

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

c911c127bffdee57.jpeg

Что дальше?

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

Справочные документы