1. 简介
混合策略是一种切实可行的解决方案,可让您适应不断变化的市场需求并逐步对应用进行现代化改造。Google Cloud 外部和内部 HTTP(s) 负载平衡器的混合支持将云负载均衡扩展到位于本地和其他云中的后端,是实现混合策略的关键推动因素。这可能是用于支持迁移到基于云的现代解决方案的临时混合部署,也可以是组织的 IT 基础架构的永久固定装置。

在本实验中,您将学习如何使用可从外部 HTTP (s) 全球负载平衡器访问的两个虚拟机创建网络端点组(NEG)。虽然实验中的 NEG 位于 GCP 中,但与具有 IP 可达性的公共资源或本地资源通信时,也使用相同的程序。
学习内容
- 创建自定义 VPC
- 创建两个用作网络端点组 (NEG) 的虚拟机 (VM)
- 创建混合负载平衡器、后端服务和关联的健康检查
- 创建允许访问负载平衡器的防火墙规则
- 系统将创建 Cloud Router 和 NAT,以允许从互联网更新软件包
- 验证网络端点组的可访问性
所需条件
- 负载平衡器知识
自定进度的环境设置



- 项目名称是您为此项目设置的个人标识符。只要您遵循其命名惯例,就可以使用任何名称,并且可以随时更新。
- 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且不可变(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常情况下,您无需关注该字符串。在大多数 Codelab 中,您都需要引用项目 ID(通常用
PROJECT_ID标识),因此如果您不喜欢该 ID,可以再随机生成一个 ID,也可以尝试使用自己的 ID,看看是否可用。然后,项目创建后,ID 会处于“冻结”状态。
- 接下来,您需要在 Cloud 控制台中启用结算功能,才能使用 Google Cloud 资源。
运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。请务必按照“清理”部分中的所有说明操作,该部分介绍了如何关停资源,以免产生超出本教程范围的结算费用。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。
启动 Cloud Shell
虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。
在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:

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

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。只需一个浏览器,即可完成本实验中的所有工作。
2. 准备工作
在 Cloud Shell 中,确保项目 ID 已设置
gcloud config list project gcloud config set project [YOUR-PROJECT-ID] Perform setting your projectID: projectid=YOUR-PROJECT-ID echo $projectid
3. 创建新的自定义模式 VPC 网络
在此任务中,您将创建虚拟私有云 (VPC),这是网络的基础。
VPC 网络
从 Cloud Shell
gcloud compute networks create hybrid-network-lb --subnet-mode custom
创建子网
从 Cloud Shell
gcloud compute networks subnets create network-endpoint-group-subnet --network hybrid-network-lb --range 192.168.10.0/24 --region us-west1
创建 Cloud NAT 实例
虽然混合网络不是必需的,但计算实例需要连接到互联网才能下载应用和更新。
在此任务中,您将创建一个 Cloud Router 和 NAT 实例,以允许虚拟机实例连接到互联网。
创建 Cloud Router
从 Cloud Shell
gcloud compute routers create crnat --network hybrid-network-lb --region us-west1
创建 Cloud NAT
从 Cloud Shell
gcloud compute routers nats create cloudnat --router=crnat --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges --enable-logging --region us-west1
4. 创建两个虚拟机实例
在此任务中,您将创建两个运行 Apache 的虚拟机实例。在实验的后续部分,这些虚拟机实例将成为网络端点组 (NEG)。
在 Cloud Shell 中,创建第一个本地实例 on-prem-neg-1
gcloud compute instances create on-prem-neg-1 \
--zone=us-west1-a \
--tags=allow-health-check \
--image-family=debian-9 \
--image-project=debian-cloud \
--subnet=network-endpoint-group-subnet --no-address \
--metadata=startup-script='#! /bin/bash
apt-get update
apt-get install apache2 -y
a2ensite default-ssl
a2enmod ssl
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
filter="{print \$NF}"
vm_zone="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/zone \
| awk -F/ "${filter}")"
echo "Page on $vm_hostname in $vm_zone" | \
tee /var/www/html/index.html
systemctl restart apache2'
在 Cloud Shell 中,创建第一个本地实例 on-prem-neg-2
gcloud compute instances create on-prem-neg-2 \
--zone=us-west1-a \
--tags=allow-health-check \
--image-family=debian-9 \
--image-project=debian-cloud \
--subnet=network-endpoint-group-subnet --no-address \
--metadata=startup-script='#! /bin/bash
apt-get update
apt-get install apache2 -y
a2ensite default-ssl
a2enmod ssl
vm_hostname="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/name)"
filter="{print \$NF}"
vm_zone="$(curl -H "Metadata-Flavor:Google" \
http://169.254.169.254/computeMetadata/v1/instance/zone \
| awk -F/ "${filter}")"
echo "Page on $vm_hostname in $vm_zone" | \
tee /var/www/html/index.html
systemctl restart apache2'
5. 创建包含本地端点的 NEG
首先,创建名为 on-prem-neg-1 和 on-prem-neg-2 的 NEG。您还将指定,出于路由和负载均衡目的,负载平衡器应将这些端点视为位于 us-west1-a GCP 可用区中。我们建议,配置的可用区应与互连连接/VPN 网关的区域关联的任何可用区相对应,以便进行基于邻近性的负载均衡测量,从而实现负载均衡。
在 Cloud Shell 中创建 on-prem-neg-1
gcloud compute network-endpoint-groups create on-prem-neg-1 \
--network-endpoint-type NON_GCP_PRIVATE_IP_PORT \
--zone "us-west1-a" \
--network hybrid-network-lb
在 Cloud Shell 中创建 on-prem-neg-2
gcloud compute network-endpoint-groups create on-prem-neg-2 \
--network-endpoint-type NON_GCP_PRIVATE_IP_PORT \
--zone "us-west1-a" \
--network hybrid-network-lb
在此 Codelab 中,网络端点组是 GCP 中运行 Apache 的 GCE 实例。或者,您也可以将本地端点或互联网端点指定为网络端点
在 Cloud Shell 中,确定 GCE IP 地址
gcloud compute instances list | grep -i on-prem
将网络端点组与上一步中之前确定的 GCE 实例 IP 地址相关联;对于每个 NEG,on-prem-neg-1 & on-prem-neg-2.
在 Cloud Shell 中关联 on-prem-neg-1,将 x.x.x.x 更新为您确定的 IP
gcloud compute network-endpoint-groups update on-prem-neg-1 \
--zone="us-west1-a" \
--add-endpoint="ip=x.x.x.x,port=80"
在 Cloud Shell 中,关联本地 neg-2,将 x.x.x.x 更新为您确定的 IP
gcloud compute network-endpoint-groups update on-prem-neg-2 \
--zone="us-west1-a" \
--add-endpoint="ip=x.x.x.x,port=80"
6. 创建 HTTP 健康检查、后端服务和防火墙
在此步骤中,您将创建一个名为 on-prem-backend-service 的全局后端服务。此后端服务定义了数据平面将如何向 NEG 发送流量。
首先,创建一个名为 on-prem-health-check 的健康检查,以监控属于此 NEG 的任何端点(即您的本地端点)的健康状况。
从 Cloud Shell
gcloud compute health-checks create http on-prem-health-check
创建名为 on-prem-backend-service 的本地后端服务,并将其与健康检查相关联。
从 Cloud Shell
gcloud compute backend-services create on-prem-backend-service \
--global \
--load-balancing-scheme=EXTERNAL \
--health-checks on-prem-health-check
HTTP(S) 外部负载平衡器和后端会执行源自 35.191.0.0/16 和 130.211.0.0/22 子网的健康检查;因此,需要一条防火墙规则来允许负载平衡器到后端的路由。
从 Cloud Shell
gcloud compute firewall-rules create fw-allow-health-check \
--network=hybrid-network-lb \
--action=allow \
--direction=ingress \
--source-ranges=130.211.0.0/22,35.191.0.0/16 \
--target-tags=allow-health-check \
--rules=tcp:80
7. 关联 NEG 和后端服务
将 on-prem-neg-1 NEG 添加到此后端服务
从 Cloud Shell
gcloud compute backend-services add-backend on-prem-backend-service \
--global \
--network-endpoint-group on-prem-neg-1 \
--network-endpoint-group-zone us-west1-a \
--balancing-mode RATE \
--max-rate-per-endpoint 5
将 on-prem-neg-2 NEG 添加到此后端服务
从 Cloud Shell
gcloud compute backend-services add-backend on-prem-backend-service \
--global \
--network-endpoint-group on-prem-neg-2 \
--network-endpoint-group-zone us-west1-a \
--balancing-mode RATE \
--max-rate-per-endpoint 5
预留用于访问网络端点的 IPv4 静态 IP 地址
从 Cloud Shell
gcloud compute addresses create hybrid-lb-ip --project=$projectid --global
我们已完成 CLI 配置。我们来完成 Cloud 控制台中的配置。
8. 创建外部 HTTP 负载平衡器并关联后端服务
在 Cloud 控制台中,依次前往“负载均衡”和“创建负载平衡器”
找到 HTTP(S) 负载均衡,然后点击“开始配置”

根据以下屏幕截图,选择“从互联网到我的虚拟机”,以允许公开访问您的虚拟机

提供“xlb”作为负载平衡器的名称,然后根据提供的屏幕截图选择之前创建的本地后端服务“on-prem-backend-service”,然后选择“确定”

选择前端配置,更新名称“xlb-fe”,然后选择之前创建的静态 IPv4 地址,确保与提供的屏幕截图保持一致 
选择“检查并完成”,确保与提供的屏幕截图一致,然后选择“创建”

后端健康状况验证
在 Cloud 控制台中,确保后端“xlb”处于健康状态,如提供的屏幕截图所示,为绿色

9. 验证 NEG 是否可从互联网访问
请注意,创建负载平衡器时使用的外部静态 IP 地址现在是网络端点的前端 IP 地址。在执行最终测试之前,我们先验证一下 IP 地址。
从 Cloud Shell
gcloud compute forwarding-rules describe xlb-fe --global | grep -i IPAddress:
输出(您的 IP 地址会有所不同)
Cloudshell 的输出
$ gcloud compute forwarding-rules describe xlb-fe --global | grep -i IPAddress: IPAddress: 34.96.103.132
使用全球负载平衡器前端 IP 地址,您可以访问网络端点后端。请注意,在此 Codelab 中,端点是 GCE 实例,但您也可以将其与本地端点搭配使用。
在本地工作站中,启动终端并对负载平衡器 IP 地址执行 curl 操作
在工作站上,针对前端 IP 地址执行 curl 命令。观察 200 OK 响应,以及包含 NEG 实例名称和区域的网页详细信息。
myworkstation$ curl -v 34.96.103.132
* Trying 34.96.103.132...
* TCP_NODELAY set
* Connected to 34.96.103.132 (34.96.103.132) port 80 (#0)
> GET / HTTP/1.1
> Host: 34.96.103.132
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Tue, 10 Aug 2021 01:21:54 GMT
< Server: Apache/2.4.25 (Debian)
< Last-Modified: Tue, 10 Aug 2021 00:35:41 GMT
< ETag: "24-5c929ae7384f4"
< Accept-Ranges: bytes
< Content-Length: 36
< Content-Type: text/html
< Via: 1.1 google
<
Page on on-prem-neg-2 in us-west1-a
* Connection #0 to host 34.96.103.132 left intact
* Closing connection 0
恭喜!您已成功部署了具有 NEG 的 L7 混合负载平衡器
恭喜您完成此 Codelab!
所学内容
- 创建自定义 VPC
- 创建两个用作网络端点组 (NEG) 的虚拟机 (VM)
- 创建混合负载平衡器、后端服务和关联的健康检查
- 创建允许访问负载平衡器的防火墙规则
- 验证网络端点组的可访问性
10. 清理步骤
在 Cloud 控制台界面中,找到并勾选“xlb”负载平衡器,然后依次选择“网络服务”→“负载均衡”,以删除该负载平衡器。选择后,勾选“本地后端服务”和“本地健康检查”,然后选择“删除”

在 Cloud 控制台界面中,依次前往 Compute Engine → 网络端点组。选择后,勾选“on-prem-neg-1”和“on-prem-neg-2”,然后选择“删除”

从 Cloud Shell 中删除实验组件
gcloud compute routers nats delete cloudnat --router=crnat --region us-west1 --quiet gcloud compute routers delete crnat --region us-west1 --quiet gcloud compute instances delete on-prem-neg-1 --zone=us-west1-a --quiet gcloud compute instances delete on-prem-neg-2 --zone=us-west1-a --quiet gcloud compute firewall-rules delete fw-allow-health-check --quiet gcloud compute networks subnets delete network-endpoint-group-subnet --region=us-west1 --quiet gcloud compute networks delete hybrid-network-lb --quiet gcloud compute addresses delete hybrid-lb-ip --global --quiet