具有自动 DNS 配置的 Private Service Connect

1. 简介

具有自动 DNS 配置的 Private Service Connect 使用 Service Directory 和 Cloud DNS 自动创建 DNS 记录,并使用服务使用方的 Private Service Connect 端点 IP 地址对其进行编程。

构建内容

在此 Codelab 中,您将构建一个全面的 Private Service Connect 架构,以说明如何使用自动 DNS,如图 1 所示。

自动 DNS 由以下各项提供支持:

  1. 提供方服务连接会在创建 Private Service Connect 服务连接时提供带“– domain-names”标志的自有公共网域,从而生成自动 DNS。
  2. 使用方定义端点名称。
  3. 自动 DNS 会创建 DNS 区域 goog-psc-default-us-central1 和 DNS 名称 cosmopup.net,以及包含使用方端点名称的 Service Directory 条目。

自动 DNS 的好处如图 (4) 所示,其中最终用户可以通过 DNS FQDN stargazer.cosmopup.net 与使用方端点通信。

图 1

5e26a358454d1336.png

学习内容

  • 如何创建内部 HTTP(S) 负载平衡器
  • 如何使用自动 DNS 创建服务附件
  • 如何建立 Private Service Connect 提供方服务
  • 如何使用自动 DNS 访问使用方端点

所需条件

  • Google Cloud 项目
  • 您拥有的公共网域

2. 准备工作

更新项目以支持 Codelab

此 Codelab 使用 $variables 来帮助在 Cloud Shell 中实现 gcloud 配置。

在 Cloud Shell 中,执行以下操作:

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

3. 提供方设置

创建提供方 VPC

在 Cloud Shell 中,执行以下操作:

gcloud compute networks create producer-vpc --project=$projectname --subnet-mode=custom

创建提供方子网

在 Cloud Shell 中,执行以下操作:

gcloud compute networks subnets create gce-subnet --project=$projectname --range=172.16.20.0/28 --network=producer-vpc --region=us-central1

在 Cloud Shell 中,执行以下操作:

gcloud compute networks subnets create load-balancer-subnet --project=$projectname --range=172.16.10.0/28 --network=producer-vpc --region=us-central1

为内部负载平衡器预留 IP 地址

在 Cloud Shell 中,执行以下操作:

gcloud compute addresses create lb-ip \
    --region=us-central1 \
    --subnet=load-balancer-subnet \
    --purpose=GCE_ENDPOINT

查看分配的 IP 地址

使用 compute addresses describe 命令查看分配的 IP 地址

gcloud compute addresses describe lb-ip  --region=us-central1 | grep address:

创建区域代理子网

代理分配在 VPC 网络级层进行,而不是在负载平衡器级层。您必须在其中使用基于 Envoy 的负载平衡器的虚拟网络 (VPC) 的每个区域中创建一个代理专用子网 。如果您在同一区域和同一 VPC 网络中部署多个负载平衡器,则它们会共用相同的代理专用子网以进行负载均衡。

  1. 客户端连接到负载平衡器转发规则所指定的 IP 地址和端口。
  2. 每个代理监听由相应负载平衡器的转发规则指定的 IP 地址和端口。其中一个代理接收并终止客户端的网络连接。
  3. 代理建立与相应后端虚拟机的连接,具体取决于负载平衡器的网址映射和后端服务。

无论您的 VPC 网络是自动模式还是自定义模式,您都必须创建代理专用子网。代理专用子网必须至少提供 64 个 IP 地址,且对应的前缀长度不得超过 /26。建议的子网大小为 /23(512 个代理专用地址)。

在 Cloud Shell 中,执行以下操作:

gcloud compute networks subnets create proxy-subnet-us-central \
  --purpose=REGIONAL_MANAGED_PROXY \
  --role=ACTIVE \
  --region=us-central1 \
  --network=producer-vpc \
  --range=172.16.0.0/23

创建 Private Service Connect NAT 子网

创建一个或多个专用子网,以配合 Private Service Connect 使用。如果您使用 Google Cloud 控制台发布服务,则可以在此过程中创建子网。在服务的负载平衡器所在的区域中创建子网。您无法将常规子网转换为 Private Service Connect 子网。

在 Cloud Shell 中,执行以下操作:

gcloud compute networks subnets create psc-nat-subnet \
    --project $projectname \
    --network producer-vpc \
    --region us-central1 \
    --range 100.100.10.0/24 \
    --purpose PRIVATE_SERVICE_CONNECT

创建生产者防火墙规则

配置 防火墙规则,以允许 Private Service Connect NAT 子网与 ILB 仅代理子网之间的流量。

在 Cloud Shell 中,执行以下操作:

gcloud compute --project=$projectname firewall-rules create allow-to-ingress-nat-subnet --direction=INGRESS --priority=1000 --network=producer-vpc --action=ALLOW --rules=all --source-ranges=100.100.10.0/24

在 Cloud Shell 中,创建 fw-allow-health-check 防火墙规则,以允许 Google Cloud 健康检查通过 TCP 端口 80 访问生产者服务(后端服务)。

gcloud compute firewall-rules create fw-allow-health-check \
    --network=producer-vpc \
    --action=allow \
    --direction=ingress \
    --source-ranges=130.211.0.0/22,35.191.0.0/16 \
    --rules=tcp:80

为代理专用子网创建入站流量允许防火墙规则,以允许负载平衡器与 TCP 端口 80 上的后端实例进行通信。

gcloud compute firewall-rules create fw-allow-proxy-only-subnet \
    --network=producer-vpc \
    --action=allow \
    --direction=ingress \
    --source-ranges=172.16.0.0/23 \
    --rules=tcp:80

Cloud Router 和 NAT 配置

由于虚拟机实例没有外部 IP 地址,因此本 Codelab 中使用 Cloud NAT 来安装软件包。

在 Cloud Shell 中,创建 Cloud Router 路由器。

gcloud compute routers create cloud-router-for-nat --network producer-vpc --region us-central1

在 Cloud Shell 中,创建 NAT 网关。

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

实例组配置

在下一部分中,您将创建 Compute Engine 实例和非代管式实例组。在后续步骤中,实例组将用作负载平衡器后端服务。

在 Cloud Shell 中,创建传递给生产者服务的区域性健康检查。

gcloud compute instances create app-server-1 \
    --project=$projectname \
    --machine-type=e2-micro \
    --image-family debian-10 \
    --no-address \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=gce-subnet \
    --metadata startup-script="#! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo 'Welcome to App-Server-1 !!' | tee /var/www/html/index.html
      EOF"

在 Cloud Shell 中,创建非托管实例组。

gcloud compute instance-groups unmanaged create psc-instance-group --zone=us-central1-a

gcloud compute instance-groups unmanaged set-named-ports psc-instance-group --project=$projectname --zone=us-central1-a --named-ports=http:80

gcloud compute instance-groups unmanaged add-instances psc-instance-group --zone=us-central1-a --instances=app-server-1

配置负载平衡器

在以下步骤中,您将配置内部 HTTP 负载平衡器 ,并在后续步骤中将其作为服务附件发布

在 Cloud Shell 中,创建区域性健康检查。

gcloud compute health-checks create http http-health-check \
    --region=us-central1 \
    --use-serving-port

在 Cloud Shell 中,创建后端服务。

 gcloud compute backend-services create l7-ilb-backend-service \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --protocol=HTTP \
      --health-checks=http-health-check \
      --health-checks-region=us-central1 \
      --region=us-central1

在 Cloud Shell 中,将后端添加到后端服务。

gcloud compute backend-services add-backend l7-ilb-backend-service \
  --balancing-mode=UTILIZATION \
  --instance-group=psc-instance-group \
  --instance-group-zone=us-central1-a \
  --region=us-central1

在 Cloud Shell 中,创建网址映射以将传入请求路由到后端服务。

gcloud compute url-maps create l7-ilb-map \
    --default-service l7-ilb-backend-service \
    --region=us-central1

创建 HTTP 目标代理。

gcloud compute target-http-proxies create l7-ilb-proxy\
    --url-map=l7-ilb-map \
    --url-map-region=us-central1 \
    --region=us-central1

创建转发规则以将传入请求路由到代理。请勿使用代理专用子网来创建转发规则。

 gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=producer-vpc \
      --subnet=load-balancer-subnet \
      --address=lb-ip \
      --ports=80 \
      --region=us-central1 \
      --target-http-proxy=l7-ilb-proxy \
      --target-http-proxy-region=us-central1

4. 验证负载平衡器

在 Cloud 控制台中,依次前往网络服务 → 负载均衡 → 负载平衡器。请注意后端服务的健康检查已成功

881567cc11627009.png

选择 ‘l7-ilb-map' 会生成前端 IP 地址,该地址应与您在上一步中 grep 到的 IP 地址一致,并标识后端服务。

bab89b0a7b4f95e9.png

5. 创建 Private Service Connect 服务连接

创建服务连接

在 Cloud Shell 中,创建服务附件。请务必在域名末尾添加“.”

gcloud compute service-attachments create published-service --region=us-central1 --producer-forwarding-rule=l7-ilb-forwarding-rule --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=psc-nat-subnet --domain-names=cosmopup.net.

可选:如果使用共享 VPC,请在服务项目中创建服务连接。

gcloud compute service-attachments create published-service --region=us-central1 --producer-forwarding-rule=l7-ilb-forwarding-rule --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=projects/<hostproject>/regions/us-central1/subnetworks/psc-nat-subnet --domain-names=cosmopup.net.

前往 Network Services(网络服务)→ Private Service Connect(Private Service Connect),查看新建立的服务连接

d27fee9073dbbe2.png

选择 published-service 可提供更多详细信息,包括使用方用于建立 Private Service Connect 连接的服务连接 URI 和域名。

503df63730c62df2.png

服务连接详情

projects/<project name>/regions/us-central1/serviceAttachments/published-service

6. 使用方设置

启用使用方 API

在 Cloud Shell 中,执行以下操作:

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

创建使用方 VPC 网络

在 Cloud Shell 中,执行以下操作:

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

创建使用方子网

在 Cloud Shell 中,为测试实例创建子网。

gcloud compute networks subnets create db1-subnet --project=$projectname --range=10.20.0.0/28 --network=consumer-vpc --region=us-central1

在 Cloud Shell 中,为使用方端点创建子网。

gcloud compute networks subnets create consumer-ep-subnet --project=$projectname --range=10.10.0.0/28 --network=consumer-vpc --region=us-central1

创建使用方端点(转发规则)

在 Cloud Shell 中,创建将用于使用方端点的静态 IP 地址。

gcloud compute addresses create psc-consumer-ip-1 --region=us-central1 --subnet=consumer-ep-subnet --addresses 10.10.0.10

我们使用之前生成的服务连接 URI 创建使用方端点。

在 Cloud Shell 中,创建使用方端点。

gcloud compute forwarding-rules create stargazer --region=us-central1 --network=consumer-vpc --address=psc-consumer-ip-1 --target-service-attachment=projects/$projectname/regions/us-central1/serviceAttachments/published-service

7. 验证使用方 VPC 网络中的连接

在使用方 VPC 网络中,依次前往网络服务 → Private Service Connect → 已连接的端点,验证 Private Service Connect 是否已成功连接。记下我们之前建立的 Stargazer 连接和相应的 IP 地址。

c60812433c3e1676.png

选择 psc-consumer-1 后,系统会提供详细信息,包括服务连接 URI

14d3e3b1e0aee3c2.png

8. 验证提供方 VPC 网络中的连接

在提供方的 VPC 网络中,依次前往 Network Services(网络服务)→ Private Service Connect(Private Service Connect)→ Published Service(已发布的服务),验证专用服务连接是否成功。请注意,已发布的服务连接现在显示 1 条转发规则(连接端点)。

911dbd7421bcfd3a.png

9. 验证自动 DNS 配置

我们来评估一下 DNS 和 Service Directory 配置。

Cloud DNS 配置

依次选择网络服务 → Cloud DNS → 区域。系统会自动生成区域 goog-psc-default-us-central 和 DNS 名称 cosmopup.net

4395e7b33fc42faa.png

查看 DNS 和 Service Directory 配置

选择区域名称后,我们可以了解 Service Directory 如何与 Cloud DNS 集成。

e4fe44d945b20451.png

Service Directory 配置

依次选择 Network Services(网络服务)→ Service Directory(服务目录)

还记得使用方端点名称“stargazer”吗?它会在 Service Directory 中自动编程,以便我们使用 FQDN stargazer.goog-psc-default–us-central1 访问使用方端点

602deab65b5ac315.png

10. 验证使用方对生产者服务的访问权限

在使用方的 VPC 网络中,我们将创建一个虚拟机,通过访问使用方端点 stargazer.cosmopup.net 来测试与已发布服务的连接情况

在 Cloud Shell 中,在使用方 VPC 中创建测试实例。

gcloud compute instances create db1 \
    --zone=us-central1-a \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --subnet=db1-subnet \
    --no-address

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

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

在 Cloud Shell 中,创建 IAP 防火墙规则。

gcloud compute firewall-rules create ssh-iap-consumer \
    --network consumer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

在 Cloud Shell 中使用 IAP 登录 consumer-vm,通过执行 curl 命令验证与提供方服务的连接。如果发生超时,请重试。

gcloud compute ssh db1 --project=$projectname --zone=us-central1-a --tunnel-through-iap

执行 curl 以验证与生产者服务的连接。验证完毕后,退出虚拟机,返回 Cloud Shell 提示

在 Cloud Shell 中,针对您的自定义网域(例如 stargazer.[custom-domain.com])执行 curl 命令。在以下输出中,系统会对 stargazer.cosmopup.net 执行 curl 命令

user@db1:~$ curl -v stargazer.cosmopup.net
*   Trying 10.10.0.10...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55d3aa8190f0)
* Connected to stargazer.cosmopup.net (10.10.0.10) port 80 (#0)
> GET / HTTP/1.1
> Host: stargazer.cosmopup.net
> User-Agent: curl/7.64.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< date: Thu, 22 Dec 2022 00:16:25 GMT
< server: Apache/2.4.38 (Debian)
< last-modified: Wed, 21 Dec 2022 20:26:32 GMT
< etag: "1b-5f05c5e43a083"
< accept-ranges: bytes
< content-length: 27
< content-type: text/html
< via: 1.1 google
< 
Welcome to App-Server-1 !!

退出虚拟机,返回 Cloud Shell 提示以启动清理任务

11. 清理

在 Cloud Shell 中,删除 Codelab 组件。

gcloud compute forwarding-rules delete stargazer --region=us-central1 --quiet

gcloud compute instances delete db1 --zone=us-central1-a --quiet 

gcloud compute addresses delete psc-consumer-ip-1 --region=us-central1 --quiet 

gcloud compute networks subnets delete consumer-ep-subnet db1-subnet --region=us-central1 --quiet 

gcloud compute firewall-rules delete ssh-iap-consumer --quiet 

gcloud compute networks delete consumer-vpc --quiet 

gcloud compute service-attachments delete published-service --region=us-central1 --quiet 

gcloud compute forwarding-rules delete l7-ilb-forwarding-rule --region=us-central1 --quiet 

gcloud compute target-http-proxies delete l7-ilb-proxy --region=us-central1 --quiet 
 
gcloud compute url-maps delete l7-ilb-map --region=us-central1 --quiet 
 
gcloud compute backend-services delete l7-ilb-backend-service --region=us-central1 --quiet
 
gcloud compute instance-groups unmanaged delete psc-instance-group --zone=us-central1-a --quiet
 
gcloud compute instances delete app-server-1 --zone=us-central1-a --quiet 
 
gcloud compute firewall-rules delete allow-to-ingress-nat-subnet fw-allow-health-check fw-allow-proxy-only-subnet --quiet 
 
gcloud compute addresses delete lb-ip --region=us-central1 --quiet 
 
gcloud compute networks subnets delete gce-subnet load-balancer-subnet psc-nat-subnet proxy-subnet-us-central --region=us-central1 --quiet 
 
gcloud compute routers delete cloud-router-for-nat --region=us-central1 --quiet 
 
gcloud compute networks delete producer-vpc --quiet 

12. 恭喜

恭喜,您已成功配置并验证了具有自动 DNS 配置的 Private Service Connect 端点。

您已创建提供方基础架构,并添加了具有公开网域注册的服务附件。您已了解如何在使用方 VPC 网络中创建使用方端点,以便使用自动生成的 DNS 连接到本地服务。

Cosmopup 认为 Codelab 很棒!

8c2a10eb841f7b01.jpeg

后续操作

查看下列 Codelab…

深入阅读和视频

参考文档