使用 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 的可用区应位于配置的互连连接所在的同一区域中。

如需了解可用区域和可用区,请参阅 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,输入后端应处理的最大 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

可选:依次前往网络服务 → Private Service Connect ,查看新建立的服务连接

2f84578c9f2cc361.png

选择 Service-1 可提供更多详细信息,包括使用方用于建立 Private Service Connection 的服务连接 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”中,依次前往网络服务 → Private Service Connect → 已连接的端点 ,验证 Private Service Connection 是否成功。 请注意已建立的 psc-consumer-1 连接以及我们之前创建的相应 IP 地址。

b91ee5d5c854e60b.png

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

1dbc63217819dcd5.png

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

在“提供方 VPC”中,依次前往网络服务 → Private Service Connect → 已发布的服务 ,验证 Private Service Connection 是否成功。请注意,已发布的 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…

延伸阅读和视频

参考文档