使用外部 HTTP(s) 混合负载平衡器访问网络端点组

1. 简介

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

3312e69c63b02f73

在本实验中,您将学习如何使用两台可通过外部 HTTP (s) 全球负载平衡器访问的虚拟机来创建网络端点组(NEG)。虽然本实验中的 NEG 在 GCP 内,但此过程与具有 IP 可达性的公共资源或本地资源进行通信。

学习内容

  • 创建自定义 VPC
  • 创建两个用作网络端点组 (NEG) 的虚拟机 (VM)
  • 创建混合负载平衡器、后端服务和关联的健康检查
  • 创建允许访问负载平衡器的防火墙规则
  • 将创建 Cloud Router 路由器和 NAT,以允许来自互联网的软件包更新
  • 验证网络端点组可达性

所需条件

  • 了解负载平衡器

自定进度的环境设置

  1. 登录 Cloud 控制台,然后创建一个新项目或重复使用现有项目。 如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个

96a9c957bc475304

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

  • 项目名称是您用于该项目的个人标识符。您完全可以使用任何名称,只要遵循其命名惯例即可。
  • 项目 ID 在所有 Google Cloud 项目中必须是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常您不在乎这是什么在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为 PROJECT_ID),因此,如果您不喜欢它,可以随机生成一个 ID;或者,您也可以尝试自己的项目 ID,看看它是否可用。然后,它会“冻结”创建项目后
  1. 接下来,您需要在 Cloud 控制台中启用结算功能,才能使用 Google Cloud 资源。

运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。请务必按照“清理”部分部分,其中会指导您如何关停资源,以免产生超出本教程范围的结算费用。Google Cloud 的新用户符合参与 300 美元的免费试用计划的条件。

启动 Cloud Shell

虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。

在 GCP 控制台中,点击右上角工具栏上的 Cloud Shell 图标:

bce75f34b2c53987.png

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

f6ef2b5f13479f3a.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 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。您还需要指定 LB 应考虑这些端点位于 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 地址;每个否定关键字on-prem-neg-1 & on-prem-neg-2.

在 Cloud Shell 中,关联 on-prem-neg-1,使用您识别的 IP 更新 x.x.x.x

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 中,关联 on-prem-neg-2,使用您识别的 IP 更新 x.x.x.x

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 Console 导航到负载均衡并选择“创建负载平衡器”

找出 HTTP(S) 负载均衡并点击“开始配置”

70ccd168957e89d9

选择“从互联网到我的虚拟机”如下面的屏幕截图所示,允许公开访问您的虚拟机

a55cd31dbeadfecc.png

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

f1589df43bf9e3e8.png

选择“前端配置”,更新名称“xlb-fe”并选择之前创建的静态 IPv4 地址,确保镜像提供的屏幕截图 b47cd48c7c1ccfc3.png

选择“检查并最终确定”与提供的屏幕截图一致,然后选择“创建”

bfa39f7dc3ad91e1.png

后端健康状况验证

在 Cloud 控制台中,确保后端“xlb”运行状况良好,根据提供的屏幕截图为绿色

131bbfc955d6166c

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 以及包含否定关键字实例名称和区域的网页详细信息。

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”负载平衡器,然后通过“网络服务”→“负载均衡”选择“删除”。选择后,勾选“本地后端服务”&amp;‘on-premise-health-check&#39;然后选择“删除”

53d7463fe354fe66

在 Cloud 控制台界面中,前往 Compute Engine → 网络端点组。选择后,勾选“on-prem-neg-1”&amp;‘on-prem-neg-2&#39;然后选择“删除”

4d8f04264b44d03c

从 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