使用 Private Service Connect 和混合 NEG TCP 代理通过混合网络连接到本地服务

1. 简介

借助采用混合连接的内部区域级 TCP 代理负载平衡器,您可以允许 VPC 网络中的客户端使用托管在本地或其他云环境中的服务。

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

构建内容

在此 Codelab 中,您将使用网络端点组构建一个内部 TCP 代理负载平衡器,与本地服务进行混合连接。消费者 VPC 将能够与本地服务进行通信。

a4fa0e406e7232fa.png

学习内容

  • 如何使用混合 NEG 后端服务创建 TCP 代理 ILB
  • 如何建立 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

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

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. Producer 设置

创建提供方 VPC

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

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

创建 Producer 子网

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

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

创建 TCP 代理子网

代理分配在 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 Service 连接(内部负载平衡器)。

在 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

创建入站防火墙规则,允许本地服务与端口 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 与本地或其他云环境之间的地理距离的 ZONE。例如,如果您要在德国法兰克福的本地环境中托管服务,则可以在创建 NEG 时指定 europe-west3-a Google Cloud 可用区。

此外,如果您使用的是 Cloud Interconnect,则用于创建 NEG 的 ZONE 应该位于配置了 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 tcp on-prem-service-hc \
    --region=us-central1 \
    --use-serving-port

在 Cloud Shell 内为本地后端创建后端服务

gcloud compute backend-services create on-premise-service-backend \
   --load-balancing-scheme=INTERNAL_MANAGED \
   --protocol=TCP \
   --region=us-central1 \
   --health-checks=on-prem-service-hc \
   --health-checks-region=us-central1

在 Cloud Shell 内,将混合 NEG 后端添加到后端服务。对于 MAX_CONNECTIONS,输入后端应处理的并发连接数上限。

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

在 Cloud Shell 中创建目标代理

gcloud compute target-tcp-proxies create on-premise-svc-tcpproxy \
   --backend-service=on-premise-service-backend \
   --region=us-central1

在 Cloud Shell 内创建转发规则 (ILB)

使用 gcloud computeforward-rules create 命令创建转发规则。

将 FWD_RULE_PORT 替换为 1-65535 中的一个端口号。转发规则仅转发具有匹配目标端口的数据包。

gcloud compute forwarding-rules create tcp-ilb-psc \
   --load-balancing-scheme=INTERNAL_MANAGED \
   --network=producer-vpc \
   --subnet=subnet-201 \
   --ports=80 \
   --region=us-central1 \
   --target-tcp-proxy=on-premise-svc-tcpproxy \
   --target-tcp-proxy-region=us-central1

获取内部负载平衡器的 IP 地址

gcloud compute forwarding-rules describe tcp-ilb-psc --region=us-central1 | grep -i IPAddress:

Example output:
gcloud compute forwarding-rules describe tcp-ilb-psc --region=us-central1 | grep -i IPAddress:
IPAddress: 10.10.1.2

4. 验证负载平衡器

在 Cloud Console 中,导航到网络服务 → 负载均衡 → 负载平衡器。请注意,1 个 NEG 为绿色,表示已成功对本地服务进行健康检查

c16a93d1e185336b.png

选择“on-prem-service-backend”‘on-premise-service-backend'会生成前端 IP 地址

26db2d30747fd40a

5. 查看从本地获知的路由

导航到 VPC 网络 → 路由。请注意,已知本地服务子网 192.168.1.0/27

bae85fdc418f9811.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 访问的所有虚拟机实例。
  • 允许来自 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 提示符。根据在第 3 步和第 4 步中确定的输出替换内部负载平衡器 IP。

deepakmichael@test-box-us-central1:~$ curl -v 10.10.1.2
* Expire in 0 ms for 6 (transfer 0x55b9a6b2f0f0)
*   Trying 10.10.1.2...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55b9a6b2f0f0)
* Connected to 10.10.1.2 (10.10.1.2) port 80 (#0)
> GET / HTTP/1.1
> Host: 10.10.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, 05 Dec 2022 15:42:38 GMT
< Cache-Control: max-age=0
< Content-Length: 37
< Date: Mon, 05 Dec 2022 15:42:38 GMT
< Server: lighttpd/1.4.53
< 
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=tcp-ilb-psc --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=psc-nat-subnet

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

gcloud compute service-attachments create service-1 --region=us-central1 --producer-forwarding-rule=tcp-ilb-psc --connection-preference=ACCEPT_AUTOMATIC --nat-subnets=projects/<hostproject>/regions/<region>/subnetworks/<natsubnet>

验证 TCP 服务连接

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

8. 可选:导航到“网络服务”→“Private Service Connect”,以查看新建立的服务连接

bddc23a10d38d981.png

选择 Service-1 可提供更多详细信息,包括使用方用于建立专用服务连接的服务连接 URI。记下该 URI,稍后的步骤中会用到它。

5c0a74874536909d

服务连接详情:projects/<项目名称>/regions/us-central1/serviceAttachments/service-1

9. 消费者设置

创建使用方 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

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

在使用方 VPC 中,导航到网络服务 → Private Service Connect→ 已连接的端点,以验证专用服务连接是否成功。请注意已建立的 psc-consumer-1 连接以及我们之前创建的相应 IP 地址。

629d4cea87293a42

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

18b132b458f698b4

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

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

3387b170742d7d8d

12. 创建专用 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"

13. 使用虚拟机验证使用方对提供方服务的访问权限

在使用方 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 访问的所有虚拟机实例。
  • 允许来自 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 登录使用方虚拟机,通过对 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.2 来自 TCP 代理子网范围 172.16.0.0/23)

6dafe24917c937cb

14. Producer 清理

删除 Producer 组件

在 Cloud Shell 中,删除提供方组件

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 tcp-ilb-psc --region=us-central1 --quiet

gcloud compute target-tcp-proxies delete on-premise-svc-tcpproxy --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 networks subnets delete psc-nat-subnet subnet-201 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 on-prem-service-hc --region=us-central1 --quiet

gcloud compute networks delete producer-vpc --quiet

15. 消费者清理

删除使用方组件

在 Cloud Shell 中,删除使用方组件

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 

16. 恭喜

恭喜,您已成功配置并验证 Private Service Connect with TCP 代理。

您创建了提供方基础架构,并在提供方 VPC 中添加了一个指向本地服务的服务连接。您学习了如何在使用方 VPC 中创建允许连接到本地服务的使用方端点。

后续操作

查看下列 Codelab…

补充阅读材料和视频

参考文档