Private Service Connect - 使用 PSC 后端访问提供方服务

1. 简介

借助 Private Service Connect,服务提供方可以将服务从一个 VPC 网络以私有方式公开给另一个 VPC 网络。使用方可以通过 PSC 端点或 PSC 后端访问提供方服务。

本 Codelab 重点介绍 PSC 后端。PSC 后端与 Google Cloud 代理负载平衡器(应用负载平衡器或网络负载平衡器)搭配使用。使用 PSC 后端可提供更精细的使用方控制,例如:

  • 更深入的可观测性和日志记录
  • Cloud Armor 集成
  • 自定义网址
  • 高级流量管理
  • 自定义 TLS 证书

在此 Codelab 中,您将学习如何使用全球外部应用负载平衡器创建 Private Service Connect 后端,以私密方式访问另一个网络中的生产者服务。

学习内容

  • 创建并配置与全球外部应用负载平衡器关联的 PSC 后端
  • 配置 Apache 托管的 Web 服务,并通过服务连接将其公开为 PSC 服务
  • 创建 SSL 证书以终止内部和外部应用负载平衡器上的 SSL
  • 配置 Cloud DNS 公开可用区以访问 PSC 服务

所需条件

  • 具有所有者权限的 Google Cloud 项目

2. 测试环境

您将创建的环境将由使用方 VPC 和提供方 VPC 组成。在生产者 VPC 中,您将通过用于构建开源 Apache Web 服务的实例模板部署代管式实例组。您还将部署一个 test-vm,以确保服务的本地功能正常运行。您将通过服务连接将 Apache 服务公开为 PSC 提供方服务。

在使用方 VPC 中,您将部署一个全球外部应用负载平衡器,并将 PSC 后端服务指向 Apache 服务。然后,您将设置一个公共 DNS 区域,以便在公共互联网上访问 PSC 服务。

31e7497bf3d9035c.png

3. 设置和要求

自定进度的环境设置

  1. 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用 PROJECT_ID 标识)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且此 ID 在项目期间会一直保留。
  • 此外,还有第三个值,即部分 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有的话)。若要关闭资源以避免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除项目。Google Cloud 新用户符合参与 300 美元免费试用计划的条件。

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

Google Cloud 控制台 中,点击右上角工具栏中的 Cloud Shell 图标:

55efc1aaa7a4d3ad.png

预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:

7ffe5cbb04455448.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。您在此 Codelab 中的所有工作都可以在浏览器中完成。您无需安装任何程序。

4. 准备工作

启用 API

在 Cloud Shell 中,确保项目 ID 已设置

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
export project=YOUR-PROJECT-NAME
export region=us-central1
echo $project
echo $region

启用所有必要的服务

gcloud services enable compute.googleapis.com
gcloud services enable servicedirectory.googleapis.com
gcloud services enable dns.googleapis.com

5. 提供方 VPC 设置

创建 VPC 网络

通过 Cloud Shell

gcloud compute networks create producer-vpc --subnet-mode custom

创建子网

系统将在 provider-vpc 中部署两个通用子网。service-subnet 将用于部署 Apache Web 服务虚拟机以及负载平衡器转发规则。test-client-subnet 将位于其他区域,并将用于部署虚拟机,以测试启用了全球访问权限的 Apache 服务。

通过 Cloud Shell

gcloud compute networks subnets create service-subnet \
    --network=producer-vpc \
    --range=10.0.0.0/28 \
    --region=$region

通过 Cloud Shell

gcloud compute networks subnets create test-client-subnet \
    --network=producer-vpc \
    --range=10.0.1.0/28 \
    --region=us-east4

我们还必须部署一个代理专用子网,以便与区域级内部应用负载平衡器搭配使用。

通过 Cloud Shell

gcloud compute networks subnets create central-proxy-subnet \
    --network=producer-vpc \
    --range=10.100.101.0/24 \
    --region=$region \
    --purpose=REGIONAL_MANAGED_PROXY \
    --role=ACTIVE

部署 PSC 服务时,每项唯一服务都需要与服务连接相关联的相应 PSC NAT 子网。此子网的大小应根据预计连接的端点数量进行适当调整。

通过 Cloud Shell

gcloud compute networks subnets create psc-nat-subnet \
    --network=producer-vpc \
    --region=$region \
    --range=10.100.100.0/24 \
    --purpose=PRIVATE_SERVICE_CONNECT

创建 Cloud NAT

您需要使用 Cloud NAT 为我们的生产者服务安装适当的软件包。

通过 Cloud Shell

gcloud compute routers create central-cr \
    --network=producer-vpc \
    --region=$region

通过 Cloud Shell

gcloud compute routers nats create central-nat \
    --router=central-cr \
    --region=$region \
    --nat-all-subnet-ip-ranges \
    --auto-allocate-nat-external-ips

创建网络防火墙政策和规则

通过 Cloud Shell

gcloud compute network-firewall-policies create producer-vpc-policy --global

gcloud compute network-firewall-policies associations create \
    --firewall-policy producer-vpc-policy \
    --network producer-vpc \
    --name network-producer-vpc \
    --global-firewall-policy

如需允许 IAP 连接到您的虚拟机实例,请创建一个防火墙规则,该规则:

  • 适用于您希望使用 IAP 可访问的所有 VM 实例。
  • 允许来自 IP 地址范围 35.235.240.0/20 的入站流量。此范围包含 IAP 用于 TCP 转发的所有 IP 地址。

通过 Cloud Shell

gcloud compute network-firewall-policies rules create 1000 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "SSH with IAP" \
    --direction INGRESS \
    --src-ip-ranges 35.235.240.0/20 \
    --layer4-configs tcp:22  \
    --global-firewall-policy

您需要再创建两个防火墙规则,以允许来自负载平衡器代理专用子网 (2000) 的入站流量到达负载平衡器后端,以及一个允许在后端实例上执行负载平衡器健康检查的规则 (2001)。

通过 Cloud Shell

gcloud compute network-firewall-policies rules create 2000 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "allow traffic from load balancer proxy subnet" \
    --direction INGRESS \
    --src-ip-ranges 10.100.101.0/24 \
    --layer4-configs tcp:443 \
    --global-firewall-policy


gcloud compute network-firewall-policies rules create 2001 \
    --action ALLOW \
    --firewall-policy producer-vpc-policy \
    --description "allow load balancer health checks" \
    --direction INGRESS \
    --src-ip-ranges 130.211.0.0/22,35.191.0.0/16 \
    --layer4-configs tcp:443 \
    --global-firewall-policy

6. 创建 Apache Web 服务

我们将创建一个简单的 Apache Web 服务,用于显示“PSC 服务”。

创建实例模板

通过 Cloud Shell

gcloud compute instance-templates create apache-service-template \
    --network producer-vpc \
    --subnet service-subnet \
    --region $region \
    --no-address \
    --metadata startup-script='#! /bin/bash
    sudo apt-get update
    apt-get install apache2 -y
    a2enmod ssl
    sudo a2ensite default-ssl
    echo "PSC Service" | \
    tee /var/www/html/index.html
    systemctl restart apache2'

为 MIG 创建健康检查

通过 Cloud Shell

gcloud compute health-checks create https service-mig-healthcheck \
    --port=443 \
    --global

创建托管式实例组

通过 Cloud Shell

gcloud compute instance-groups managed create psc-service-mig \
    --region $region \
    --size=2 \
    --template=apache-service-template \
    --health-check=service-mig-healthcheck

gcloud compute instance-groups managed set-named-ports psc-service-mig \
    --named-ports=https:443 \
    --region=$region

7. 创建自签名证书

完成此处说明的第 1 步,以创建自签名证书。您可以在 Cloud Shell 中运行所有命令。完成第 1 步后,请返回此处。您的通用名称必须配置为 example.com。

创建要与负载平衡器关联的证书资源。将证书和私钥参数替换为您的具体文件名。

通过 Cloud Shell

gcloud compute ssl-certificates create producer-service-cert \
    --certificate=<your-producer-certfile.cert> \
    --private-key=<your-producer-keyfile.pem> \
    --region=$region

8. 创建区域级内部应用负载平衡器

接下来,我们将为该服务创建负载平衡器组件。我们使用的是区域级内部应用负载平衡器,但您也可以选择使用任何 Google Cloud 内部负载平衡器。请参阅适当的负载平衡器文档,了解如何处理 TLS。

创建要用于负载平衡器转发规则的内部 IP 地址,并记下该 IP 地址,以便稍后对服务进行测试调用时使用。

通过 Cloud Shell

gcloud compute addresses create apache-service-ip \
 --region=$region \
 --subnet=service-subnet

gcloud compute addresses describe apache-service-ip \
   --format="get(address)" \
   --region=$region

创建负载平衡器健康检查。

通过 Cloud Shell

gcloud compute health-checks create https lb-apache-service-hc \
    --region=$region \
    --port-name=https

创建后端服务。

通过 Cloud Shell

gcloud compute backend-services create apache-bes\
  --load-balancing-scheme=INTERNAL_MANAGED \
  --protocol=HTTPS \
  --port-name=https \
  --health-checks=lb-apache-service-hc \
  --health-checks-region=$region \
  --region=$region


gcloud compute backend-services add-backend apache-bes \
  --balancing-mode=UTILIZATION \
  --instance-group=psc-service-mig \
  --region=$region

创建网址映射。

通过 Cloud Shell

gcloud compute url-maps create producer-url-map \
  --default-service=apache-bes \
  --region=$region

创建目标 HTTPS 代理。

通过 Cloud Shell

gcloud compute target-https-proxies create https-proxy \
  --url-map=producer-url-map \
  --region=$region \
  --ssl-certificates=producer-service-cert

创建转发规则。

通过 Cloud Shell

gcloud compute forwarding-rules create apache-fr \
  --load-balancing-scheme=INTERNAL_MANAGED \
  --network=producer-vpc \
  --subnet=service-subnet \
  --address=apache-service-ip \
  --ports=443 \
  --region=$region \
  --target-https-proxy=https-proxy \
  --target-https-proxy-region=$region \
  --allow-global-access

9. 创建测试虚拟机并在本地测试服务

在创建服务附件之前,我们将在其他区域创建一个测试客户端虚拟机,以测试负载平衡器是否已正确配置了全球访问权限和 TLS。

通过 Cloud Shell

gcloud compute instances create vm-client \
    --zone=us-east4-a \
    --subnet=test-client-subnet \
    --no-address

等待大约一分钟,让预配完成,然后通过 SSH 连接到实例。

通过 Cloud Shell

gcloud compute ssh \
    --zone "us-east4-a" "vm-client" \
    --tunnel-through-iap \
    --project $project

通过负载平衡器通过 443 连接来测试 Apache 服务。内部 IP 地址是您之前预留并记下的 IP 地址。

curl https://example.com:443 -k --connect-to example.com:443:<YOUR-INTERNAL-IP>:443

预期结果

PSC Service

退出虚拟机。

通过 vm-client

exit

10. 创建服务连接

在此示例中,我们将服务连接配置为仅允许来自此项目的 PSC 连接。此字段可配置为接受一个或多个特定项目或影音平台,但不能同时接受这两者。我们已将连接数上限设置为 5 个连接。每个项目或网络都必须设置一个限制。

通过 Cloud Shell

gcloud compute service-attachments create apache-service-attachment \
    --region=$region \
    --producer-forwarding-rule=apache-fr \
    --connection-preference=ACCEPT_MANUAL \
    --consumer-accept-list=$project=5 \
    --nat-subnets=psc-nat-subnet

您应记下服务附件 URI (selfLink),因为您需要在下一步中进行 PSC 后端配置时使用它。您可以在 Cloud Shell 中执行以下命令来获取该密钥。

通过 Cloud Shell

gcloud compute service-attachments describe apache-service-attachment \
    --region $region

复制从 projects 开始的 URI

示例:projects/$project/regions/$region/serviceAttachments/apache-service-attachment

11. 使用方 VPC 设置

创建 VPC 网络

通过 Cloud Shell

gcloud compute networks create consumer-vpc --subnet-mode custom

创建子网

使用方需要在要部署 Private Service Connect 网络端点组 (NEG) 的位置创建一个子网。

通过 Cloud Shell

gcloud compute networks subnets create consumer-subnet \
    --network=consumer-vpc \
    --region=$region \
    --range=10.0.0.0/28

12. 预留外部 IP 地址并创建消费者端自签名证书

外部 IP

创建一个外部静态 IP 地址,稍后将用于负载平衡器转发规则,并将 IP 地址捕获到 Cloud Shell 变量中。

通过 Cloud Shell

gcloud compute addresses create external-psc-ip \
    --network-tier=PREMIUM \
    --ip-version=IPV4 \
    --global

export externalip=$(gcloud compute addresses describe external-psc-ip \
    --format="get(address)" \
    --global)

echo $externalip

使用方自签发证书

再次完成此处说明的第 1 步,以创建自签名证书。您可以在 Cloud Shell 中运行所有命令。完成第 1 步后,请返回此处。我们将使用名为 nip.io 的开源公共通配符 DNS 服务,而不是拥有自己的公共 DNS 可用区。PSC 服务的公共网址将使用您刚刚配置的外部 IP 地址。您的通用名称必须与 <YOUR-EXTERNAL-IP.nip.io> 搭配使用

创建要与外部负载平衡器关联的证书资源。将证书和私钥参数替换为您的具体文件名。

通过 Cloud Shell

gcloud compute ssl-certificates create consumer-service-cert \
    --certificate=<your-consumer-certfile.cert> \
    --private-key=<your-consumer-keyfile.pem> \
    --global

13. 创建负载平衡器组件

我们将创建一个全球外部应用负载平衡器,并将 PSC NEG 指向新创建的服务附件作为后端服务。

请准备好我们在上一步中记下的服务附件 URI。将以下 psc-target-service 替换为您的 URI。

通过 Cloud Shell

gcloud compute network-endpoint-groups create apache-psc-neg \
--network-endpoint-type=private-service-connect \
--psc-target-service=projects/$project/regions/$region/serviceAttachments/apache-service-attachment \
--region=$region \
--network=consumer-vpc \
--subnet=consumer-subnet

创建后端服务。

通过 Cloud Shell

gcloud compute backend-services create apache-pscneg-bes \
    --load-balancing-scheme=EXTERNAL_MANAGED \
    --protocol=HTTPS \
    --global

gcloud compute backend-services add-backend apache-pscneg-bes \
    --network-endpoint-group=apache-psc-neg \
    --network-endpoint-group-region=$region \
    --global

创建网址映射

通过 Cloud Shell

gcloud compute url-maps create consumer-url-map \
    --default-service=apache-pscneg-bes \
    --global

创建目标 HTTPS 代理。

通过 Cloud Shell

gcloud compute target-https-proxies create psc-https-proxy \
    --url-map=consumer-url-map \
    --ssl-certificates=consumer-service-cert

创建转发规则

通过 Cloud Shell

gcloud compute forwarding-rules create external-fr \
  --load-balancing-scheme=EXTERNAL_MANAGED \
  --network-tier=PREMIUM \
  --address=external-psc-ip \
  --global \
  --target-https-proxy=psc-https-proxy \
  --ports=443

14. 创建公共 DNS 区域

通过 Cloud Shell

gcloud dns managed-zones create "psc-service" \
    --dns-name=$externalip.nip.io. \
    --description="public dns for psc service" \
    --visibility=public

通过 Cloud Shell

gcloud dns record-sets transaction start \
   --zone="psc-service"

gcloud dns record-sets transaction add $externalip \
   --name=$externalip.nip.io \
   --ttl=300 \
   --type=A \
   --zone="psc-service"

gcloud dns record-sets transaction execute \
   --zone="psc-service"

15. 测试使用方 PSC 连接

请等待 7 到 10 分钟,然后再进行测试,以便公共 DNS 传播。

通过 Cloud Shell

curl https://$externalip.nip.io -k

您还可以通过在浏览器或桌面终端中输入 https://<您的外部 IP>.nip.io 来从浏览器进行测试。

预期结果

PSC Service

16. 清理步骤

在一个 Cloud Shell 终端中删除实验组件

gcloud dns record-sets delete $externalip.nip.io --zone="psc-service" --type=A -q

gcloud dns managed-zones delete "psc-service" -q

gcloud compute forwarding-rules delete external-fr --global -q 

gcloud compute target-https-proxies delete psc-https-proxy -q

gcloud compute url-maps delete consumer-url-map --global -q

gcloud compute backend-services delete apache-pscneg-bes --global -q

gcloud compute network-endpoint-groups delete apache-psc-neg --region=$region -q

gcloud compute ssl-certificates delete consumer-service-cert --global -q

gcloud compute addresses delete external-psc-ip --global -q

gcloud compute networks subnets delete consumer-subnet --region $region -q

gcloud compute networks delete consumer-vpc -q

gcloud compute instances delete vm-client --zone=us-east4-a -q

gcloud compute service-attachments delete apache-service-attachment --region $region -q

gcloud compute forwarding-rules delete apache-fr --region $region -q

gcloud compute target-https-proxies delete https-proxy --region $region -q

gcloud compute url-maps delete producer-url-map --region $region -q

gcloud compute backend-services delete apache-bes --region $region -q

gcloud compute health-checks delete lb-apache-service-hc --region $region -q

gcloud compute addresses delete apache-service-ip --region $region -q

gcloud compute ssl-certificates delete producer-service-cert --region $region -q

gcloud compute instance-groups managed delete psc-service-mig --region $region -q

gcloud compute health-checks delete service-mig-healthcheck --global -q

gcloud compute instance-templates delete apache-service-template -q

gcloud compute network-firewall-policies rules delete 2001 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies rules delete 2000 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies rules delete 1000 --firewall-policy producer-vpc-policy --global-firewall-policy -q

gcloud compute network-firewall-policies associations delete --firewall-policy=producer-vpc-policy  --name=network-producer-vpc --global-firewall-policy -q

gcloud compute network-firewall-policies delete producer-vpc-policy --global -q

gcloud compute routers nats delete central-nat --router=central-cr --region $region -q

gcloud compute routers delete central-cr --region $region -q

gcloud compute networks subnets delete psc-nat-subnet --region $region -q

gcloud compute networks subnets delete service-subnet --region $region -q

gcloud compute networks subnets delete test-client-subnet --region us-east4 -q 

gcloud compute networks subnets delete central-proxy-subnet --region $region -q

gcloud compute networks delete producer-vpc -q

17. 恭喜!

恭喜您完成此 Codelab。

所学内容

  • 创建并配置与全球外部应用负载平衡器关联的 PSC 后端
  • 配置 Apache 托管的 Web 服务,并通过服务连接将其公开为 PSC 服务
  • 创建 SSL 证书以终止内部和外部应用负载平衡器上的 SSL
  • 配置 Cloud DNS 公开可用区以访问 PSC 服务