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 服务。您还将部署一个测试虚拟机,以确保服务的本地功能正常运行。您将通过服务连接将 Apache 服务公开为 PSC 提供方服务。
在使用方 VPC 中,您将部署一个全球外部应用负载平衡器,其中包含指向 Apache 服务的 PSC 后端服务。然后,您将设置一个公共 DNS 区域,以在公共互联网上访问 PSC 服务。

3. 设置和要求
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。



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

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

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 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
创建子网
两个常规用途子网将部署在 producer-vpc 中。服务子网将用于部署 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 才能为我们的 Producer 服务安装合适的软件包。
从 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 可访问的所有虚拟机实例。
- 允许来自 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 地址是您之前预留并记下的地址。
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 地址,并在 Cloud Shell 变量中捕获该 IP 地址。
从 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://<YOUR-EXTERNAL-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 服务