Интерфейс Private Service Connect Конвейеры Vertex AI

1. Введение

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

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

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

Что вы построите

Vertex AI Pipelines, развернутый в проекте, управляемом Google, будет использовать PSC Network Attachment для создания многосетевого экземпляра между сетью производителя и сетью потребителя. Поскольку PSC Network Attachment развертывается с многосетевым экземпляром из сети потребителя, Vertex AI Pipelines сможет получать доступ к маршрутам, доступным из сети потребителя.

В этом руководстве вы создадите комплексную архитектуру интерфейса Private Service Connect (PSC) для Vertex AI Pipelines, которая будет использовать правила облачного брандмауэра для разрешения или запрета подключения от производителя к тестовым экземплярам потребителя, как показано на рисунке 1.

Рисунок 1

12714b6f0f8fa411.png

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

  1. Создайте правило входящего брандмауэра в consumer-vpc, разрешающее доступ к test-svc-1 для подсети Vertex AI Pipeline (192.168.10.0/28). Подтвердите успешный вызов PING, сгенерированный заданием Pipeline для test-svc-1, используя TCPDUMP.
  2. Создайте правило входящего трафика в vpc потребителя, запрещающее доступ к подсети Vertex AI Pipeline (192.168.10.0/28) для test-svc-2. Подтвердите сбой PING на основе журналов брандмауэра, сгенерированных Log Explorer.

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

  • Как создать сетевое подключение
  • Как Vertex AI Pipelines может использовать сетевое подключение для создания интерфейса PSC
  • Как наладить коммуникацию между производителем и потребителем?
  • Как разрешить доступ из Verex AI Pipelines к виртуальной машине потребителя, test-svc-1
  • Как запретить доступ из Verex AI Pipelines к виртуальной машине потребителя test-svc-2 с помощью облачного брандмауэра.

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

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

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

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

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

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

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

gcloud services enable notebooks.googleapis.com
gcloud services enable aiplatform.googleapis.com
gcloud services enable compute.googleapis.com
gcloud services enable cloudresourcemanager.googleapis.com

3. Настройка потребителя

Создайте потребительскую VPC.

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

gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom

Создайте потребительские подсети.

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

gcloud compute networks subnets create test-subnet-1 --project=$projectid --range=192.168.20.0/28 --network=consumer-vpc --region=us-central1

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

gcloud compute networks subnets create test-subnet-2 --project=$projectid --range=192.168.30.0/28 --network=consumer-vpc --region=us-central1

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

gcloud compute networks subnets create workbench-subnet --project=$projectid --range=192.168.40.0/28 --network=consumer-vpc --region=us-central1 --enable-private-ip-google-access

Настройка облачного маршрутизатора и NAT.

В этом руководстве для загрузки программных пакетов для ноутбуков используется трансляция сетевых адресов (NAT) в облаке, поскольку экземпляр ноутбука не имеет внешнего IP-адреса. Облачная NAT обеспечивает возможности исходящей NAT, что означает, что интернет-хостам не разрешается инициировать связь с ноутбуком, управляемым пользователем, что повышает безопасность.

Внутри Cloud Shell создайте региональный облачный маршрутизатор.

gcloud compute routers create cloud-router-us-central1 --network consumer-vpc --region us-central1

Внутри Cloud Shell создайте региональный шлюз NAT облака.

gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-us-central1 --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1

Создайте подсеть подключения к частной сети (Private Service Connect Network Attachment).

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

gcloud compute networks subnets create intf-subnet --project=$projectid --range=192.168.10.0/28 --network=consumer-vpc --region=us-central1

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

gcloud compute instances create test-svc-1 \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=test-subnet-1 \
    --shielded-secure-boot

Внутри Cloud Shell создайте экземпляр виртуальной машины потребителя, test-svc-2.

gcloud compute instances create test-svc-2 \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=test-subnet-2 \
    --shielded-secure-boot

Получите и сохраните IP-адреса экземпляров:

Внутри Cloud Shell выполните команду describe для тестовых экземпляров виртуальных машин.

gcloud compute instances describe test-svc-1 --zone=us-central1-a | grep  networkIP:

gcloud compute instances describe test-svc-2 --zone=us-central1-a | grep  networkIP:

Пример:

user@cloudshell(psc-vertex)$ gcloud compute instances describe test-svc-1 --zone=us-central1-a | grep  networkIP:

gcloud compute instances describe test-svc-2 --zone=us-central1-a | grep  networkIP:
  networkIP: 192.168.20.2
  networkIP: 192.168.30.2

6. Подключение к сети Private Service Connect

Сетевые подключения — это региональные ресурсы, представляющие собой потребительскую сторону интерфейса Private Service Connect. Вы связываете одну подсеть с сетевым подключением, а производитель (Vertex AI Pipelines) назначает IP-адреса интерфейсу Private Service Connect.

Создайте сетевое подключение.

Внутри Cloud Shell создайте сетевое подключение.

gcloud compute network-attachments create psc-network-attachment \
    --region=us-central1 \
    --connection-preference=ACCEPT_MANUAL \
    --subnets=intf-subnet

Перечислите сетевые подключения.

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

gcloud compute network-attachments list

Опишите сетевые подключения.

Внутри Cloud Shell опишите сетевое подключение.

gcloud compute network-attachments describe psc-network-attachment --region=us-central1

Запишите URI psc-network-attachment, который будет использоваться производителем при создании интерфейса Private Service Connect.

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

projects/psc-vertex/regions/us-central1/networkAttachments/psc-network-attachment

user@cloudshell$ gcloud compute network-attachments describe psc-network-attachment --region=us-central1
connectionPreference: ACCEPT_MANUAL
creationTimestamp: '2025-01-21T12:25:25.385-08:00'
fingerprint: m9bHc9qnosY=
id: '56224423547354202'
kind: compute#networkAttachment
name: psc-network-attachment
network: https://www.googleapis.com/compute/v1/projects/psc-vertex/global/networks/consumer-vpc
region: https://www.googleapis.com/compute/v1/projects/psc-vertex/regions/us-central1
selfLink: https://www.googleapis.com/compute/v1/projects/psc-vertex/regions/us-central1/networkAttachments/psc-network-attachment
subnetworks:
- https://www.googleapis.com/compute/v1/projects/psc-vertex/regions/us-central1/subnetworks/intf-subnet

7. Настройка рабочей среды Vertex AI

В следующем разделе описано, как создать блокнот Jupyter. Этот блокнот будет использоваться для развертывания задания Pipelines, которое отправляет PING-запрос из Vertex AI Pipelines на тестовые экземпляры. Путь передачи данных между Vertex AI Pipelines и потребительской сетью, содержащей экземпляры, использует частный сетевой интерфейс 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 разрешите учетной записи службы ноутбука использовать учетную запись службы 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"

Создайте экземпляр Vertex AI Workbench.

В следующем разделе создайте экземпляр Vertex AI Workbench, который будет использовать ранее созданную учетную запись службы notebook-sa.

Внутри Cloud Shell создайте экземпляр частного клиента.

gcloud workbench instances create workbench-tutorial --vm-image-project=deeplearning-platform-release --vm-image-family=common-cpu-notebooks --machine-type=n1-standard-4 --location=us-central1-a --subnet-region=us-central1 --subnet=workbench-subnet --disable-public-ip --shielded-secure-boot=true --service-account-email=notebook-sa@$projectid.iam.gserviceaccount.com

8. Конвейеры Vertex AI для проверки связи test-svc-1

Откройте новую вкладку Cloud Shell и обновите настройки проекта.

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

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

Для обеспечения подключения Vertex AI Pipelines к test-svc-1 создайте правила входящего трафика брандмауэра, указав в качестве источника (192.168.10.0/28) сетевое подключение PSC и в качестве адреса назначения IP-адрес test-svc-1.

В Cloud Shell обновите диапазон адресов назначения, указав в нем IP-адрес вашей службы test-svc-1.

gcloud compute --project=$projectid firewall-rules create allow-icmp-vertex-pipelines-to-test-svc1-vm --direction=INGRESS --priority=1000 --network=consumer-vpc --action=ALLOW  --source-ranges=192.168.10.0/28 --destination-ranges=<your-test-svc-1-vm-ip> --rules=icmp

Пример:

gcloud compute --project=$projectid firewall-rules create allow-icmp-vertex-pipelines-to-test-svc1-vm --direction=INGRESS --priority=1000 --network=consumer-vpc --action=ALLOW  --source-ranges=192.168.10.0/28 --destination-ranges=192.168.20.2 --rules=icmp

Войдите в экземпляр test-svc-1, используя IAP в Cloud Shell.

gcloud compute ssh test-svc-1 --project=$projectid --zone=us-central1-a --tunnel-through-iap

В операционной системе выполните команду tcpdump для захвата ICMP-трафика. Эта сессия ОС будет использоваться для проверки связи между Vertex AI Pipeline и виртуальной машиной.

sudo tcpdump -i any icmp -nn

9. Обновление агента службы Vertex AI

Компания Vertex AI Pipelines действует от вашего имени для выполнения таких операций, как получение IP-адреса из подсети сетевого подключения PSC, используемой для создания интерфейса PSC. Для этого Vertex AI Pipelines использует сервисный агент (указан ниже), для работы с которым требуются права сетевого администратора .

service-$projectnumber@gcp-sa-aiplatform.iam.gserviceaccount.com

Внутри Cloud Shell получите номер своего проекта.

gcloud projects describe $projectid | grep projectNumber

Пример:

gcloud projects describe $projectid | grep projectNumber:
projectNumber: '795057945528'

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

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-<your-projectnumber>@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"

Пример:

gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:service-795057945528@gcp-sa-aiplatform.iam.gserviceaccount.com" --role="roles/compute.networkAdmin"

10. Обновление учетной записи службы по умолчанию

Включите API Compute Engine и предоставьте вашей учетной записи службы по умолчанию доступ к Vertex AI. Обратите внимание, что для распространения изменений в доступе может потребоваться некоторое время.

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

gcloud projects add-iam-policy-binding $projectid \
  --member="serviceAccount:<your-projectnumber>-compute@developer.gserviceaccount.com" \
    --role="roles/aiplatform.user"

Пример:

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

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

В следующем разделе вы создадите блокнот для успешного выполнения команды PING к экземпляру test-svc-1, используемому потребителем.

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

  1. В консоли Google Cloud перейдите на вкладку «Экземпляры» на странице Vertex AI Workbench.
  2. Рядом с именем вашего экземпляра Vertex AI Workbench (workbench-tutorial) нажмите «Открыть JupyterLab». Ваш экземпляр Vertex AI Workbench откроется в JupyterLab.
  3. Выберите Файл > Создать > Блокнот
  4. Выберите Ядро > Python 3
  5. В новой ячейке блокнота выполните следующую команду, чтобы убедиться, что у вас установлена ​​последняя версия pip:
! pip3 install --upgrade --quiet google-cloud-aiplatform \
  kfp \
  google-cloud-pipeline-components
  1. Задайте переменные проекта в новой ячейке блокнота.
PROJECT_ID = "<your-projectid>" 
REGION = "<your-region>"  
NETWORK_ATTACHMENT_NAME = "psc-network-attachment"

Пример:

PROJECT_ID = "psc-vertex" 
REGION = "us-central1"  
NETWORK_ATTACHMENT_NAME = "psc-network-attachment"
  1. Задайте глобально уникальное имя сегмента в виде переменной в новой ячейке блокнота.
BUCKET_URI = f"gs://<your-bucket-name>"

Пример:

BUCKET_URI = f"gs://psc-vertex-bucket"
  1. В новой ячейке блокнота создайте корзину.
! gsutil mb -l {REGION} -p {PROJECT_ID} {BUCKET_URI}

В следующем разделе вы определите учетную запись службы Compute Engine по умолчанию, которая будет использоваться для запуска задания конвейера, а также предоставите ей необходимые разрешения.

shell_output = ! gcloud projects describe $PROJECT_ID
PROJECT_NUMBER = shell_output[-1].split(":")[1].strip().replace("'", "")
SERVICE_ACCOUNT = f"{PROJECT_NUMBER}-compute@developer.gserviceaccount.com"

print(f"Project Number: {PROJECT_NUMBER}")
print(f"Service Account: {SERVICE_ACCOUNT}")

Для подтверждения успешного выполнения заказа распечатываются номер вашего сервисного счета и номер проекта.

  1. В новой ячейке блокнота предоставьте учетной записи службы разрешение на чтение и запись артефактов конвейера в хранилище, созданное на предыдущем шаге.
! gsutil iam ch serviceAccount:{SERVICE_ACCOUNT}:roles/storage.objectCreator {BUCKET_URI}

! gsutil iam ch serviceAccount:{SERVICE_ACCOUNT}:roles/storage.objectViewer {BUCKET_URI}
  1. В новой ячейке блокнота определите параметры конвейера. Обратите внимание, что NETWORK_ATTACHMENT_NAME — это имя сетевого подключения PSC, поэтому оно должно совпадать.
PIPELINE_ROOT = f"{BUCKET_URI}/pipeline_root/psc_test"
NETWORK_ATTACHMENT_URI = f"projects/{PROJECT_NUMBER}/regions/{REGION}/networkAttachments/{NETWORK_ATTACHMENT_NAME}"
  1. В новой ячейке ноутбука инициализируйте Vertex AI SDK.
from kfp import dsl
from google.cloud import aiplatform, aiplatform_v1beta1
import time
from google.cloud.aiplatform_v1.types import pipeline_state
import yaml
from datetime import datetime
import logging
aiplatform.init(project=PROJECT_ID, location=REGION, staging_bucket=BUCKET_URI)

# Configure logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
  1. В новой ячейке блокнота определите компонент теста.
@dsl.container_component
def ping_check(network_address: str):
    """Pings a network address

    Args:
        network_address: The IP address to ping
    """

    return dsl.ContainerSpec(
        image="ubuntu:22.04",
        command=["sh", "-c"],
        args=[
            f"""
            
            # Use sed for regex replacement, cleaner than bash parameter expansion for this
            cleaned_address=$(echo "{network_address}" | sed 's/[^0-9.]//g')
            apt-get update && apt-get install inetutils-traceroute inetutils-ping -y
            
            echo "Will ping $cleaned_address"
            if ! ping -c 3 $cleaned_address; then
                echo "Ping failed"
                traceroute -w 1 -m 7 $cleaned_address
                exit 1
            fi
            """
        ],
    )
  1. В новой ячейке блокнота определите конвейер обработки данных.
@dsl.pipeline(name="check-connectivity")
def pipeline(ip_address: str):
    """Pings an IP address. Facilitated by a Private Service Connect Interface

    Args:
        ip_address: The IP address to ping
    """
    ping_check(network_address=ip_address).set_caching_options(False)
    return
  1. В новой ячейке блокнота выполните вспомогательную функцию и дождитесь завершения конвейера.
def wait_for_pipeline(
    project_id: str,
    region: str,
    pipeline_job_resource_name: str,
    timeout: int = 20 * 60,  # Default timeout of 20 minutes (in seconds)
) -> bool:
    """
    Waits for a Vertex AI pipeline to finish, with a timeout.

    Args:
        project_id (str): The Google Cloud project ID.
        region (str): The region where the pipeline is running.
        pipeline_job_resource_name (str): The resource name of the pipeline job.
        timeout (int): The maximum time to wait for the pipeline to finish, in seconds.
                       Defaults to 20 minutes (1200 seconds).

    Returns:
        bool: True if the pipeline succeeded, False otherwise.

    Raises:
        TimeoutError: If the pipeline does not finish within the specified timeout.
    """

    # Initialize the AIPlatform client
    aiplatform.init(project=project_id, location=region)

    # Get the pipeline job
    pipeline_job = aiplatform.PipelineJob.get(resource_name=pipeline_job_resource_name)
    logging.info(
        f"Vertex AI Console Link: https://console.cloud.google.com/vertex-ai/pipelines/locations/{region}/runs/{pipeline_job.resource_name.split('/')[-1]}?project={project_id}"
    )

    start_time = time.time()
    while True:
        status = pipeline_job.state
        logging.info(f"Pipeline Job status: {status.name}")

        if status in [
            pipeline_state.PipelineState.PIPELINE_STATE_SUCCEEDED,
            pipeline_state.PipelineState.PIPELINE_STATE_FAILED,
            pipeline_state.PipelineState.PIPELINE_STATE_CANCELLED,
        ]:
            break  # Exit the loop if the job is finished

        if time.time() - start_time > timeout:
            logging.error(f"Pipeline timed out after {timeout} seconds.")
            raise TimeoutError(f"Pipeline timed out after {timeout} seconds.")
        
        # Wait for a short time before checking again
        time.sleep(10)  # Adjust the wait time as needed

    # Do something based on the final status
    if status == pipeline_state.PipelineState.PIPELINE_STATE_SUCCEEDED:
        logging.info("Pipeline succeeded")
        return True
    elif status == pipeline_state.PipelineState.PIPELINE_STATE_CANCELLED:
        logging.error("Pipeline cancelled")
        raise Exception("Pipeline cancelled")
    elif status == pipeline_state.PipelineState.PIPELINE_STATE_FAILED:
        logging.error("Pipeline failed")
        raise Exception("Pipeline failed")
  1. В новой ячейке блокнота выполните вспомогательную функцию для запуска конвейера.
def run_job_with_psc_interface_config(
    project_id: str,
    region: str,
    pipeline_root: str,
    network_attachment_name: str,
    ip_address: str,
    local_pipeline_file: str = "pipeline.yaml",
):
    """
    Compiles, submits, and monitors a Vertex AI pipeline.
    """

    parameter_values = {"ip_address": ip_address}
    pipeline_root = f"{pipeline_root}/{datetime.now().strftime('%Y%m%d%H%M%S')}"
    logging.info("Compiling pipeline")

    try:
        with open(local_pipeline_file, "r") as stream:
            pipeline_spec = yaml.safe_load(stream)
            logging.info(f"Pipeline Spec: {pipeline_spec}")
    except yaml.YAMLError as exc:
        logging.error(f"Error loading pipeline yaml file: {exc}")
        raise
    
    logging.info(f"Will use pipeline root: {pipeline_root}")
    # Initialize the Vertex SDK using PROJECT_ID and LOCATION
    aiplatform.init(project=project_id, location=region)

    # Create the API endpoint
    client_options = {"api_endpoint": f"{region}-aiplatform.googleapis.com"}

    # Initialize the PipelineServiceClient
    client = aiplatform_v1beta1.PipelineServiceClient(client_options=client_options)

    # Construct the request
    request = aiplatform_v1beta1.CreatePipelineJobRequest(
        parent=f"projects/{project_id}/locations/{region}",
        pipeline_job=aiplatform_v1beta1.PipelineJob(
            display_name="pipeline-with-psc-interface-config",
            pipeline_spec=pipeline_spec,
            runtime_config=aiplatform_v1beta1.PipelineJob.RuntimeConfig(
                gcs_output_directory=pipeline_root, parameter_values=parameter_values
            ),
            psc_interface_config=aiplatform_v1beta1.PscInterfaceConfig(
                network_attachment=network_attachment_name
            ),
        ),
    )

    # Make the API call
    response = client.create_pipeline_job(request=request)

    # Print the response
    logging.info(f"Pipeline job created: {response.name}")

    return response.name
  1. В новой ячейке блокнота скомпилируйте конвейер.
from kfp import compiler
compiler.Compiler().compile(pipeline_func=pipeline, package_path='pipeline.yaml')
  1. В новой ячейке блокнота обновите значение параметра TARGET_IP_ADDRESS, указав IP-адрес, полученный на предыдущем шаге для test-svc-1, и проверьте статус задания конвейера.
TARGET_IP_ADDRESS = "<your-test-svc-1-ip>"
try:
    job_name = run_job_with_psc_interface_config(
        project_id=PROJECT_ID,
        region=REGION,
        pipeline_root=PIPELINE_ROOT,
        network_attachment_name=NETWORK_ATTACHMENT_URI,
        ip_address=TARGET_IP_ADDRESS,
    )
    wait_for_pipeline(
        project_id=PROJECT_ID,
        region=REGION,
        pipeline_job_resource_name=job_name,
    )
except Exception as e:
    logging.error(f"An error occurred: {e}")

Пример:

TARGET_IP_ADDRESS = "192.168.20.2"
try:
    job_name = run_job_with_psc_interface_config(
        project_id=PROJECT_ID,
        region=REGION,
        pipeline_root=PIPELINE_ROOT,
        network_attachment_name=NETWORK_ATTACHMENT_URI,
        ip_address=TARGET_IP_ADDRESS,
    )
    wait_for_pipeline(
        project_id=PROJECT_ID,
        region=REGION,
        pipeline_job_resource_name=job_name,
    )
except Exception as e:
    logging.error(f"An error occurred: {e}")

После выполнения шага 17 конвейер завершится примерно за 8 минут.

12. Проверьте подключение к test-svc-1

В ячейке, используемой для выполнения шага 17, обратите внимание на изменение статуса задания конвейера с PIPELINE_STATE_PENDING на PIPELINE_STATE_RUNNING и, наконец, на PIPELINE_STATE_SUCCEEDED, что указывает на успешное подключение от Vertex AI Pipelines и ответ от test-svc-1.

Для проверки ICMP-трафика между Vertex AI Pipeline и test-svc-1 просмотрите ранее сгенерированную сессию tcpdump, выполненную в ОС test-svc-1, которая содержит журналы, указывающие на двунаправленный трафик.

В примере с tcpdump компания Vertex AI Pipelines получила IP-адрес 192.168.10.3 из подсети 192.168.10.0/28, а 192.168.20.2 — это IP-адрес test-svc-1. Обратите внимание, что в вашей среде IP-адреса могут отличаться.

user@test-svc-1:~$ sudo tcpdump -i any icmp -nn
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
18:57:54.737490 ens4  In  IP 192.168.10.3 > 192.168.20.2: ICMP echo request, id 257, seq 0, length 64
18:57:54.737523 ens4  Out IP 192.168.20.2 > 192.168.10.3: ICMP echo reply, id 257, seq 0, length 64

13. Vertex AI Pipelines: AI для тестирования подключения сервиса svc-2

В следующем разделе вы создадите правило входящего межсетевого экрана для запрета трафика из подсети Vertex AI Pilelines (192.168.10.0/28) в test-svc-2, затем обновите Notebook, указав IP-адрес test-svc-2, и, наконец, выполните запуск заданий Pipelines.

В ячейке блокнота в статусе задания конвейера будет отображаться ошибка — сбой конвейера, а журналы брандмауэра предоставят информацию о сбое подключения.

Создайте правило брандмауэра, запрещающее входящий трафик.

Чтобы запретить подключение Vertex AI Pipelines к test-svc-2, создайте правила входящего брандмауэра, указав в качестве источника (192.168.10.0/28) сетевое подключение PSC и в качестве адреса назначения IP-адрес test-svc-2.

В Cloud Shell обновите диапазон адресов назначения, указав в нем IP-адрес вашей службы test-svc-2.

gcloud compute --project=$projectid firewall-rules create deny-icmp-vertex-pipelines-to-test-svc2-vm --direction=INGRESS --priority=1000 --network=consumer-vpc --action=DENY  --source-ranges=192.168.10.0/28 --rules=ALL --destination-ranges=<your-test-svc-2-vm-ip> --rules=icmp --enable-logging

Пример:

gcloud compute --project=$projectid firewall-rules create deny-icmp-vertex-pipelines-to-test-svc2-vm --direction=INGRESS --priority=1000 --network=consumer-vpc --action=DENY  --source-ranges=192.168.10.0/28 --rules=ALL --destination-ranges=192.168.30.2 --enable-logging

Выполнить задание конвейера из ячейки ноутбука.

В новой ячейке блокнота обновите значение параметра TARGET_IP_ADDRESS, указав IP-адрес, полученный на предыдущем шаге для test-svc-2, и проверьте статус задания конвейера.

TARGET_IP_ADDRESS = "<your-test-svc-2-ip>"
try:
    job_name = run_job_with_psc_interface_config(
        project_id=PROJECT_ID,
        region=REGION,
        pipeline_root=PIPELINE_ROOT,
        network_attachment_name=NETWORK_ATTACHMENT_URI,
        ip_address=TARGET_IP_ADDRESS,
    )
    wait_for_pipeline(
        project_id=PROJECT_ID,
        region=REGION,
        pipeline_job_resource_name=job_name,
    )
except Exception as e:
    logging.error(f"An error occurred: {e}")

Пример:

TARGET_IP_ADDRESS = "192.168.30.2"
try:
    job_name = run_job_with_psc_interface_config(
        project_id=PROJECT_ID,
        region=REGION,
        pipeline_root=PIPELINE_ROOT,
        network_attachment_name=NETWORK_ATTACHMENT_URI,
        ip_address=TARGET_IP_ADDRESS,
    )
    wait_for_pipeline(
        project_id=PROJECT_ID,
        region=REGION,
        pipeline_job_resource_name=job_name,
    )
except Exception as e:
    logging.error(f"An error occurred: {e}")

После запуска выполнение задачи в конвейере займет около 8 минут.

14. Проверьте наличие проблем с подключением к test-svc-2.

В ячейке, используемой для выполнения задания Pipelines, обратите внимание на изменение статуса с PIPELINE_STATE_PENDING на PIPELINE_STATE_FAILED, указывающее на неудачный пинг от Vertex AI Pipelines и ответ от test-svc-2.

С помощью Log Explorer можно просмотреть записи журналов брандмауэра, соответствующие правилу запрета входящего трафика, включающему подсеть Vertex AI Pipelines (192.168.10.0/28) и IP-адрес test-svc-2.

Выберите «Показать запрос» и вставьте фильтр ниже: «последние 15 минут», а затем «Выполнить запрос».

jsonPayload.rule_details.reference:("network:consumer-vpc/firewall:deny-icmp-vertex-pipelines-to-test-svc2-vm")

20e072f26d9a113b.png

5fb3d2de0a85e3c6.png

Выберите запись в журнале, а затем разверните вложенные поля, чтобы отобразить информационные элементы, состоящие из конвейеров Vertex AI и IP-адреса test-svc-2, подтверждающего правило брандмауэра о запрете входящего трафика.

903aaf2c10d07460.png

15. Уборка

В Cloud Shell удалите компоненты учебного пособия.

gcloud compute instances delete test-svc-1 test-svc-2 --zone=us-central1-a --quiet

gcloud workbench instances delete workbench-tutorial --location=us-central1-a --quiet

gcloud compute firewall-rules delete deny-icmp-vertex-pipelines-to-test-svc2-vm allow-icmp-vertex-pipelines-to-test-svc1-vm ssh-iap-consumer --quiet

gcloud compute routers nats delete cloud-nat-us-central1 --router=cloud-router-us-central1 --region us-central1 --quiet

gcloud compute routers delete cloud-router-us-central1 --region=us-central1 --quiet

16. Поздравляем!

Поздравляем, вы успешно настроили и проверили интерфейс подключения частной службы (Private Service Connect Interface), а также подключение потребителей и производителей, внедрив межсетевой экран с разрешениями и запретами входящего трафика.

Вы создали инфраструктуру для потребителей и добавили сетевое соединение, которое позволило сервису Vertex AI Pipelines создать виртуальную машину интерфейса PSC для обеспечения связи между потребителями и производителями. Вы научились создавать правила брандмауэра в сети VPC потребителей, которые разрешали и запрещали подключение к экземплярам в сети потребителей.

Cosmopup считает, что обучающие материалы — это здорово!!

c911c127bffdee57.jpeg

Что дальше?

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

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