1. 简介
本地主机可以通过公共互联网(方式 1)或者从本地网络中使用 Cloud VPN 或 Cloud Interconnect 与 Private Service Connect (PSC)(方式 2)原生访问在线预测,两者均提供 SSL/TLS 加密。如图 1 所示,建议对关键应用使用通过互连进行的在线预测的混合连接性能优于互联网。
在本教程中,我们将演示如何使用高可用性 VPN (HA VPN) 在可作为多云和本地专用连接基础的两个 VPC 网络之间以非公开方式访问在线预测。
请注意,Vertex Online Prediction 是一个公共端点,因此您希望利用 VPC Service Controls (VPC-SC) 创建安全边界来限制访问,从而允许或拒绝对 Vertex 和其他 Googleapis 的访问。本教程不介绍 VPC-SC,如需了解详情,请参阅将 VPC Service Controls 与 Vertex AI 搭配使用
构建内容
您将设置一个名为 on-prem-vpc
的 VPC 网络来表示本地环境。对于您的部署,on-prem-vpc
将不存在,而是使用与本地数据中心或云服务商的混合网络。
您将构建一个全面的 Private Service Connect 架构,以说明如何通过 Cloud NAT 公开访问在线预测,以及根据以下详细信息,使用基于高可用性 VPN 的 PSC 以非公开方式访问在线预测。
在 Google Cloud 项目中部署在线预测后,我们将探索以下用例:
对在线预测的公开访问权限包括以下各项:
- 创建利用 NAT 访问出站互联网的 GCE 实例 (nat-client)
- 使用 C网址 根据模型进行推理
- 使用 TCPDUMP 验证是否通过公共 VIP 访问在线预测
对在线预测的专用访问由以下部分组成:
- 将模型部署到项目中的 Vertex 在线预测端点
- 在 aml-vpc 中创建 Private Service Connect (Googleapis) 端点
- 通过 Cloud Router 将 PSC IP 地址作为自定义通告导出到本地 VPC
- 创建 GCE 实例(专用客户端)并使用 PSC 端点 IP 更新 etc/hosts 文件
- 使用 C网址 根据模型进行推理
- 使用 TCPDUMP 验证是否通过 PSC 端点 IP 地址访问在线预测
学习内容
- 如何建立 Private Service Connect 端点
- 如何通过 Cloud Router 路由器通告 PSC 端点 IP
- 如何使用 TCPDUMP 验证在线预测访问权限(包括公开访问权限和专用访问权限)
所需条件
- Google Cloud 项目
IAM 权限
2. 准备工作
更新项目以支持本教程
本教程利用 $variables 辅助在 Cloud Shell 中实现 gcloud 配置。
在 Cloud Shell 中,执行以下操作:
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
3. 启用服务
在 Cloud Shell 中,执行以下操作:
gcloud services enable dns.googleapis.com
gcloud services enable aiplatform.googleapis.com
gcloud services enable iam.googleapis.com
gcloud services enable compute.googleapis.com
gcloud services enable notebooks.googleapis.com
4. aml-vpc 设置
创建 aml-vpc
在 Cloud Shell 中,执行以下操作:
gcloud compute networks create aiml-vpc --project=$projectid --subnet-mode=custom
创建用户管理的笔记本子网
在 Cloud Shell 中,执行以下操作:
gcloud compute networks subnets create workbench-subnet --project=$projectid --range=172.16.10.0/28 --network=aiml-vpc --region=us-central1 --enable-private-ip-google-access
Cloud Router 和 NAT 配置
本教程中使用 Cloud NAT 下载笔记本软件包,因为用户管理的笔记本实例没有外部 IP 地址。Cloud NAT 还提供出站流量 NAT 功能,这意味着不允许互联网主机与用户管理的笔记本进行通信,从而提高了安全性。
在 Cloud Shell 中,创建区域级 Cloud Router 路由器。
gcloud compute routers create cloud-router-us-central1-aiml-nat --network aiml-vpc --region us-central1
在 Cloud Shell 中,创建区域级 Cloud NAT 网关。
gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-us-central1-aiml-nat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1
5. on-prem-vpc 设置
创建 on-prem-vpc
在 Cloud Shell 中,执行以下操作:
gcloud compute networks create on-prem-vpc --project=$projectid --subnet-mode=custom
创建 nat-subnet
在 Cloud Shell 中,执行以下操作:
gcloud compute networks subnets create nat-subnet --project=$projectid --range=192.168.10.0/28 --network=on-prem-vpc --region=us-central1
创建 private-ip-subnet
在 Cloud Shell 中,执行以下操作:
gcloud compute networks subnets create private-ip-subnet --project=$projectid --range=192.168.20.0/28 --network=on-prem-vpc --region=us-central1
Cloud Router 和 NAT 配置
本教程使用 Cloud NAT 下载软件包。Cloud NAT 还提供出站 NAT 功能,这意味着互联网主机不能启动与计算的通信,因而提高了安全性。
在 Cloud Shell 中,创建区域级 Cloud Router 路由器。
gcloud compute routers create cloud-router-us-central1-on-prem-nat --network on-prem-vpc --region us-central1
在 Cloud Shell 中,创建区域级 Cloud NAT 网关。
gcloud compute routers nats create cloud-nat-us-central1 --router=cloud-router-us-central1-on-prem-nat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --region us-central1
6. 创建 Private Service Connect 端点
在下一部分,您将创建一个 Private Service Connect (PSC) 端点,用于从 on-prem-vpc 访问 Vertex API。在接下来的步骤中,PSC IP 地址 100.100.10.10 将作为自定义路由器通告从 Amazon-vpc-cloud-router-vpn 通告到本地网络。
通过 Cloud Shell
gcloud compute addresses create psc-ip \
--global \
--purpose=PRIVATE_SERVICE_CONNECT \
--addresses=100.100.10.10 \
--network=aiml-vpc
创建 PSC 端点
通过 Cloud Shell
gcloud compute forwarding-rules create pscvertex \
--global \
--network=aiml-vpc \
--address=psc-ip \
--target-google-apis-bundle=all-apis
列出已配置的 Private Service Connect 端点
通过 Cloud Shell
gcloud compute forwarding-rules list \
--filter target="(all-apis OR vpc-sc)" --global
描述已配置的 Private Service Connect 端点
通过 Cloud Shell
gcloud compute forwarding-rules describe \
pscvertex --global
7. 混合连接
在下一部分中,您将创建一个 Cloud Router 路由器,以便使用边界网关协议 (BGP) 在虚拟私有云 (VPC) 和对等网络之间动态交换路由。
Cloud Router 可以通过 Cloud VPN 隧道设置 BGP 会话,以连接到您的网络。它会自动获知新的子网 IP 地址范围,并将其通告给您的对等网络。
在本教程中,您将在 aiml-vpc 和 on-prem-vpc 之间部署高可用性 VPN。
为 aiml-vpc 创建高可用性 VPN 网关
每个网关创建后,系统会自动分配两个外部 IPv4 地址,每个网关接口各一个。
在 Cloud Shell 中,创建高可用性 VPN 网关
gcloud compute vpn-gateways create aiml-vpn-gw \
--network=aiml-vpc\
--region=us-central1
为 on-prem-vpc 创建高可用性 VPN 网关
每个网关创建后,系统会自动分配两个外部 IPv4 地址,每个网关接口各一个。记下这些 IP 地址,以便稍后在配置步骤中使用。
在 Cloud Shell 中,创建高可用性 VPN 网关。
gcloud compute vpn-gateways create on-prem-vpn-gw \
--network=on-prem-vpc\
--region=us-central1
验证高可用性 VPN 网关的创建
在控制台中,前往 HYBRID CONNECTIVITY → VPN → CLOUD VPN GATEWAYS,然后验证是否已生成网关 IP。
为 aml-vpc 创建 Cloud Router 路由器
在 Cloud Shell 中,创建位于 us-central1 的 Cloud Router 路由器
gcloud compute routers create aiml-cr-us-central1 \
--region=us-central1 \
--network=aiml-vpc\
--asn=65001
为 on-prem-vpc 创建 Cloud Router 路由器
在 Cloud Shell 中,创建位于 us-central1 的 Cloud Router 路由器
gcloud compute routers create on-prem-cr-us-central1 \
--region=us-central1 \
--network=on-prem-vpc \
--asn=65002
为 Arml-vpc 创建 VPN 隧道
您将在每个高可用性 VPN 网关上创建两个 VPN 隧道。
创建 VPN 隧道 0
在 Cloud Shell 中,创建 tunnel0:
gcloud compute vpn-tunnels create aiml-vpc-tunnel0 \
--peer-gcp-gateway on-prem-vpn-gw \
--region us-central1 \
--ike-version 2 \
--shared-secret [ZzTLxKL8fmRykwNDfCvEFIjmlYLhMucH] \
--router aiml-cr-us-central1 \
--vpn-gateway aiml-vpn-gw \
--interface 0
创建 VPN 隧道 1
在 Cloud Shell 中,创建 tunnel1:
gcloud compute vpn-tunnels create aiml-vpc-tunnel1 \
--peer-gcp-gateway on-prem-vpn-gw \
--region us-central1 \
--ike-version 2 \
--shared-secret [bcyPaboPl8fSkXRmvONGJzWTrc6tRqY5] \
--router aiml-cr-us-central1 \
--vpn-gateway aiml-vpn-gw \
--interface 1
为 on-prem-vpc 创建 VPN 隧道
您将在每个高可用性 VPN 网关上创建两个 VPN 隧道。
创建 VPN 隧道 0
在 Cloud Shell 中,创建 tunnel0:
gcloud compute vpn-tunnels create on-prem-tunnel0 \
--peer-gcp-gateway aiml-vpn-gw \
--region us-central1 \
--ike-version 2 \
--shared-secret [ZzTLxKL8fmRykwNDfCvEFIjmlYLhMucH] \
--router on-prem-cr-us-central1 \
--vpn-gateway on-prem-vpn-gw \
--interface 0
创建 VPN 隧道 1
在 Cloud Shell 中,创建 tunnel1:
gcloud compute vpn-tunnels create on-prem-tunnel1 \
--peer-gcp-gateway aiml-vpn-gw \
--region us-central1 \
--ike-version 2 \
--shared-secret [bcyPaboPl8fSkXRmvONGJzWTrc6tRqY5] \
--router on-prem-cr-us-central1 \
--vpn-gateway on-prem-vpn-gw \
--interface 1
验证 VPN 隧道创建
在控制台中,依次前往混合连接 → VPN → CLOUD VPN 隧道。
8. 建立 BGP 邻居
创建 BGP 会话
在本部分中,您将配置 Cloud Router 路由器接口和 BGP 对等端。
为 Arml-vpc 创建 BGP 接口和对等互连
在 Cloud Shell 中,创建 BGP 接口:
gcloud compute routers add-interface aiml-cr-us-central1 \
--interface-name if-tunnel0-to-onprem \
--ip-address 169.254.1.1 \
--mask-length 30 \
--vpn-tunnel aiml-vpc-tunnel0 \
--region us-central1
在 Cloud Shell 中,创建 BGP 对等端:
gcloud compute routers add-bgp-peer aiml-cr-us-central1 \
--peer-name bgp-on-premises-tunnel0 \
--interface if-tunnel1-to-onprem \
--peer-ip-address 169.254.1.2 \
--peer-asn 65002 \
--region us-central1
在 Cloud Shell 中,创建 BGP 接口:
gcloud compute routers add-interface aiml-cr-us-central1 \
--interface-name if-tunnel1-to-onprem \
--ip-address 169.254.2.1 \
--mask-length 30 \
--vpn-tunnel aiml-vpc-tunnel1 \
--region us-central1
在 Cloud Shell 中,创建 BGP 对等端:
gcloud compute routers add-bgp-peer aiml-cr-us-central1 \
--peer-name bgp-on-premises-tunnel1 \
--interface if-tunnel2-to-onprem \
--peer-ip-address 169.254.2.2 \
--peer-asn 65002 \
--region us-central1
为 on-prem-vpc 创建 BGP 接口和对等互连
在 Cloud Shell 中,创建 BGP 接口:
gcloud compute routers add-interface on-prem-cr-us-central1 \
--interface-name if-tunnel0-to-aiml-vpc\
--ip-address 169.254.1.2 \
--mask-length 30 \
--vpn-tunnel on-prem-tunnel0 \
--region us-central1
在 Cloud Shell 中,创建 BGP 对等端:
gcloud compute routers add-bgp-peer on-prem-cr-us-central1 \
--peer-name bgp-aiml-vpc-tunnel0 \
--interface if-tunnel1-to-aiml-vpc\
--peer-ip-address 169.254.1.1 \
--peer-asn 65001 \
--region us-central1
在 Cloud Shell 中,创建 BGP 接口:
gcloud compute routers add-interface on-prem-cr-us-central1 \
--interface-name if-tunnel1-to-aiml-vpc\
--ip-address 169.254.2.2 \
--mask-length 30 \
--vpn-tunnel on-prem-tunnel1 \
--region us-central1
在 Cloud Shell 中,创建 BGP 对等端:
gcloud compute routers add-bgp-peer on-prem-cr-us-central1 \
--peer-name bgp-aiml-vpc-tunnel1\
--interface if-tunnel2-to-aiml-vpc\
--peer-ip-address 169.254.2.1 \
--peer-asn 65001 \
--region us-central1
导航到混合连接 → VPN 以查看 VPN 隧道详细信息。
验证通过高可用性 VPN 的 Amazon-vpc 已知路由
在控制台中,依次前往 VPC 网络 → VPC 网络 → bestl-vpc→ ROUTES → REGION → US-CENTRAL1 → 查看
查看 aml-vpc 已获知来自 on-prem-vpc nat-subnet 和 private-ip-subnet 的路由
验证 on-prem-vpc 已通过高可用性 VPN 获知 Workbench-子网
使用控制台,依次前往 VPC 网络 → VPC 网络 → on-prem-vpc → ROUTES → REGION → US-CENTRAL1 → 查看
9. 创建自定义路由通告 Arml-vpc
aml-cr-us-central1 Cloud Router 路由器不会自动通告 Private Service Connect 端点 IP,因为 VPC 中未配置该子网。
相反,您将需要为端点 IP 地址 100.100.10.10 从 Arml-cr-us-central Cloud Router 路由器创建自定义路由通告,该通告将通过 BGP 向本地环境通告到 on-prem-vpc。
在控制台中,依次前往混合连接 → 云路由 →aaml-cr-us-central1,然后选择修改。
在“通告的路由”部分,选择创建自定义路由选项,根据以下示例更新字段,选择完成,然后点击保存。
验证
验证 on-prem-vpc 已通过 HA-VPN 获知 PSC 端点 IP 地址
使用控制台,依次前往 VPC 网络 → VPC 网络 → on-prem-vpc → ROUTES → REGION → US-CENTRAL1 → 查看
10. 在 on-prem-vpc 上创建自定义路由通告
默认情况下,on-prem-vpc Cloud Router 会通告所有子网,但只需要 private-ip-subnet。
在下一部分中,更新来自 on-prem-cr-us-central1 Cloud Router 路由器的路由通告。
在控制台中,依次前往混合连接 → 云路由器 → on-prem-cr-us-central1,然后选择修改。
在“通告的路由”部分,选择创建自定义路由选项,根据以下示例更新字段,选择完成,然后点击保存。
验证
验证 amil-vpc 是否已从 on-prem-vpc 获知 private-ip-subnet 路由。
在控制台中,依次前往 VPC 网络 → VPC 网络 → bestl-vpc → ROUTES → REGION → US-CENTRAL1 → 查看
11. 创建用户管理的服务账号(GCE 实例)
为了对 Vertex API 提供精细的控制,需要使用用户管理的服务账号,该账号将应用于 NAT 和专用客户端实例。生成服务账号权限后,您可以根据业务要求修改这些权限。在本教程中,用户管理的服务账号 vertex-sa 将应用以下角色:
您必须先 Service Account API,然后才能继续操作。
在 Cloud Shell 中,创建服务账号。
gcloud iam service-accounts create gce-vertex-sa \
--description="service account for vertex" \
--display-name="gce-vertex-sa"
在 Cloud Shell 中,使用计算实例管理员角色更新服务账号
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:gce-vertex-sa@$projectid.iam.gserviceaccount.com" --role="roles/compute.instanceAdmin.v1"
在 Cloud Shell 中,使用 Vertex AI User 角色更新服务账号
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:gce-vertex-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"
12. 创建用户管理的服务账号 (Notebook)
在下一部分中,您将创建一个用户管理的服务账号,该账号将与本教程中使用的 Vertex Workbench (Notebook) 相关联。
在本教程中,服务账号将应用以下角色:
在 Cloud Shell 中,创建服务账号。
gcloud iam service-accounts create user-managed-notebook-sa \
--display-name="user-managed-notebook-sa"
在 Cloud Shell 中,使用 Storage Admin 角色更新服务账号。
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/storage.admin"
在 Cloud Shell 中,使用 Vertex AI User 角色更新服务账号。
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/aiplatform.user"
在 Cloud Shell 中,使用 Artifact Registry Admin 角色更新服务账号。
gcloud projects add-iam-policy-binding $projectid --member="serviceAccount:user-managed-notebook-sa@$projectid.iam.gserviceaccount.com" --role="roles/artifactregistry.admin"
在 Cloud Shell 中,列出服务账号并记下在创建用户管理的笔记本时要使用的电子邮件地址。
gcloud iam service-accounts list
13. 已创建测试实例
在下一部分,您将创建测试实例来验证访问 Vertex API 的不同方法,具体如下:
- 实例
nat-client,
将使用 Cloud NAT 解析 Vertex AI,从而通过互联网访问在线预测端点 - 实例
private-client
将使用 Private Service Connect IP 100.100.10.10,通过 HA-VPN 访问在线预测端点。
在 Cloud Shell 中,创建 nat-client
实例。
gcloud compute instances create nat-client \
--zone=us-central1-a \
--image-family=debian-11 \
--image-project=debian-cloud \
--subnet=nat-subnet \
--service-account=vertex-sa@$projectid.iam.gserviceaccount.com \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--no-address \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install tcpdump dnsutils -y"
在 Cloud Shell 中,创建 private-client
实例。
gcloud compute instances create private-client \
--zone=us-central1-a \
--image-family=debian-11 \
--image-project=debian-cloud \
--subnet=private-ip-subnet \
--service-account=vertex-sa@$projectid.iam.gserviceaccount.com \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--no-address \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install tcpdump dnsutils -y"
如需允许 Identity-Aware Proxy (IAP) 连接到您的虚拟机实例,请创建一条符合以下要求的防火墙规则:
- 适用于您希望可以使用 IAP 访问的所有虚拟机实例。
- 允许来自 IP 范围 35.235.240.0/20 的入站流量。此范围包含 IAP 用于 TCP 转发的所有 IP 地址。
在 Cloud Shell 中,创建 IAP 防火墙规则。
gcloud compute firewall-rules create ssh-iap-on-prem-vpc \
--network on-prem-vpc \
--allow tcp:22 \
--source-ranges=35.235.240.0/20
14. 创建用户管理的笔记本
在下一部分中,创建一个用户管理的笔记本,其中包含之前创建的服务账号 user-managed-notebook-sa。
在 Cloud Shell 中,创建 private-client 实例。
gcloud notebooks 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 \
--no-public-ip --service-account=user-managed-notebook-sa@$projectid.iam.gserviceaccount.com
15. 部署模型和在线预测
在下一部分,使用提供的 Codelab:Vertex AI:将自定义预测例程与 Sklearn 搭配使用,预处理和后处理数据以便进行预测,因为您已经在上一步中创建了一个笔记本,所以从第 7 部分开始。部署模型后,返回教程以开始下一部分。
16. 验证通过互联网访问 Vertex API 的权限
在下一部分,您将登录实例 nat-client,并通过对用于解析 Vertex API 的网域 us-central1-aiplatform.googleapis.com 使用 dig 和 tcpdump 验证与 Vertex AI 的连接。
在 Cloud Shell 中使用 IAP 登录 nat-client,通过对顶点网域 us-central1-aiplatform.googleapis.com 执行挖掘来验证与 Vertex API 的连接
gcloud compute ssh nat-client --project=$projectid --zone=us-central1-a --tunnel-through-iap
执行挖掘。
dig us-central1-aiplatform.googleapis.com
例如,记下 DNS 响应中的公共 IP。
user@nat-client:~$ dig us-central1-aiplatform.googleapis.com
; <<>> DiG 9.16.42-Debian <<>> us-central1-aiplatform.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56761
;; flags: qr rd ra; QUERY: 1, ANSWER: 16, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;us-central1-aiplatform.googleapis.com. IN A
;; ANSWER SECTION:
us-central1-aiplatform.googleapis.com. 300 IN A 108.177.111.95
us-central1-aiplatform.googleapis.com. 300 IN A 142.250.1.95
us-central1-aiplatform.googleapis.com. 300 IN A 108.177.121.95
us-central1-aiplatform.googleapis.com. 300 IN A 142.250.103.95
us-central1-aiplatform.googleapis.com. 300 IN A 108.177.120.95
us-central1-aiplatform.googleapis.com. 300 IN A 142.251.171.95
us-central1-aiplatform.googleapis.com. 300 IN A 142.250.159.95
us-central1-aiplatform.googleapis.com. 300 IN A 142.251.120.95
us-central1-aiplatform.googleapis.com. 300 IN A 142.251.161.95
us-central1-aiplatform.googleapis.com. 300 IN A 142.251.172.95
us-central1-aiplatform.googleapis.com. 300 IN A 74.125.126.95
us-central1-aiplatform.googleapis.com. 300 IN A 74.125.70.95
us-central1-aiplatform.googleapis.com. 300 IN A 74.125.132.95
us-central1-aiplatform.googleapis.com. 300 IN A 74.125.201.95
us-central1-aiplatform.googleapis.com. 300 IN A 74.125.202.95
us-central1-aiplatform.googleapis.com. 300 IN A 74.125.69.95
;; Query time: 4 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Thu Jun 29 01:35:57 UTC 2023
;; MSG SIZE rcvd: 322
在 nat-client 操作系统中,在对在线预测执行 curl 时执行 tcpdump 以验证 DNS 解析。
sudo tcpdump -i any port 53 -n
示例:
user@nat-client:~$ sudo tcpdump -i any port 53 -n
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
选择“+”打开新的 Cloud Shell 终端。打开新标签页后,更新项目名称变量。
在 Cloud Shell 中,更新项目名称变量。
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
在 Cloud Shell 二中,通过 SSH 连接到 nat-client 实例。
gcloud compute ssh --zone "us-central1-a" "nat-client" --project "$projectid"
在下一部分,您将使用 sudo VI 编辑器或 nano 创建一个 instances.json 文件,并插入用于从已部署模型中获取预测结果的数据字符串。
在 nat-client 操作系统中,使用以下数据字符串创建 instances.json 文件:
{"instances": [
[0.23, 'Ideal', 'E', 'VS2', 61.5, 55.0, 3.95, 3.98, 2.43],
[0.29, 'Premium', 'J', 'Internally Flawless', 52.5, 49.0, 4.00, 2.13, 3.11]]}
示例:
user@nat-client:$ more instances.json
{"instances": [
[0.23, 'Ideal', 'E', 'VS2', 61.5, 55.0, 3.95, 3.98, 2.43],
[0.29, 'Premium', 'J', 'Internally Flawless', 52.5, 49.0, 4.00, 2.13, 3.11]]}
user@nat-client:$
从 Cloud 控制台获取将在后续步骤中使用的在线预测端点 ID。
前往 VERTEX AI → 在线预测
在 nat-client 操作系统中,创建以下变量:
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
ENDPOINT_ID="insert-your-endpoint-id-here"
示例:
ENDPOINT_ID="3328226095324463104"
在 nat-client 操作系统中,执行 curl 以获取模型的响应。
curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://us-central1-aiplatform.googleapis.com/v1/projects/${projectid}/locations/us-central1/endpoints/${ENDPOINT_ID}:predict -d @instances.json
例如,记下成功的预测。
user@nat-client$ curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://us-central1-aiplatform.googleapis.com/v1/projects/${projectid}/locations/us-central1/endpoints/${ENDPOINT_ID}:predict -d @instances.json
{
"predictions": [
"$479.0",
"$586.0"
],
"deployedModelId": "1949163636186415104",
"model": "projects/234086459238/locations/us-central1/models/947543727654567936",
"modelDisplayName": "diamonds-cpr",
"modelVersionId": "1"
}
17. 验证 - Vertex API 的互联网访问权限
现在您已执行了预测,我们来看看 TCPDUMP 结果(终端 1),这表明 nat-client 实例 (192.168.10.2) 正在针对 Vertex AI 网域 us-central1-aiplatform.googleapis.com 对本地 DNS 服务器 169.254.169.254 执行 DNS 查询。DNS 查询的结果是 Vertex API 的公共虚拟 IP 地址 (VIPS),如下所述:
user@nat-client:~$ sudo tcpdump -i any port 53 -n
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
20:05:09.260937 ens4 Out IP 192.168.10.2.40782 > 169.254.169.254.53: 47190+ A? oauth2.googleapis.com. (39)
20:05:09.260946 ens4 Out IP 192.168.10.2.40782 > 169.254.169.254.53: 28075+ AAAA? oauth2.googleapis.com. (39)
20:05:09.263556 ens4 In IP 169.254.169.254.53 > 192.168.10.2.40782: 28075 4/0/0 AAAA 2607:f8b0:4001:c34::5f, AAAA 2607:f8b0:4001:c54::5f, AAAA 2607:f8b0:4001:c16::5f, AAAA 2607:f8b0:4001:c17::5f (151)
20:05:09.265018 ens4 In IP 169.254.169.254.53 > 192.168.10.2.40782: 47190 16/0/0 A 74.125.201.95, A 74.125.202.95, A 74.125.69.95, A 64.233.183.95, A 173.194.193.95, A 173.194.194.95, A 173.194.195.95, A 173.194.196.95, A 173.194.197.95, A 64.233.191.95, A 173.194.74.95, A 173.194.192.95, A 209.85.145.95, A 209.85.146.95, A 209.85.147.95, A 142.250.125.95 (295)
20:05:09.474478 ens4 Out IP 192.168.10.2.57356 > 169.254.169.254.53: 36008+ A? us-central1-aiplatform.googleapis.com. (55)
20:05:09.474488 ens4 Out IP 192.168.10.2.57356 > 169.254.169.254.53: 47020+ AAAA? us-central1-aiplatform.googleapis.com. (55)
20:05:09.477190 ens4 In IP 169.254.169.254.53 > 192.168.10.2.57356: 36008 16/0/0 A 173.194.194.95, A 173.194.195.95, A 173.194.196.95, A 173.194.197.95, A 173.194.74.95, A 173.194.192.95, A 209.85.145.95, A 209.85.146.95, A 209.85.147.95, A 142.250.125.95, A 142.250.136.95, A 142.250.148.95, A 209.85.200.95, A 209.85.234.95, A 142.250.152.95, A 142.250.128.95 (311)
20:05:09.478607 ens4 In IP 169.254.169.254.53 > 192.168.10.2.57356: 47020 4/0/0 AAAA 2607:f8b0:4001:c1b::5f, AAAA 2607:f8b0:4001:c0c::5f, AAAA 2607:f8b0:4001:c0e::5f, AAAA 2607:f8b0:4001:c1e::5f (167)
18. 启用对 Vertex API 的专用访问通道
在下一部分,您将使用 Private Service Connect 通过混合网络 (HA VPN) 访问 Vertex API,以非公开方式访问在线预测。在本教程使用的示例中,您将更新 private-client 实例中的 /etc/hosts 文件。
在您的本地环境中,更新一台或几台机器的 /etc/hosts 文件以进行测试是适合的,但是对于大规模和生产环境而言,最好使用 PSC 端点 FQDN 创建新的转发区域。
例如,本教程中创建的 psc 端点称为 pscvertex,其转换为 pscvertex.p.googleapis.com,当使用顶点端点时会将 FQDN 与服务(例如 us-central1-aiplatform-pscvertex.p.googleapis.com)相关联。
使用 PSC 端点更新本地 DNS 还需要重构本地应用以调用 FDQN,例如 us-central1-aiplatform-pscvertex.p.googleapis.com,而不是原生公共端点 us-central1-aiplatform.googleapis.com。
可配置为使用自定义端点的客户端可以使用 p.googleapis.com DNS 名称向端点发送请求。
如需了解如何将其配置为使用自定义端点,请参阅您的客户端库或客户端库的文档。例如:
- Python:您可以在 google-api-core 软件包的 Client options 类中配置 api_endpoint。
- Go:您可以在 API 软件包的客户端选项软件包中配置 WithEndpoint。
- gcloud:您可以配置 api_endpoint_overrides
选择“+”打开新的 Cloud Shell 终端。打开新标签页后,更新项目名称变量。
通过 Cloud Shell。
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
在新的 Cloud Shell 中使用 IAP 登录专用客户端,通过对顶点网域 us-central1-aiplatform.googleapis.com 执行挖掘来验证与 Vertex API 的连接
从 Cloud Shell 登录私有客户端操作系统实例。
gcloud compute ssh private-client --project=$projectid --zone=us-central1-a --tunnel-through-iap
执行挖掘。
dig us-central1-aiplatform.googleapis.com
例如,记下基于 DNS 响应的公共 IP。
user@private-client:~$ dig us-central1-aiplatform.googleapis.com
; <<>> DiG 9.16.42-Debian <<>> us-central1-aiplatform.googleapis.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 33311
;; flags: qr rd ra; QUERY: 1, ANSWER: 16, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;us-central1-aiplatform.googleapis.com. IN A
;; ANSWER SECTION:
us-central1-aiplatform.googleapis.com. 300 IN A 74.125.132.95
us-central1-aiplatform.googleapis.com. 300 IN A 74.125.201.95
us-central1-aiplatform.googleapis.com. 300 IN A 74.125.202.95
us-central1-aiplatform.googleapis.com. 300 IN A 74.125.69.95
us-central1-aiplatform.googleapis.com. 300 IN A 64.233.182.95
us-central1-aiplatform.googleapis.com. 300 IN A 64.233.183.95
us-central1-aiplatform.googleapis.com. 300 IN A 173.194.193.95
us-central1-aiplatform.googleapis.com. 300 IN A 173.194.194.95
us-central1-aiplatform.googleapis.com. 300 IN A 173.194.195.95
us-central1-aiplatform.googleapis.com. 300 IN A 173.194.196.95
us-central1-aiplatform.googleapis.com. 300 IN A 173.194.197.95
us-central1-aiplatform.googleapis.com. 300 IN A 64.233.191.95
us-central1-aiplatform.googleapis.com. 300 IN A 173.194.74.95
us-central1-aiplatform.googleapis.com. 300 IN A 173.194.192.95
us-central1-aiplatform.googleapis.com. 300 IN A 209.85.145.95
us-central1-aiplatform.googleapis.com. 300 IN A 209.85.146.95
;; Query time: 4 msec
;; SERVER: 169.254.169.254#53(169.254.169.254)
;; WHEN: Sun Jul 02 20:5
使用 sudo VI Editor 或 nano 更新专用客户端实例 /etc/hosts,以创建指向 PSC 端点 100.100.10.10 的 Vertext AI FQDN us-central1-aiplatform.googleapis.com 的记录,无需进一步更改。
示例:
user@private-client:~$ more /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
100.100.10.10 us-central1-aiplatform.googleapis.com
192.168.20.2 private-client.c.$projectid.internal private-client # Added by Google
169.254.169.254 metadata.google.internal # Added by Google
在专用客户端操作系统中,对 Vertex API 端点执行 PING 操作。
ping us-central1-aiplatform.googleapis.com
例如,PING 会返回 PSC 端点 IP,但预计不会回复。
user@private-client:~$ ping us-central1-aiplatform.googleapis.com
PING us-central1-aiplatform.googleapis.com (100.100.10.10) 56(84) bytes of data.
在专用客户端操作系统中,执行 tcpdump 验证对在线预测执行 curl 时到 PSC 端点的 DNS 解析和 IP 数据路径。
sudo tcpdump -i any port 53 -n or host 100.100.10.10
选择“+”打开第四个 Cloud Shell 终端。打开新标签页后,更新项目名称变量。
在 Cloud Shell 中,更新项目名称变量。
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
projectid=YOUR-PROJECT-NAME
echo $projectid
在 Cloud Shell 中,通过 SSH 连接到私有客户端实例。
gcloud compute ssh --zone "us-central1-a" "private-client" --project "$projectid"
在下一部分,您将使用 sudo VI 编辑器或 nano 创建一个 instances.json 文件,并插入用于从已部署模型中获取预测结果的数据字符串。
在私有客户端操作系统中,使用以下数据字符串创建 instances.json 文件:
{"instances": [
[0.23, 'Ideal', 'E', 'VS2', 61.5, 55.0, 3.95, 3.98, 2.43],
[0.29, 'Premium', 'J', 'Internally Flawless', 52.5, 49.0, 4.00, 2.13, 3.11]]}
示例:
user@private-client:$ more instances.json
{"instances": [
[0.23, 'Ideal', 'E', 'VS2', 61.5, 55.0, 3.95, 3.98, 2.43],
[0.29, 'Premium', 'J', 'Internally Flawless', 52.5, 49.0, 4.00, 2.13, 3.11]]}
user@private-client:$
在 private-client 操作系统中,创建以下变量:
gcloud config list project
projectid=YOUR-PROJECT-NAME
echo $projectid
ENDPOINT_ID="insert-your-endpoint-id-here"
示例:
ENDPOINT_ID="3328226095324463104"
通过 Cloud Shell 4 中的私有客户端操作系统,执行 curl 以从模型获取响应。
curl -v -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://us-central1-aiplatform.googleapis.com/v1/projects/${projectid}/locations/us-central1/endpoints/${ENDPOINT_ID}:predict -d @instances.json
19. 验证 - 对 Vertex API 的专用访问
在 Cloud Shell 中的专用客户端操作系统中,请注意使用 PSC 端点 IP (100.100.10.10) 访问 Vertex API。
user@private-client$ curl -v -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Content-Type: application/json" https://us-central1-aiplatform.googleapis.com/v1/projects/${projectid}/locations/us-central1/endpoints/${ENDPOINT_ID}:predict -d @instances.json
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying 100.100.10.10:443...
* Connected to us-central1-aiplatform.googleapis.com (100.100.10.10) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
* CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
* subject: CN=upload.video.google.com
* start date: May 29 08:21:36 2023 GMT
* expire date: Aug 21 08:21:35 2023 GMT
* subjectAltName: host "us-central1-aiplatform.googleapis.com" matched cert's "*.googleapis.com"
* issuer: C=US; O=Google Trust Services LLC; CN=GTS CA 1C3
* SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x55f2ab65c2c0)
> POST /v1/projects/$projectid/locations/us-central1/endpoints/3328226095324463104:predict HTTP/2
> Host: us-central1-aiplatform.googleapis.com
> user-agent: curl/7.74.0
> accept: */*
> authorization: Bearer ya29.a0AbVbY6NdCbIJYj0mQROeq-xYgQCw534TTtjRc1kBAEOimKCFxb3gqgD5AvhfefJatSNr33eW1YJirfQVMptFoqfjRoB-i8zEJJ_GGCVqhsVnpSOjK0hzJQSuo2YGjIiSe1o1zdo7lWmh1Px-vLe8FImieGkrQ1hqVaa6aCgYKAXgSARESFQFWKvPlUQ_FuKB2hrDJRyFDjupL1g0171
> content-type: application/json
> content-length: 154
>
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
* We are completely uploaded and fine
< HTTP/2 200
< content-type: application/json; charset=UTF-8
< x-vertex-ai-internal-prediction-backend: harpoon
< date: Mon, 03 Jul 2023 22:13:35 GMT
< vary: X-Origin
< vary: Referer
< vary: Origin,Accept-Encoding
< server: scaffolding on HTTPServer2
< cache-control: private
< x-xss-protection: 0
< x-frame-options: SAMEORIGIN
< x-content-type-options: nosniff
< accept-ranges: none
<
{
"predictions": [
"$479.0",
"$586.0"
],
"deployedModelId": "1949163636186415104",
"model": "projects/234086459238/locations/us-central1/models/947543727654567936",
"modelDisplayName": "diamonds-cpr",
"modelVersionId": "1"
}
* Connection #0 to host us-central1-aiplatform.googleapis.com left intact
通过 Cloud Shell 3 中的 TCPDUMP 终端,我们可以验证未观察到对 us-central1-aiplatform.googleapis.com 的 DNS 查找,因为 /etc/host 文件优先,而数据路径中使用了 PSC IP 地址 100.100.10.10。
user@private-client:~$ sudo tcpdump -i any port 53 -n or host 100.100.10.10
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
22:13:35.507625 ens4 Out IP 192.168.20.2.37004 > 169.254.169.254.53: 58585+ A? oauth2.googleapis.com. (39)
22:13:35.507631 ens4 Out IP 192.168.20.2.37004 > 169.254.169.254.53: 15580+ AAAA? oauth2.googleapis.com. (39)
22:13:35.511796 ens4 In IP 169.254.169.254.53 > 192.168.20.2.37004: 58585 16/0/0 A 142.251.6.95, A 108.177.112.95, A 74.125.124.95, A 172.217.212.95, A 172.217.214.95, A 172.253.114.95, A 172.253.119.95, A 108.177.111.95, A 142.250.1.95, A 108.177.121.95, A 142.250.103.95, A 108.177.120.95, A 142.251.171.95, A 142.250.159.95, A 142.251.120.95, A 142.251.161.95 (295)
22:13:35.512002 ens4 In IP 169.254.169.254.53 > 192.168.20.2.37004: 15580 4/0/0 AAAA 2607:f8b0:4001:c2b::5f, AAAA 2607:f8b0:4001:c18::5f, AAAA 2607:f8b0:4001:c5f::5f, AAAA 2607:f8b0:4001:c58::5f (151)
22:13:35.722145 ens4 Out IP 192.168.20.2.47304 > 100.100.10.10.443: Flags [S], seq 1951267724, win 65320, options [mss 1420,sackOK,TS val 1371205990 ecr 0,nop,wscale 7], length 0
22:13:35.730727 ens4 In IP 100.100.10.10.443 > 192.168.20.2.47304: Flags [S.], seq 3198878726, ack 1951267725, win 65535, options [mss 1366,sackOK,TS val 67847676 ecr 1371205990,nop,wscale 8], length 0
22:13:35.730760 ens4 Out IP 192.168.20.2.47304 > 100.100.10.10.443: Flags [.], ack 1, win 511, options [nop,nop,TS val 1371205999 ecr 67847676], length 0
22:13:35.738339 ens4 Out IP 192.168.20.2.47304 > 100.100.10.10.443: Flags [P.], seq 1:518, ack 1, win 511, options [nop,nop,TS val 1371206006 ecr 67847676], length 517
22:13:35.739922 ens4 In IP 100.100.10.10.443 > 192.168.20.2.47304: Flags [.], ack 518, win 261, options [nop,nop,TS val 67847688 ecr 1371206006], length 0
22:13:35.740860 ens4 In IP 100.100.10.10.443 > 192.168.20.2.47304: Flags [.], seq 1:2709, ack 518, win 261, options [nop,nop,TS val 67847689 ecr 1371206006], length 2708
22:13:35.740863 ens4 In IP 100.100.10.10.443 > 192.168.20.2.47304: Flags [P.], seq 2709:4699, ack 518, win 261, options [nop,nop,TS val 67847689 ecr 1371206006], length 1990
22:13:35.740874 ens4 Out IP 192.168.20.2.47304 > 100.100.10.10.443: Flags [.], ack 2709, win 497, options [nop,nop,TS val 1371206009 ecr 67847689], length 0
22:13:35.740886 ens4 Out IP 192.168.20.2.47304 > 100.100.10.10.443: Flags [.], ack 4699, win 485, options [nop,nop,TS val 1371206009 ecr 67847689], length 0
22:13:35.742709 ens4 Out IP 192.168.20.2.47304 > 100.100.10.10.443: Flags [P.], seq 518:598, ack 4699, win 501, options [nop,nop,TS val 1371206011 ecr 67847689], length 80
22:13:35.743996 ens4 Out IP 192.168.20.2.47304 > 100.100.10.10.443: Flags [P.], seq 598:644, ack 4699, win 501, options [nop,nop,TS val 1371206012 ecr 67847689], length 46
22:13:35.744011 ens4 Out IP 192.168.20.2.47304 > 100.100.10.10.443: Flags [P.], seq 644:693, ack 4699, win 501, options [nop,nop,TS val 1371206012 ecr 67847689], length 49
22:13:35.744082 ens4 Out IP 192.168.20.2.47304 > 100.100.10.10.443: Flags [P.], seq 693:728, ack 4699, win 501, options [nop,nop,TS val 1371206012 ecr 67847689], length 35
22:13:35.744165 ens4 Out IP 192.168.20.2.47304 > 100.100.10.10.443: Flags [P.], seq 728:1069, ack 4699, win 501, options [nop,nop,TS val 1371206012 ecr 67847689], length 341
您已使用混合网络和 Private Service Connect (googleapis) 成功验证了可通过公共端点经由互联网连接到在线预测以及以私密方式连接到在线预测。退出操作系统,返回 Cloud Shell 提示符。
20. 清理
从 Cloud Shell 中删除教程组件。
gcloud compute forwarding-rules delete pscvertex --global --quiet
gcloud compute instances delete workbench-tutorial --zone=us-central1-a --quiet
gcloud compute addresses delete psc-ip --global --quiet
gcloud compute networks subnets delete workbench-subnet --region=us-central1 --quiet
gcloud compute vpn-tunnels delete aiml-vpc-tunnel0 aiml-vpc-tunnel1 on-prem-tunnel0 on-prem-tunnel1 --region=us-central1 --quiet
gcloud compute vpn-gateways delete aiml-vpn-gw on-prem-vpn-gw --region=us-central1 --quiet
gcloud compute routers delete aiml-cr-us-central1 cloud-router-us-central1-aiml-nat --region=us-central1 --quiet
gcloud compute routers delete cloud-router-us-central1-on-prem-nat on-prem-cr-us-central1 --region=us-central1 --quiet
gcloud compute instances delete nat-client private-client --zone=us-central1-a --quiet
gcloud compute firewall-rules delete ssh-iap-on-prem-vpc --quiet
gcloud compute networks subnets delete nat-subnet private-ip-subnet --region=us-central1 --quiet
gcloud compute networks delete on-prem-vpc --quiet
gcloud compute networks delete aiml-vpc --quiet
删除 Vertex 组件
如需删除容器映像,请前往 Artifact Registry,选择您创建的代码库,然后选择删除
如需删除存储分区,请使用 Cloud 控制台中的导航菜单浏览到 Storage,选择您的存储分区,然后点击删除:
从端点取消部署模型。导航到 Vertex AI → 在线预测 → 选择 diamonds-cpr_endpoint → 从端点取消部署模型 → 取消部署
删除模型。导航到 Vertex AI → Model Registry → 删除模型
删除在线预测端点。导航到 VertexAI → 在线预测 → 选择 diamonds-cpr_endpoint → 删除端点
21. 恭喜
恭喜,您已成功配置并验证了使用互联网以原生方式连接到在线预测,以及通过 Private Service Connect 和混合网络以私密方式连接到在线预测。
您创建了 nat-client 和 private-client,并使用 TCPDUMP 验证用于访问 Vertex API 的 IP 地址。此外,您还了解了 Private Service Connect (googleapis),以及如何利用客户 PSC 端点来使用该工具来隔离本地应用和多云端应用。
Cosmopup 认为教程很棒!!
后续操作
请查看下面的一些教程...