使用 Private Service Connect 和具有内部 HTTP(s) 负载平衡器的混合 NEG 通过混合网络连接到本地服务

1. 简介

Cloud Load Balancing 支持将流量负载均衡到超出 Google Cloud 端点的端点(例如本地数据中心和其他可使用混合连接访问的公有云)。

混合策略是一种切实可行的解决方案,可让您适应不断变化的市场需求并逐步对应用进行现代化改造。这可能是用于支持迁移到基于云的现代解决方案的临时混合部署,也可以是组织的 IT 基础架构的永久固定装置。

设置混合负载均衡还可以将 Cloud Load Balancing 的网络功能的优势应用于 Google Cloud 之外的现有基础架构上运行的服务。

如果您希望使混合服务在其他 VPC 网络中可用,则可以使用 Private Service Connect 发布服务。通过将服务连接置于内部区域 HTTP(S) 负载平衡器之前,您可以让其他 VPC 网络中的客户端访问在本地或其他云环境中运行的 混合服务

构建内容

在本 Codelab 中,您将使用网络端点组构建一个内部 HTTP(S) 负载平衡器,并通过混合连接方式与本地服务通信。使用方 VPC 将能够使用端口 80 与本地服务通信,端口 443 不在本 Codelab 的讨论范围内。

4ad647fa51b3473e.png

学习内容

  • 如何创建具有混合 NEG 后端的内部 HTTP(S) 负载平衡器
  • 如何建立 Private Service Connect 提供方(服务连接)和使用方(转发规则)

所需条件

  • 已建立的混合网络,例如高可用性 VPN、互连、SW-WAN
  • Google Cloud 项目

建立混合连接

您的 Google Cloud 和本地或其他云环境必须通过 Cloud Interconnect VLAN 连接或使用 Cloud Router 路由器的 Cloud VPN 隧道通过混合连接进行连接。我们建议您使用高可用性连接。

启用了全球动态路由的 Cloud Router 路由器会通过 BGP 了解特定端点并将其编程到您的 Google Cloud VPC 网络中。不支持区域动态路由。也不支持静态路由。

您用于配置 Cloud Interconnect 或 Cloud VPN 的 Google Cloud VPC 网络与您用于配置混合负载均衡部署的网络相同。确保您的 VPC 网络的子网 CIDR 范围与远程 CIDR 范围无冲突。当 IP 地址重叠时,子网路由优先于远程连接。

如需查看相关说明,请参阅以下内容:

自定义路由通告

以下子网需要 Cloud Router 向本地网络发送自定义通告,以确保更新本地防火墙规则。

子网

说明

172.16.0.0/23

用于直接与本地服务通信的代理子网

130.211.0.0/22、35.191.0.0/16

Google Cloud 运行状况检查

2. 准备工作

更新项目以支持 Codelab

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

在 Cloud Shell 中,执行以下操作

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

3. 提供方设置

创建提供方 VPC

在 Cloud Shell 中,执行以下操作

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

创建生产者子网

在 Cloud Shell 中,执行以下操作

gcloud compute networks subnets create subnet-201 --project=$psclab --range=10.10.1.0/24 --network=producer-vpc --region=us-central1
gcloud compute networks subnets create subnet-202 --project=$psclab --range=10.20.1.0/24 --network=producer-vpc --region=us-central1

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

在 Cloud Shell 中执行以下操作,Private Service Connect 不支持使用 SHARED_VIP,请改用 GCE_ENDPOINT

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

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

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

创建区域代理子网

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

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

无论您的网络是自动模式还是自定义模式,您都必须创建代理专用子网。代理专用子网必须至少提供 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 --network=producer-vpc --region=us-central1 --range=100.100.10.0/24 --purpose=private-service-connect

创建生产者防火墙规则

配置 防火墙规则以允许 Private Service Connect 端点与服务连接之间的流量。在 Codelab 中,创建了入站防火墙规则,允许 NAT 子网 100.100.10.0/24 访问 Private Service Connect 服务附件(内部负载平衡器)。

在 Cloud Shell 中,执行以下操作

gcloud compute --project=$psclab 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

设置混合连接 NEG

创建 NEG 时,请使用可用区,以最大限度地缩短 Google Cloud 与本地环境或其他云环境之间的地理距离。例如,如果您在德国法兰克福的某一本地环境中托管一项服务,则可以在创建 NEG 时指定 europe-west3-a Google Cloud 可用区。

此外,如果您使用的是 Cloud Interconnect,则用于创建 NEG 的可用区应位于配置的 Cloud Interconnect 连接所在的同一区域中。

如需了解可用区域和可用区,请参阅 Compute Engine 文档:可用的区域和可用区

在 Cloud Shell 中,使用 gcloud compute network-endpoint-groups create 命令创建混合连接 NEG

gcloud compute network-endpoint-groups create on-prem-service-neg \
    --network-endpoint-type=NON_GCP_PRIVATE_IP_PORT \
    --zone=us-central1-a \
    --network=producer-vpc

在 Cloud Shell 中,将本地“IP:端口”端点添加到混合 NEG。

gcloud compute network-endpoint-groups update on-prem-service-neg \
    --zone=us-central1-a \
    --add-endpoint="ip=192.168.1.5,port=80"

配置负载平衡器

在以下步骤中,您将配置负载平衡器(转发规则)并与网络端点组相关联

在 Cloud Shell 中,创建传递给本地服务的区域性健康检查

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

在 Cloud Shell 中,为利用混合 NEG 的本地后端创建后端服务

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

在 Cloud Shell 中,将混合 NEG 后端添加到后端服务。对于 RATE,输入后端应处理的最大速率。

gcloud compute backend-services add-backend on-premise-service-backend \
    --region=us-central1 \
    --balancing-mode=RATE \
    --max-rate-per-endpoint=100 \
    --network-endpoint-group=on-prem-service-neg \
    --network-endpoint-group-zone=us-central1-a

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

gcloud compute url-maps create on-prem-svc-url-map \
    --default-service on-premise-service-backend \
    --region=us-central1

创建 HTTP 目标代理

gcloud compute target-http-proxies create proxy-subnet-us-central\
    --url-map=on-prem-svc-url-map \
    --url-map-region=us-central1 \
    --region=us-central1

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

 gcloud compute forwarding-rules create http-hybrid-neg-fwd-rule \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=producer-vpc \
      --subnet=subnet-202 \
      --address=lb-ip \
      --ports=80 \
      --region=us-central1 \
      --target-http-proxy=proxy-subnet-us-central \
      --target-http-proxy-region=us-central1

4. 验证负载平衡器

在 Cloud 控制台中,依次前往网络服务 → 负载均衡 → 负载平衡器。请注意,1 个 NEG 为“绿色”,表示对本地服务的健康检查成功

bb5d117dee3b8b04.png

选择 ‘on-premise-svc-url-map' 会生成前端 IP 地址并识别后端服务

128a7e85e8069097.png

5. 查看已学到的路线(在本地)

依次选择 VPC 网络 → 路由。请注意,学习到的本地服务子网为 192.168.1.0/27

d1ab51b79aeea9d8.png

6. 验证与本地服务的连接

在生产者 VPC 中,我们将创建一个虚拟机来测试与本地服务的连接,然后进行服务附加配置。

在 Cloud Shell 中,在生产者 VPC 中创建测试实例

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

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

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

在 Cloud Shell 中,在生产者 VPC 中创建测试实例

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

在 Cloud Shell 中使用 IAP 登录 test-box-us-central1,然后对负载平衡器 IP 地址执行 curl 命令,以验证与本地服务的连接。如果发生超时,请重试。

gcloud compute ssh test-box-us-central1 --project=$psclab --zone=us-central1-a --tunnel-through-iap

执行 curl 命令,验证与本地服务的连接。验证完毕后,退出虚拟机,返回 Cloud Shell 提示符。根据第 4 步中确定的输出替换内部负载平衡器 IP。

user@test-box-us-central1:~$ curl -v 10.20.1.2
* Expire in 0 ms for 6 (transfer 0x55b7725c10f0)
*   Trying 10.20.1.2...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55b7725c10f0)
* Connected to 10.20.1.2 (10.20.1.2) port 80 (#0)
> GET / HTTP/1.1
> Host: 10.20.1.2
> User-Agent: curl/7.64.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< content-type: text/html; charset=utf-8
< accept-ranges: bytes
< etag: "3380914763"
< last-modified: Mon, 05 Dec 2022 15:10:56 GMT
< expires: Mon, 12 Dec 2022 03:17:20 GMT
< cache-control: max-age=0
< content-length: 37
< date: Mon, 12 Dec 2022 03:17:20 GMT
< server: lighttpd/1.4.53
< via: 1.1 google
< 
Welcome to my on-premise service!!

7. 创建 Private Service Connect 服务连接

在后续步骤中,我们将创建服务附件,一旦与使用方端点配对,便可访问本地服务,而无需 VPC 对等互连。

创建服务连接

在 Cloud Shell 中创建服务附件

gcloud compute service-attachments create service-1 --region=us-central1 --producer-forwarding-rule=http-hybrid-neg-fwd-rule --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=psc-nat-subnet

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

gcloud compute service-attachments create service-1 --region=us-central1 --producer-forwarding-rule=http-hybrid-neg-fwd-rule --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=projects/<hostproject>/regions/<region>/subnetworks/<natsubnet>

验证 TCP 服务附件

gcloud compute service-attachments describe service-1 --region us-central1

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

2f84578c9f2cc361.png

选择 Service-1 可提供更多详细信息,包括使用方用于建立 Private Service Connect 的服务连接 URI。请记下 URI,因为后续步骤中会用到。

41639cb160231275.png

服务附件详情:projects/<projectname>/regions/us-central1/serviceAttachments/service-1

8. 使用方设置

创建使用方 VPC

在 Cloud Shell 中,执行以下操作

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

创建使用方子网

在 Cloud Shell 中,创建 GCE 子网

gcloud compute networks subnets create subnet-101 --project=$psclab --range=10.100.1.0/24 --network=consumer-vpc --region=us-central1

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

gcloud compute networks subnets create subnet-102 --project=$psclab --range=10.100.2.0/24 --network=consumer-vpc --region=us-central1

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

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

gcloud compute addresses create psc-consumer-ip-1 --region=us-central1 --subnet=subnet-102 --addresses 10.100.2.10

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

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

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

9. 验证使用方 Private Service Connect - 使用方 VPC

在使用方 VPC 中,依次前往 Network Services(网络服务)→ Private Service Connect(Private Service Connect)→ Connected Endpoints(已连接的端点),验证 Private Service Connect 是否已成功连接。记下建立的 psc-consumer-1 连接和我们之前创建的相应 IP 地址。

b91ee5d5c854e60b.png

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

1dbc63217819dcd5.png

10. 验证使用方 Private Service Connect - 提供方 VPC

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

951090b812a8d119.png

11. 创建专用 DNS 区域和 A 记录

创建映射到 PSC 连接端点的专用 DNS 区域,以便从 VPC 内的任何主机无缝访问生产者。

通过 Cloud Shell

gcloud dns --project=$psclab managed-zones create codelab-zone --description="" --dns-name="codelab.net." --visibility="private" --networks="consumer-vpc"

gcloud dns --project=$psclab record-sets create service1.codelab.net. --zone="codelab-zone" --type="A" --ttl="300" --rrdatas="10.100.2.10"

12. 使用虚拟机验证使用方对生产方服务的访问权限

在使用方 VPC 中,我们将创建一个虚拟机,通过访问使用方端点 service1.codelabs.net 来测试与本地服务的连接

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

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

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

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

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

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,对 DNS FQDN service1.codelab.net 执行 curl 命令,以验证与本地服务的连接。如果出现超时,请重试。

gcloud compute ssh consumer-vm --project=$psclab --zone=us-central1-a --tunnel-through-iap

执行 curl 命令,验证与本地服务的连接。验证完毕后,退出虚拟机,返回 Cloud Shell 提示

在 Cloud Shell 中执行 curl

$ curl -v service1.codelab.net
*   Trying 10.100.2.10...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x5650fc3390f0)
* Connected to service1.codelab.net (10.100.2.10) port 80 (#0)
> GET / HTTP/1.1
> Host: service1.codelab.net
> User-Agent: curl/7.64.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Content-Type: text/html; charset=utf-8
< Accept-Ranges: bytes
< ETag: "3380914763"
< Last-Modified: Mon, 05 Dec 2022 15:10:56 GMT
< Expires: Mon, 05 Dec 2022 15:15:41 GMT
< Cache-Control: max-age=0
< Content-Length: 37
< Date: Mon, 05 Dec 2022 15:15:41 GMT
< Server: lighttpd/1.4.53
< 
Welcome to my on-premise service!!

下面提供了来自本地服务的示例截图,请注意来源 IP 地址 172.16.0.13 来自代理子网范围 172.16.0.0/23

30802152f51ff751.png

13. 提供方清理

删除生产者组件

在 Cloud Shell 中,删除生产者 VPC 中的测试实例

gcloud compute instances delete test-box-us-central1 --zone=us-central1-a --quiet

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

gcloud compute forwarding-rules delete http-hybrid-neg-fwd-rule --region=us-central1 --quiet

gcloud compute target-http-proxies delete proxy-subnet-us-central --region=us-central1 --quiet

gcloud compute url-maps delete on-prem-svc-url-map --region=us-central1 --quiet

gcloud compute backend-services delete on-premise-service-backend --region=us-central1 --quiet

gcloud compute network-endpoint-groups delete on-prem-service-neg --zone=us-central1-a --quiet

gcloud compute addresses delete lb-ip --region=us-central1 --quiet

gcloud compute networks subnets delete psc-nat-subnet subnet-201 subnet-202 proxy-subnet-us-central --region=us-central1 --quiet

gcloud compute firewall-rules delete ssh-iap fw-allow-proxy-only-subnet allow-to-ingress-nat-subnet fw-allow-health-check --quiet

gcloud compute health-checks delete http-health-check --region=us-central1 --quiet

gcloud compute networks delete producer-vpc --quiet

14. 使用方清理

删除使用方组件

在 Cloud Shell 中,删除使用方 VPC 中的测试实例

gcloud compute instances delete consumer-vm --zone=us-central1-a --quiet

gcloud compute forwarding-rules delete psc-consumer-1 --region=us-central1 --quiet

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

gcloud compute networks subnets delete subnet-101 subnet-102 --region=us-central1 --quiet

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

gcloud dns record-sets delete service1.codelab.net --type=A --zone=codelab-zone --quiet

gcloud dns managed-zones delete codelab-zone --quiet 

gcloud compute networks delete consumer-vpc --quiet 

15. 恭喜

恭喜,您已成功配置并验证了使用内部 HTTP(S) 负载平衡器的 Private Service Connect。

您已创建提供方基础架构,并在提供方 VPC 中添加了指向本地服务的服务连接。您了解了如何在使用方 VPC 中创建使用方端点,以允许与本地服务建立连接。

后续操作

查看下列 Codelab…

深入阅读和视频

参考文档