使用 Private Service Connect 从本地访问 Vector Search 索引


本地主机可以通过两种方式访问 Vector Search 索引端点:公共互联网,或通过 Cloud VPN 或 Cloud Interconnect 使用 Private Service Connect (PSC) 的混合网络架构(以私密方式访问)。这两个选项都提供 SSL/TLS 加密。但是,专用选项可提供更好的性能,因此建议用于关键应用。

在本教程中,您将使用高可用性 VPN (HA VPN) 在可用作多云和本地专用连接基础的两个虚拟私有云 (VPC) 网络之间以私密方式访问 Vector Search 索引端点。

本教程适用于熟悉 Vertex AI、虚拟私有云、Google Cloud 控制台和 Cloud Shell 的企业网络管理员、数据科学家和研究人员。熟悉 Vector Search 会很有帮助,但不强制要求。

使用 Private Service Connect 从本地访问 Vector Search 索引的架构图。

目标

  • 创建两个 VPC 网络,如上图所示:
    • 一个 (onprem-vpc) 表示一个本地网络。
    • 另一个 (vertex-networking-vpc) 用于 Vector Search 索引端点。
  • 部署高可用性 VPN 网关、Cloud VPN 隧道和 Cloud Router 路由器,以连接 vertex-networking-vpconprem-vpc
  • 构建和部署 Vector Search 索引。
  • 创建 Private Service Connect (PSC) 端点,以将查询转发到 Vector Search 索引端点。
  • vertex-networking-vpc 中配置 Cloud Router 路由器自定义路由通告,以向 onprem-vpc 通告 Private Service Connect 端点的路由。
  • onprem-vpc 中创建 Compute Engine 虚拟机实例,以表示通过高可用性 VPN 向 Vector Search 索引端点发送请求的客户端应用。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

须知事项

  1. In the Google Cloud console, go to the project selector page.

    Go to project selector

  2. Select or create a Google Cloud project.

  3. Make sure that billing is enabled for your Google Cloud project.

  4. 打开 Cloud Shell 以执行本教程中列出的命令。Cloud Shell 是 Google Cloud 的交互式 Shell 环境,可让您通过网络浏览器管理项目和资源。
  5. 在 Cloud Shell 中,将当前项目设置为您的 Google Cloud 项目 ID,并将同一项目 ID 存储在 projectid shell 变量中:
      projectid="PROJECT_ID"
      gcloud config set project ${projectid}
    PROJECT_ID 替换为您的项目 ID。如有必要,您可以在 Google Cloud 控制台中查找项目 ID。如需了解详情,请参阅查找项目 ID
  6. 如果您不是项目所有者,请让项目所有者为您授予 Project IAM Admin (roles/resourcemanager.projectIamAdmin) 角色。您必须具有此角色才能在下一步中授予 IAM 角色。
  7. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/aiplatform.user, roles/compute.instanceAdmin.v1, roles/compute.networkAdmin, roles/compute.securityAdmin, roles/dns.admin, roles/iam.serviceAccountAdmin, roles/iam.serviceAccountUser, roles/iap.admin, roles/iap.tunnelResourceAccessor, roles/notebooks.admin, roles/servicemanagement.quotaAdmin, roles/servicedirectory.editor, roles/storage.admin, roles/aiplatform.admin, roles/aiplatform.user, roles/resourcemanager.projectIamAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.
  8. Enable the DNS、IAM、Compute Engine、Notebooks 和 Vertex AI APIs:

    gcloud services enable dns.googleapis.com iam.googleapis.com compute.googleapis.com notebooks.googleapis.com aiplatform.googleapis.com

创建 VPC 网络

在本部分中,您将创建两个 VPC 网络:一个用于创建 Vector Search 索引并将其部署到端点,另一个用于对该端点进行专用访问。

为 Vector Search 索引端点创建 VPC 网络 (vertex-networking-vpc)

  1. 为索引端点创建 VPC 网络:

    gcloud compute networks create vertex-networking-vpc --project=$projectid --subnet-mode custom
    
  2. 创建一个名为 workbench-subnet 的子网,其主要 IPv4 范围为 172.16.20.0/28

    gcloud compute networks subnets create workbench-subnet \
      --project=$projectid --range=172.16.20.0/28 \
      --network=vertex-networking-vpc \
      --region=us-central1 \
      --enable-private-ip-google-access
    
  3. 创建一个名为 consumer-endpoint-subnet 的子网,其主要 IPv4 范围为 172.16.30.0/28

    gcloud compute networks subnets create consumer-endpoint-subnet \
      --project=$projectid \
      --range=172.16.30.0/28 \
      --network=vertex-networking-vpc \
      --region=us-central1 \
      --enable-private-ip-google-access
    

创建用于对端点进行专用访问的 VPC 网络 (onprem-vpc)

  1. 创建用于模拟本地网络的 VPC 网络 (onprem-vpc):

    gcloud compute networks create onprem-vpc \
      --subnet-mode custom
    
  2. onprem-vpc 网络中,创建一个名为 onprem-vpc-subnet1 的子网,其主要 IPv4 范围为 172.16.10.0/29

    gcloud compute networks subnets create onprem-vpc-subnet1 \
      --network onprem-vpc \
      --range 172.16.10.0/29 \
      --region us-central1
    

验证 VPC 网络是否已正确配置

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面中的当前项目中的网络标签页。

    进入 VPC 网络页面

  2. 在 VPC 网络列表中,验证是否已创建 vertex-networking-vpconprem-vpc 这两个网络。

  3. 点击当前项目中的子网标签页。

  4. 在 VPC 子网列表中,验证是否已创建 workbench-subnetconsumer-endpoint-subnetonprem-vpc-subnet1 子网。

创建 on-prem-client 虚拟机实例

在本部分中,您将创建一个虚拟机实例,以表示通过高可用性 VPN 向 Vector Search 索引端点发送请求的客户端应用。

  1. 在 Cloud Shell 中,创建 on-prem-client 虚拟机实例:

    gcloud compute instances create on-prem-client \
      --zone=us-central1-a \
      --image-family=debian-11 \
      --image-project=debian-cloud \
      --subnet=onprem-vpc-subnet1 \
      --scopes=https://www.googleapis.com/auth/cloud-platform \
      --no-address \
      --shielded-secure-boot \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install tcpdump dnsutils -y"
    
    

配置混合连接

在本部分中,您将创建两个相互连接的高可用性 VPN 网关。一个位于 vertex-networking-vpc VPC 网络中。另一个位于 onprem-vpc VPC 网络中。每个网关包含一个 Cloud Router 路由器和一对 VPN 隧道。

创建高可用性 VPN 网关

  1. 在 Cloud Shell 中,为 vertex-networking-vpc VPC 网络创建高可用性 VPN 网关:

    gcloud compute vpn-gateways create vertex-networking-vpn-gw1 \
       --network vertex-networking-vpc \
       --region us-central1
    
  2. onprem-vpc VPC 网络创建高可用性 VPN 网关:

    gcloud compute vpn-gateways create onprem-vpn-gw1 \
       --network onprem-vpc \
       --region us-central1
    
  3. 在 Google Cloud 控制台中,前往 VPN 页面中的 Cloud VPN 网关标签页。

    转到 VPN

  4. 验证是否已创建两个网关(vertex-networking-vpn-gw1onprem-vpn-gw1),并且每个网关具有两个接口 IP 地址。

创建 Cloud Router 路由器和 Cloud NAT 网关

在两个 VPC 网络中,您都将创建两个 Cloud Router 路由器:一个通用路由器和一个区域级路由器。在每个区域级 Cloud Router 路由器中,您都将创建一个 Cloud NAT 网关。Cloud NAT 网关为没有外部 IP 地址的 Compute Engine 虚拟机 (VM) 实例提供传出连接。

  1. 在 Cloud Shell 中,为 vertex-networking-vpc VPC 网络创建一个 Cloud Router 路由器:

    gcloud compute routers create vertex-networking-vpc-router1 \
       --region us-central1\
       --network vertex-networking-vpc \
       --asn 65001
    
  2. onprem-vpc VPC 网络创建一个 Cloud Router 路由器:

    gcloud compute routers create onprem-vpc-router1 \
       --region us-central1\
       --network onprem-vpc\
       --asn 65002
    
  3. vertex-networking-vpc VPC 网络创建一个区域级 Cloud Router 路由器:

    gcloud compute routers create cloud-router-us-central1-vertex-nat \
      --network vertex-networking-vpc \
      --region us-central1
    
  4. 在区域级 Cloud Router 路由器上配置 Cloud NAT 网关:

    gcloud compute routers nats create cloud-nat-us-central1 \
      --router=cloud-router-us-central1-vertex-nat \
      --auto-allocate-nat-external-ips \
      --nat-all-subnet-ip-ranges \
      --region us-central1
    
  5. onprem-vpc VPC 网络创建一个区域级 Cloud Router 路由器:

    gcloud compute routers create cloud-router-us-central1-onprem-nat \
      --network onprem-vpc \
      --region us-central1
    
  6. 在区域级 Cloud Router 路由器上配置 Cloud NAT 网关:

    gcloud compute routers nats create cloud-nat-us-central1-on-prem \
      --router=cloud-router-us-central1-onprem-nat \
      --auto-allocate-nat-external-ips \
      --nat-all-subnet-ip-ranges \
      --region us-central1
    
  7. 在 Google Cloud 控制台中,前往 Cloud Router 路由器页面。

    前往“Cloud Router 路由器”

  8. Cloud Router 路由器列表中,验证是否已创建以下路由器:

    • cloud-router-us-central1-onprem-nat
    • cloud-router-us-central1-vertex-nat
    • onprem-vpc-router1
    • vertex-networking-vpc-router1

    您可能需要刷新 Google Cloud 控制台浏览器标签页才能查看新值。

  9. 在 Cloud Router 路由器列表中,点击 cloud-router-us-central1-vertex-nat

  10. 路由器详情页面中,验证是否已创建 cloud-nat-us-central1 Cloud NAT 网关。

  11. 点击 返回箭头以返回 Cloud Router 路由器页面。

  12. 在路由器列表中,点击 cloud-router-us-central1-onprem-nat

  13. 路由器详情页面中,验证是否已创建 cloud-nat-us-central1-on-prem Cloud NAT 网关。

创建 VPN 隧道

  1. 在 Cloud Shell 中,在 vertex-networking-vpc 网络中创建一个名为 vertex-networking-vpc-tunnel0 的 VPN 隧道:

    gcloud compute vpn-tunnels create vertex-networking-vpc-tunnel0 \
      --peer-gcp-gateway onprem-vpn-gw1 \
      --region us-central1 \
      --ike-version 2 \
      --shared-secret [ZzTLxKL8fmRykwNDfCvEFIjmlYLhMucH] \
      --router vertex-networking-vpc-router1 \
      --vpn-gateway vertex-networking-vpn-gw1 \
      --interface 0
    
  2. vertex-networking-vpc 网络中,创建一个名为 vertex-networking-vpc-tunnel1 的 VPN 隧道:

    gcloud compute vpn-tunnels create vertex-networking-vpc-tunnel1 \
      --peer-gcp-gateway onprem-vpn-gw1 \
      --region us-central1 \
      --ike-version 2 \
      --shared-secret [bcyPaboPl8fSkXRmvONGJzWTrc6tRqY5] \
      --router vertex-networking-vpc-router1 \
      --vpn-gateway vertex-networking-vpn-gw1 \
      --interface 1
    
  3. onprem-vpc 网络中,创建一个名为 onprem-vpc-tunnel0 的 VPN 隧道:

    gcloud compute vpn-tunnels create onprem-vpc-tunnel0 \
      --peer-gcp-gateway vertex-networking-vpn-gw1 \
      --region us-central1\
      --ike-version 2 \
      --shared-secret [ZzTLxKL8fmRykwNDfCvEFIjmlYLhMucH] \
      --router onprem-vpc-router1 \
      --vpn-gateway onprem-vpn-gw1 \
      --interface 0
    
  4. onprem-vpc 网络中,创建一个名为 onprem-vpc-tunnel1 的 VPN 隧道:

    gcloud compute vpn-tunnels create onprem-vpc-tunnel1 \
      --peer-gcp-gateway vertex-networking-vpn-gw1 \
      --region us-central1\
      --ike-version 2 \
      --shared-secret [bcyPaboPl8fSkXRmvONGJzWTrc6tRqY5] \
      --router onprem-vpc-router1 \
      --vpn-gateway onprem-vpn-gw1 \
      --interface 1
    
  5. 在 Google Cloud 控制台中,转到 VPN 页面。

    转到 VPN

  6. 在 VPN 隧道列表中,验证是否已创建这四个 VPN 隧道。

建立 BGP 会话

Cloud Router 路由器使用边界网关协议 (BGP) 在 VPC 网络(在本例中为 vertex-networking-vpc)和本地网络(由 onprem-vpc 表示)之间交换路由。在 Cloud Router 路由器上,为本地路由器配置接口和 BGP 对等端。此接口和 BGP 对等配置共同构成了 BGP 会话。在本部分中,您将分别为 vertex-networking-vpconprem-vpc 创建两个 BGP 会话。

在路由器之间配置接口和 BGP 对等方后,它们将自动开始交换路由。

vertex-networking-vpc 建立 BGP 会话

  1. 在 Cloud Shell 中,在 vertex-networking-vpc 网络中为 vertex-networking-vpc-tunnel0 创建一个 BGP 接口:

    gcloud compute routers add-interface vertex-networking-vpc-router1 \
      --interface-name if-tunnel0-to-onprem \
      --ip-address 169.254.0.1 \
      --mask-length 30 \
      --vpn-tunnel vertex-networking-vpc-tunnel0 \
      --region us-central1
    
  2. vertex-networking-vpc 网络中,为 bgp-onprem-tunnel0 创建一个 BGP 对等方:

    gcloud compute routers add-bgp-peer vertex-networking-vpc-router1 \
      --peer-name bgp-onprem-tunnel0 \
      --interface if-tunnel0-to-onprem \
      --peer-ip-address 169.254.0.2 \
      --peer-asn 65002 \
      --region us-central1
    
  3. vertex-networking-vpc 网络中,为 vertex-networking-vpc-tunnel1 创建一个 BGP 接口:

    gcloud compute routers add-interface vertex-networking-vpc-router1 \
      --interface-name if-tunnel1-to-onprem \
      --ip-address 169.254.1.1 \
      --mask-length 30 \
      --vpn-tunnel vertex-networking-vpc-tunnel1 \
      --region us-central1
    
  4. vertex-networking-vpc 网络中,为 bgp-onprem-tunnel1 创建一个 BGP 对等方:

    gcloud compute routers add-bgp-peer vertex-networking-vpc-router1 \
      --peer-name bgp-onprem-tunnel1 \
      --interface if-tunnel1-to-onprem \
      --peer-ip-address 169.254.1.2 \
      --peer-asn 65002 \
      --region us-central1
    

onprem-vpc 建立 BGP 会话

  1. onprem-vpc 网络中,为 onprem-vpc-tunnel0 创建一个 BGP 接口:

    gcloud compute routers add-interface onprem-vpc-router1 \
      --interface-name if-tunnel0-to-vertex-networking-vpc \
      --ip-address 169.254.0.2 \
      --mask-length 30 \
      --vpn-tunnel onprem-vpc-tunnel0 \
      --region us-central1
    
  2. onprem-vpc 网络中,为 bgp-vertex-networking-vpc-tunnel0 创建一个 BGP 对等方:

    gcloud compute routers add-bgp-peer onprem-vpc-router1 \
      --peer-name bgp-vertex-networking-vpc-tunnel0 \
      --interface if-tunnel0-to-vertex-networking-vpc \
      --peer-ip-address 169.254.0.1 \
      --peer-asn 65001 \
      --region us-central1
    
  3. onprem-vpc 网络中,为 onprem-vpc-tunnel1 创建一个 BGP 接口:

    gcloud compute routers add-interface   onprem-vpc-router1  \
      --interface-name if-tunnel1-to-vertex-networking-vpc \
      --ip-address 169.254.1.2 \
      --mask-length 30 \
      --vpn-tunnel onprem-vpc-tunnel1 \
      --region us-central1
    
  4. onprem-vpc 网络中,为 bgp-vertex-networking-vpc-tunnel1 创建一个 BGP 对等方:

    gcloud compute routers add-bgp-peer onprem-vpc-router1 \
      --peer-name bgp-vertex-networking-vpc-tunnel1 \
      --interface if-tunnel1-to-vertex-networking-vpc \
      --peer-ip-address 169.254.1.1 \
      --peer-asn 65001 \
      --region us-central1
    

验证 BGP 会话创建

  1. 在 Google Cloud 控制台中,转到 VPN 页面。

    转到 VPN

  2. 在 VPN 隧道列表中,验证每个隧道的 BGP 会话状态列中的值是否已从 配置 BGP 会话更改为 BGP 已建立。您可能需要刷新 Google Cloud 控制台浏览器标签页才能查看新值。

验证 vertex-networking-vpc 是否了解路由

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

    进入 VPC 网络页面

  2. 在 VPC 网络列表中,点击 vertex-networking-vpc

  3. 点击路由标签页。

  4. 区域列表中选择 us-central1(爱荷华),然后点击查看

  5. 目标 IP 范围列中,验证 onprem-vpc-subnet1 子网的 IP 范围 (172.16.10.0/29) 是否出现两次。

验证 on-prem-vpc 是否了解路由

  1. 点击 返回箭头以返回 VPC 网络页面。

  2. 在 VPC 网络列表中,点击 on-prem-vpc

  3. 点击路由标签页。

  4. 区域列表中选择 us-central1(爱荷华),然后点击查看

  5. 目标 IP 范围列中,验证 workbench-subnet 子网的 IP 范围 (172.16.20.0/28) 和 consumer-endpoint-subnet 子网的 IP 范围 (172.16.30.0/28) 是否各自出现两次。

创建 Vertex AI Workbench 实例

在本部分中,您将创建一个用户管理的服务账号,然后创建一个使用您的服务账号访问 Google Cloud 服务和 API 的 Vertex AI Workbench 实例。

创建服务账号

在本教程中,您将按照 Compute Engine 和 IAM 最佳实践创建用户管理的服务账号。

  1. 在 Cloud Shell 中,创建一个名为 workbench-sa 的服务账号:

    gcloud iam service-accounts create workbench-sa \
       --display-name="workbench-sa"
    
  2. Vertex AI User (roles/aiplatform.user) IAM 角色分配给该服务账号:

    gcloud projects add-iam-policy-binding $projectid \
      --member="serviceAccount:workbench-sa@$projectid.iam.gserviceaccount.com" \
      --role="roles/aiplatform.user"
    
  3. Storage Admin (roles/storage.admin) IAM 角色分配给该服务账号:

    gcloud projects add-iam-policy-binding $projectid \
      --member="serviceAccount:workbench-sa@$projectid.iam.gserviceaccount.com" \
      --role="roles/storage.admin"
    
  4. Service Usage Admin (roles/serviceusage.serviceUsageAdmin) IAM 角色分配给该服务账号:

    gcloud projects add-iam-policy-binding $projectid \
      --member="serviceAccount:workbench-sa@$projectid.iam.gserviceaccount.com" \
      --role="roles/serviceusage.serviceUsageAdmin"
    

创建 Vertex AI Workbench 实例

在指定 workbench-sa 服务账号的情况下创建一个 Vertex AI Workbench 实例:

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 \
  --shielded-secure-boot=SHIELDED_SECURE_BOOT \
  --subnet=workbench-subnet \
  --disable-public-ip \
  --service-account-email=workbench-sa@$projectid.iam.gserviceaccount.com

创建和部署 Vector Search 索引

准备环境

  1. 在 Google Cloud 控制台中,转到 Vertex AI Workbench 页面中的实例标签页。

    转到 Vertex AI Workbench

  2. 在 Vertex AI Workbench 实例名称 (workbench-tutorial) 旁边,点击打开 JupyterLab

    您的 Vertex AI Workbench 实例会打开 JupyterLab。

  3. 选择文件 > 新建 > 笔记本

  4. 选择内核菜单中,选择 Python 3(本地),然后点击选择

  5. 当您的新笔记本打开时,有一个默认代码单元,您可以在其中输入代码。它类似于 [ ]:,后跟一个文本字段。您的代码将粘贴到该文本字段中。

    如需安装 Python 版 Vertex AI SDK,请将以下代码粘贴到该单元中,然后点击  运行所选单元并前进

    !pip install --upgrade --user google-cloud-aiplatform google-cloud-storage
    
  6. 在此步骤以及下面的每个步骤中,点击 在下方插入单元以添加新的代码单元(如有必要),将代码粘贴到该单元中,然后点击  运行所选单元并前进

    如需在此 Jupyter 运行时中使用新安装的软件包,您需要重启运行时:

    # Restart kernel after installs so that your environment can access the new packages
    import IPython
    
    app = IPython.Application.instance()
    app.kernel.do_shutdown(True)
    
  7. 设置以下环境变量,将 PROJECT_ID 替换为您的项目 ID。

    # set project ID and location
    PROJECT_ID = "PROJECT_ID"
    LOCATION = "us-central1"
    
    # generate a unique id for this session
    from datetime import datetime
    UID = datetime.now().strftime("%m%d%H%M")
    

启用 API

在您的 Jupyterlab 笔记本中,运行以下命令以在笔记本中启用适用于 Compute Engine、Vertex AI 和 Cloud Storage 的 API:

! gcloud services enable compute.googleapis.com aiplatform.googleapis.com storage.googleapis.com \
  --project {PROJECT_ID}

在 Cloud Storage 存储桶中准备好示例数据

在本教程中,我们使用 Vector Search 快速入门中使用的 TheLook 数据集。如需详细了解此数据集,请参阅快速入门文档页面。

在本部分中,您将创建一个 Cloud Storage 存储桶,并将数据集的嵌入文件保存在该存储桶中。在稍后的步骤中,您将使用此文件构建索引。

  1. 在您的 Jupyterlab 笔记本中,创建一个 Cloud Storage 存储桶:

    BUCKET_URI = f"gs://{PROJECT_ID}-vs-quickstart-{UID}"
    ! gsutil mb -l $LOCATION -p $PROJECT_ID $BUCKET_URI
    
  2. 将示例文件复制到 Cloud Storage 存储桶。

    ! gsutil cp "gs://github-repo/data/vs-quickstart/product-embs.json" $BUCKET_URI
    
  3. 如需使用 Vector Search 运行查询,您还需要将嵌入文件复制到本地目录:

    ! gsutil cp "gs://github-repo/data/vs-quickstart/product-embs.json" . # for query tests
    

创建 Vector Search 索引

  1. 在您的 Jupyterlab 笔记本中,将嵌入加载到 Vector Search 中:

    # init the aiplatform package
    from google.cloud import aiplatform
    aiplatform.init(project=PROJECT_ID, location=LOCATION)
    
  2. 使用 create_tree_ah_index 函数创建 MatchingEngineIndex(Matching Engine 是 Vector Search 的旧名称):

    # create Index
    my_index = aiplatform.MatchingEngineIndex.create_tree_ah_index(
      display_name = f"vs-quickstart-index-{UID}",
      contents_delta_uri = BUCKET_URI,
      dimensions = 768,
      approximate_neighbors_count = 10,
    )
    

    MatchingEngineIndex.create_tree_ah_index() 方法会构建索引。在本教程中,此任务大约需要 5 到 10 分钟。

  3. 在 Google Cloud 控制台中,转到 Vector Search 页面中的索引标签页。

    转到“索引”

  4. 验证是否存在名称以 "vs-quickstart-index-" 开头且包含正确时间戳的索引。

  5. 记下索引 ID。在稍后的步骤中部署索引时,您将需要此 ID。

创建索引端点

  1. 在 Cloud Shell 中,运行以下命令,将 PROJECT_ID 替换为您的项目 ID:

    projectid=PROJECT_ID
    gcloud config set project ${projectid}
    SERVICE_PROJECT=${projectid}
    REGION=us-central1
    VERTEX_ENDPOINT=$REGION-aiplatform.googleapis.com
    DISPLAY_NAME=vector-search
    
  2. 创建索引端点:

    curl -H "Content-Type: application/json" \
      -H "Authorization: Bearer `gcloud auth print-access-token`" \
      https://$VERTEX_ENDPOINT/v1/projects/$SERVICE_PROJECT/locations/$REGION/indexEndpoints \
      -d '{displayName: "'$DISPLAY_NAME'", privateServiceConnectConfig: { enablePrivateServiceConnect: true, projectAllowlist: ["'$SERVICE_PROJECT'"] }}'
    
  3. 验证是否已创建索引端点:

    gcloud ai index-endpoints list --region=us-central1
    

    您应该会看到类似以下示例的输出,其中索引端点 ID 为 8151506529447575552

    Using endpoint [https://us-central1-aiplatform.googleapis.com/]
    ---
    createTime: '2023-10-10T23:55:20.526145Z'
    displayName: vector-search
    encryptionSpec: {}
    etag: AMEw9yN2qytNiwT73uwYpz_7N_b2-O8D1AuNoDb5QjFmkU4ye5Gzk2oQlMZBR1XeoQ11
    name: projects/725264228516/locations/us-central1/indexEndpoints/8151506529447575552
    privateServiceConnectConfig:
      enablePrivateServiceConnect: true
      projectAllowlist:
      - vertex-genai-400103
      - vertex-genai-400103
    updateTime: '2023-10-10T23:55:21.951394Z'
    
  4. 记下索引端点 ID。在稍后的步骤中部署索引时,您将需要此 ID。

将索引部署到端点

在 Cloud Shell 中,运行以下命令以将索引部署到端点:

gcloud ai index-endpoints deploy-index INDEX_ENDPOINT_ID \
  --deployed-index-id=vector_one \
  --display-name=vector-search \
  --index=INDEX \
  --project=$projectid \
  --region=us-central1

替换以下值:

  • INDEX_ENDPOINT_ID:您创建的 Private Service Connect 索引端点的索引端点 ID
  • INDEX:所部署的索引的 ID

您应该会看到类似以下示例的输出,其中索引端点 ID 为 8151506529447575552

Using endpoint [https://us-central1-aiplatform.googleapis.com/]
The deploy index operation [projects/725264228516/locations/us-central1/indexEndpoints/8151506529447575552/operations/6271807495283408896] was submitted successfully.

部署索引时,系统会生成一个 Private Service Connect 端点。部署操作大约需要 10 到 15 分钟。

验证索引是否已部署到索引端点

  1. 在 Google Cloud 控制台中,转到 Vector Search 页面中的索引端点标签页。

    转到“索引端点”

  2. 验证 vector-search 索引端点是否具有已部署的索引(也称为 vector-search)。

    如果索引端点名称旁显示旋转的蓝色圆圈,则表示索引仍在部署过程中。

获取索引端点的服务连接 URI

完全部署索引后,您可以获取服务连接 URI。

在 Cloud Shell 中,运行以下命令以获取 Private Service Connect 端点的服务连接 URI:

gcloud ai index-endpoints list --region=us-central1 | grep -i  serviceAttachment:

在以下示例输出中,服务连接 URI 为 projects/je84d1de50cd8bddb-tp/regions/us-central1/serviceAttachments/sa-gkedpm-527af280e65971fd786aaf6163e798

Using endpoint [https://us-central1-aiplatform.googleapis.com/]
 serviceAttachment: projects/je84d1de50cd8bddb-tp/regions/us-central1/serviceAttachments/sa-gkedpm-527af280e65971fd786aaf6163e798

记下以 projects 开头的 serviceAttachment URI,例如 projects/je84d1de50cd8bddb-tp/regions/us-central1/serviceAttachments/sa-gkedpm-527af280e65971fd786aaf6163e798。在下一步中创建使用方端点时,您需要使用它。

创建 Private Service Connect 使用方端点

  1. 在 Cloud Shell 中,预留将用于查询 Vector Search 索引的使用方端点 IP 地址:

    gcloud compute addresses create vector-search-endpoint1 \
      --region=us-central1 \
      --subnet=consumer-endpoint-subnet
    
  2. 查找预留的 IP 地址:

    gcloud compute addresses list --filter="name=vector-search-endpoint1"
    
  3. 创建转发规则以将端点连接到服务连接(将 SERVICE_ATTACHMENT_URI 替换为您的 serviceAttachment URI)。

    gcloud compute forwarding-rules create vector-search-endpoint1 \
      --region=us-central1 \
      --network=vertex-networking-vpc \
      --address=vector-search-endpoint1 \
      --target-service-attachment=SERVICE_ATTACHMENT_URI
    

    以下是此命令的用法示例:

    gcloud compute forwarding-rules create vector-search-endpoint1 \
      --region=us-central1 \
      --network=vertex-networking-vpc \
      --address=vector-search-endpoint1 \
      --target-service-attachment=projects/je84d1de50cd8bddb-tp/regions/us-central1/serviceAttachments/sa-gkedpm-527af280e65971fd786aaf6163e798
    
  4. 在 Google Cloud 控制台中,转到 Private Service Connect 页面中的已连接的端点标签页。

    转到“已连接的端点”

  5. 验证使用方端点状态是否为 Accepted

  6. 记下 Private Service Connect 使用方端点的 IP 地址。在稍后的步骤中,您将使用此端点与已部署的 Vector Search 索引建立通信。

查询已部署的索引

现在您已建立连接到 Vector Search 索引端点的 Private Service Connect 使用方端点,接下来可以通过将查询从 on-prem-client 虚拟机实例发送到使用方端点来查询已部署的索引。

如需允许 Identity-Aware Proxy (IAP) 连接到您的虚拟机实例,请创建一条防火墙规则,该规则应:

  • 适用于您要通过 IAP 访问的所有虚拟机实例。
  • 允许来自 IP 地址范围 35.235.240.0/20 的、通过端口 22 的 TCP 流量此范围包含 IAP 用于 TCP 转发的所有 IP 地址。

创建防火墙后,您需要安装 gRPC 客户端。在稍后的步骤中,您将使用 gRPC 客户端从 on-prem-client 虚拟机实例发送查询。

创建防火墙规则并安装 gRPC

  1. 在 Cloud Shell 中,运行以下命令,将 PROJECT_ID 替换为您的项目 ID:

    projectid=PROJECT_ID
    gcloud config set project ${projectid}
    
  2. 创建一个名为 ssh-iap-vpc 的 IAP 防火墙规则:

    gcloud compute firewall-rules create ssh-iap-vpc \
      --network onprem-vpc \
      --allow tcp:22 \
      --source-ranges=35.235.240.0/20
    
  3. 登录到 on-prem-client 虚拟机实例:

    gcloud compute ssh on-prem-client \
      --project=$projectid \
      --zone=us-central1-a \
      --tunnel-through-iap
    
  4. on-prem-client 虚拟机实例中,安装 gRPC 客户端:

    sudo apt-get install git -y
    git clone https://github.com/grpc/grpc.git
    sudo apt-get install build-essential autoconf libtool pkg-config -y
    sudo apt-get install cmake -y
    cd grpc/
    git submodule update --init
    mkdir -p cmake/build
    cd cmake/build
    cmake -DgRPC_BUILD_TESTS=ON ../..
    make grpc_cli
    

    安装过程大约需要 30 分钟。

获取现有索引项的 ID

  1. 在 Google Cloud 控制台中,转到 Vertex AI Workbench 页面中的实例标签页。

    转到 Vertex AI Workbench

  2. 在 Vertex AI Workbench 实例名称旁边,点击打开 JupyterLab

    您的 Vertex AI Workbench 实例会打开 JupyterLab。

  3. 选择文件 > 新建 > 终端

  4. 在 JupyterLab 终端(而不是 Cloud Shell)中,查看索引中的最后一个条目:

    tail -1 product-embs.json
    
  5. 在该项中查找包含该项的 ID 编号的第一个键值对,如以下示例所示:

    "id":"27452"
    

    记下此 ID 编号。您将在下一部分中使用它。

执行 Vector Search 查询

on-prem-client 虚拟机实例中,查询已部署的索引:

./grpc_cli call  CONSUMER_ENDPOINT_IP:10000  google.cloud.aiplatform.container.v1.MatchService.Match "deployed_index_id:'"vector_one"',embedding_id: '"ITEM_ID"'"

替换以下值:

  • CONSUMER_ENDPOINT_IP:您在上一部分中创建的 Private Service Connect 使用方端点的 IP 地址
  • ITEM_ID:您在上一部分中保存的项 ID 编号

输出内容应如下例所示:

   user@on-prem-client:~/grpc/cmake/build$ ./grpc_cli call  172.16.30.2:10000  google.cloud.aiplatform.container.v1.MatchService.Match "deployed_index_id:'"vector_one"',embedding_id: '"20020916"'"
   connecting to 172.16.30.2:10000
   neighbor {
     id: "16136217"
     distance: 0.99999558925628662
   }
   neighbor {
     id: "2196405"
     distance: 0.82817935943603516
   }
   neighbor {
     id: "3796353"
     distance: 0.82687419652938843
   }
   neighbor {
     id: "815154"
     distance: 0.8179466724395752
   }
   neighbor {
     id: "16262338"
     distance: 0.816785454750061
   }
   neighbor {
     id: "31290454"
     distance: 0.81560027599334717
   }
   neighbor {
     id: "4012943"
     distance: 0.80958610773086548
   }
   neighbor {
     id: "39738359"
     distance: 0.8020891547203064
   }
   neighbor {
     id: "7691697"
     distance: 0.80035769939422607
   }
   neighbor {
     id: "6398888"
     distance: 0.79880392551422119
   }
   Rpc succeeded with OK status

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

您可以按如下方式在 Google Cloud 控制台中删除各个资源:

  1. 按如下方式取消部署并删除 Vector Search 索引:

    1. 在 Google Cloud 控制台中,转到 Vector Search 页面中的索引标签页。

      转到“索引”

    2. 找到名称以 "vs-quickstart-index-" 开头且包含正确时间戳的索引。

    3. 点击索引名称。

    4. 索引信息页面上,已部署的索引列表中的索引名称旁,点击 操作,然后点击取消部署

      对索引取消部署需要几分钟时间。如果索引名称旁边显示旋转的蓝色圆圈,或者索引状态列为 Undeploying,则表示索引仍在取消部署过程中。您可能需要刷新 Google Cloud 控制台浏览器标签页才能看到已不再部署索引。

    5. 点击 返回箭头以返回索引标签页。

    6. 在索引列表中的索引名称旁,点击 操作,然后点击删除以删除索引。

  2. 按如下方式删除索引端点:

    1. 在 Google Cloud 控制台中,转到 Vector Search 页面中的索引端点标签页。

      转到“索引端点”

    2. 在索引端点列表中的端点名称旁,点击 操作,然后点击删除以删除索引端点。

  3. 按如下方式删除 Vertex AI Workbench 实例:

    1. 在 Google Cloud 控制台的 Vertex AI 部分中,转到 Workbench 页面中的实例标签页。

      转到 Vertex AI Workbench

    2. 选择 workbench-tutorial Vertex AI Workbench 实例,然后点击 删除

  4. 按如下方式删除 Compute Engine 虚拟机实例:

    1. 在 Google Cloud 控制台中,转到 Compute Engine 页面。

      转到 Compute Engine

    2. 选择 on-prem-client 虚拟机实例,然后点击 删除

  5. 按如下方式删除 VPN 隧道:

    1. 在 Google Cloud 控制台中,转到 VPN 页面。

      转到 VPN

    2. VPN 页面上,点击 Cloud VPN 隧道标签页。

    3. 在 VPN 隧道列表中,选择您在本教程中创建的四个 VPN 隧道,然后点击 删除

  6. 按如下方式删除高可用性 VPN 网关:

    1. VPN 页面上,点击 Cloud VPN 网关标签页。

      转到“Cloud VPN 网关”

    2. 在 VPN 网关列表中,点击 onprem-vpn-gw1

    3. Cloud VPN 网关详情页面中,点击 删除 VPN 网关

    4. 如有必要,请点击 返回箭头以返回 VPN 网关列表,然后点击 vertex-networking-vpn-gw1

    5. Cloud VPN 网关详情页面中,点击 删除 VPN 网关

  7. 按如下方式删除 Cloud Router 路由器:

    1. 转到 Cloud Router 路由器页面。

      前往“Cloud Router 路由器”

    2. 在 Cloud Router 路由器列表中,选择您在本教程中创建的四个路由器。

    3. 如需删除路由器,请点击 删除

      这还将删除连接到 Cloud Router 路由器的两个 Cloud NAT 网关。

  8. 按如下方式删除 vertex-networking-vpc VPC 网络的 vector-search-endpoint1 转发规则:

    1. 转到负载均衡页面的前端标签页。

      转到“前端”

    2. 在转发规则列表中,点击 vector-search-endpoint1

    3. 转发规则详情页面中,点击 删除

  9. 按如下方式删除 VPC 网络:

    1. 转到 VPC 网络页面。

      进入 VPC 网络页面

    2. 在 VPC 网络列表中,点击 onprem-vpc

    3. VPC 网络详情页面中,点击 删除 VPC 网络

      删除每个网络会同时删除其子网、路由和防火墙规则。

    4. 返回 VPC 网络列表,然后点击 vertex-networking-vpc

    5. VPC 网络详情页面中,点击 删除 VPC 网络

  10. 按如下方式删除存储桶:

    1. 在 Google Cloud 控制台中,转到 Cloud Storage 页面。

      转到 Cloud Storage

    2. 选择您的存储桶,然后点击 删除

  11. 按如下方式删除 workbench-sa 服务账号:

    1. 转到服务账号页面。

      转到“服务账号”

    2. 选择 workbench-sa 服务账号,然后点击 删除

后续步骤