将网络负载平衡器从目标池转换为区域级后端服务

1. 简介

本指南介绍如何将现有网络负载平衡器从目标池后端转换为区域级后端服务。

学习内容

  • 了解区域级后端服务的优势
  • 创建包含目标池的网络负载平衡器
  • 执行目标池验证
  • 使用非代管实例组创建区域级后端服务
  • 执行目标池到后端服务的迁移
  • 执行后端服务验证

所需条件

  • 有使用负载平衡器的经验

2. 用于网络负载均衡的区域级后端服务概览

借助网络负载均衡,Google Cloud 客户可以利用功能强大的工具,在 Google Cloud 区域内的虚拟机之间分配外部流量。为了让我们的客户更轻松地管理传入流量并控制负载平衡器的行为,我们最近向网络负载均衡添加了对后端服务的支持。这有助于客户在其部署中提高规模、速度、性能和弹性 - 一切都可通过易于管理的方式实现。

我们现在通过网络负载均衡为后端服务提供支持,这是与之前的方法目标池相比的显著增强。后端服务定义了我们的负载平衡器如何将传入流量分配到连接的后端,并精细控制负载平衡器的行为。

3. 区域级后端服务的优势

选择区域级后端服务作为负载平衡器可为您的环境带来许多优势。

267db35a58145be

从本质上讲,区域级后端服务提供以下功能:

  • 通过统一健康检查实现高准确度的健康检查 - 借助区域性后端服务,您现在可以充分利用负载均衡健康检查功能,从旧版 HTTP 健康检查中解放出来。出于合规性原因,支持自定义请求和响应字符串或 HTTPS 的 TCP 健康检查是网络负载均衡客户的常见请求。
  • 故障切换组可提升弹性 - 故障切换组让您可以将一个实例组指定为主要实例组,将另一个实例组指定为辅助实例组,并在活跃实例组中的实例健康状况低于特定阈值时对流量进行故障切换。为了更好地控制故障切换机制,您可以使用 keepalivedpacemaker 等代理,并可根据后端实例状态的变化公开运行良好或失败的健康检查。
  • 代管式实例组实现可伸缩性和高可用性 - 区域后端服务支持将代管式实例组用作后端。您现在可以为后端虚拟机实例指定模板,并利用根据 CPU 利用率或其他监控指标自动扩缩的功能。

除了上述各项外,您还可以利用连接排空功能来开发面向连接的协议 (TCP),并缩短大型部署的编程时间。

Codelab 网络拓扑

本指南介绍如何将现有网络负载平衡器从目标池后端转换为区域级后端服务。

通过迁移到区域级后端服务,您可以利用非旧版健康检查(适用于 TCP、SSL、HTTP、HTTPS 和 HTTP/2)、代管式实例组、连接排空故障切换政策等功能。

本指南逐步介绍了如何将以下示例基于目标池的网络负载平衡器转换为使用区域级后端服务

b2ac8a09e53e27f8.png

之前:使用目标池进行网络负载均衡

基于后端服务的网络负载平衡器部署将如下所示。

f628fdad64c83af3.png

之后:使用区域级后端服务实现网络负载均衡

此示例假设您有一个基于目标池的传统网络负载平衡器,在 us-central-1a 可用区中有两个实例,在 us-central-1c 可用区中有两个实例。

这一转换所需的简要步骤如下:

  1. 将目标池实例划分为多个实例组。后端服务仅适用于代管式或非代管式实例组。请注意,虽然可以放入单个目标池的实例数量没有限制,但实例组有大小上限。如果目标池的实例数量超过此上限,则您需要将其后端拆分到多个实例组中。如果您的现有部署包含备用目标池,请为这些实例创建一个单独的实例组。此实例组将配置为故障切换组。
  2. 创建区域后端服务。如果您的部署包含备用目标池,则您需要在创建后端服务时指定故障切换比率。此值应与之前为目标池部署配置的故障切换比率一致。
  3. 将实例组(之前创建)添加到后端服务。如果您的部署包含备用目标池,请在将相应的故障切换实例组添加到后端服务时,为其添加“-故障切换”标志。
  4. 配置指向新后端服务的转发规则。您有 2 种选择:
  • (推荐)更新现有转发规则以指向后端服务。或
  • 创建指向后端服务的新转发。这需要您为负载平衡器的前端创建新的 IP 地址。然后修改您的 DNS 设置,以便从基于目标池的旧负载平衡器的 IP 地址无缝转换为新的 IP 地址。

自定进度的环境设置

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

96a9c957bc475304

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

请记住项目 ID,它在所有 Google Cloud 项目中都是唯一的名称(上述名称已被占用,您无法使用,抱歉!)。它稍后将在此 Codelab 中被称为 PROJECT_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 中运行,大大增强了网络性能和身份验证功能。只需一个浏览器,即可完成本实验中的所有工作。

登录 Cloudshell 并设置您的项目 ID

gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]

Perform setting your projectID:
projectid=YOUR-PROJECT-ID

echo $projectid

4. 创建 VPC 网络

VPC 网络

通过 Cloud Shell

gcloud compute networks create network-lb --subnet-mode custom

创建子网

通过 Cloud Shell

gcloud compute networks subnets create network-lb-subnet \
        --network network-lb --range 10.0.0.0/24 --region us-central1

创建防火墙规则

通过 Cloud Shell

gcloud compute --project=$projectid firewall-rules create www-firewall-network-lb --direction=INGRESS --priority=1000 --network=network-lb --action=ALLOW --rules=tcp:80 --source-ranges=0.0.0.0/0 --target-tags=network-lb-tag

创建非托管实例

在每个可用区中创建实例 2 个实例,us-central1-a 和us-central1-c

在 Cloud Shell 中创建实例 1

gcloud compute instances create www1 \
--subnet network-lb-subnet \
--image-family debian-9 \
--image-project debian-cloud \
--zone us-central1-a \
--tags network-lb-tag \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo service apache2 restart
echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"

通过 Cloud Shell 创建实例 2

gcloud compute instances create www2 \
--subnet network-lb-subnet \
--image-family debian-9 \
--image-project debian-cloud \
--zone us-central1-a \
--tags network-lb-tag \
--metadata startup-script="#! /bin/bash
sudo apt-get update
sudo apt-get install apache2 -y
sudo service apache2 restart 
echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html"

在 Cloud Shell 中创建实例 3

gcloud compute instances create www3 \
--subnet network-lb-subnet \
--image-family debian-9 \
--image-project debian-cloud \
--zone us-central1-c \
--tags network-lb-tag \
--metadata startup-script="#! /bin/bash
sudo apt-get update 
sudo apt-get install apache2 -y 
sudo service apache2 restart 
echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html"

通过 Cloud Shell 创建实例 4

gcloud compute instances create www4 \
--subnet network-lb-subnet \
--image-family debian-9 \
--image-project debian-cloud \
--zone us-central1-c \
--tags network-lb-tag \
--metadata startup-script="#! /bin/bash
sudo apt-get update 
sudo apt-get install apache2 -y 
sudo service apache2 restart
echo '<!doctype html><html><body><h1>www4</h1></body></html>' | tee /var/www/html/index.html"

创建一条防火墙规则以允许外部流量进入这些虚拟机实例

通过 Cloud Shell

gcloud compute --project=$projectid firewall-rules create www-firewall-network-lb --direction=INGRESS --priority=1000 --network=network-lb --action=ALLOW --rules=tcp:80 --source-ranges=0.0.0.0/0 --target-tags=network-lb-tag

为负载平衡器创建静态外部 IP 地址

通过 Cloud Shell

gcloud compute addresses create network-lb-ip-1 \
    --region us-central1

添加旧版 HTTP 健康检查资源

通过 Cloud Shell

gcloud compute http-health-checks create basic-check

5. 创建转发规则和目标池

创建目标池

gcloud compute target-pools create www-pool \
            --region us-central1 --http-health-check basic-check

将您的实例添加到目标池 us-central1-a

gcloud compute target-pools add-instances www-pool \
--instances www1,www2 \
--instances-zone us-central1-a

将您的实例添加到目标池 (us-central1-c)

gcloud compute target-pools add-instances www-pool \
--instances www3,www4 \
--instances-zone us-central1-c

添加转发规则

gcloud compute forwarding-rules create www-rule \
--region us-central1 \
--ports 80 \
--address network-lb-ip-1 \
--target-pool www-pool

验证目标池的功能

依次选择“负载平衡器”→“前端 (www-rule)”,确定前端 IP 地址

从工作站终端使用 curl 命令访问外部 IP 地址,并观察四个目标实例之间的负载均衡情况。验证完毕后关闭终端。

while true; do curl -m1 IP_ADDRESS; done

6. 将网络负载平衡器从目标池转换为后端服务

为后端服务创建统一的健康检查

gcloud compute health-checks create tcp my-tcp-health-check --port 80 --region us-central1

通过目标池中的现有实例创建实例组

gcloud compute --project=$projectid instance-groups unmanaged create www-instance-group-central1a --zone=us-central1-a

gcloud compute --project=$projectid instance-groups unmanaged add-instances www-instance-group-central1a --zone=us-central1-a --instances=www1,www2

通过目标池中的现有实例创建实例组

gcloud compute --project=$projectid instance-groups unmanaged create www-instance-group-central1c --zone=us-central1-c

gcloud compute --project=$projectid instance-groups unmanaged add-instances www-instance-group-central1c --zone=us-central1-c --instances=www3,www4

创建后端服务并将其与新创建的健康检查相关联

gcloud compute backend-services create my-backend-service --region us-central1 --health-checks my-tcp-health-check --health-checks-region us-central1 --load-balancing-scheme external

配置后端服务并添加实例组

gcloud compute backend-services add-backend my-backend-service --instance-group www-instance-group-central1a --instance-group-zone us-central1-a --region us-central1

gcloud compute backend-services add-backend my-backend-service --instance-group www-instance-group-central1c --instance-group-zone us-central1-c --region us-central1

更新现有转发规则以支持后端服务

记下转发规则名称“www-rule”和关联的 IP 地址:

依次选择“负载平衡器”→“前端”

此外,我们介绍了

选择负载平衡器 → 选择“www-pool”

通过更新现有转发规则将流量路由到后端服务

gcloud compute forwarding-rules set-target www-rule --region=us-central1 --backend-service my-backend-service --region us-central1

验证负载平衡器“www-pool”不再使用前端“www-rule”进行配置(参见下面的屏幕截图)

选择负载平衡器 → www-pool

9a393b3ca4e0942c

验证前端转发规则现在是否与负载平衡器“my-backend-service”相关联

依次选择“负载平衡器”→“前端”

注意规则名称“www-rule”保留 IP 地址且负载平衡器“my-backend-service”目前正在使用中

从工作站终端使用 curl 命令访问外部 IP 地址,并观察新关联的后端服务之间的负载均衡情况。验证完毕后关闭终端。

while true; do curl -m1 IP_ADDRESS; done

7. 清理步骤

gcloud compute forwarding-rules delete www-rule --region=us-central1 --quiet
 
gcloud compute backend-services delete my-backend-service --region us-central1 --quiet
 
gcloud compute target-pools delete www-pool --region us-central1 --quiet
 
gcloud compute addresses delete network-lb-ip-1 --region us-central1 --quiet

gcloud compute firewall-rules delete www-firewall-network-lb --quiet
 
gcloud compute instances delete www4 --zone us-central1-c --quiet
 
gcloud compute instances delete www3 --zone us-central1-c --quiet
 
gcloud compute instances delete www2 --zone us-central1-a --quiet

gcloud compute instances delete www1 --zone us-central1-a --quiet
 
gcloud compute networks subnets delete network-lb-subnet --region us-central1 --quiet

gcloud compute networks delete network-lb --quiet

gcloud compute instance-groups unmanaged delete www-instance-group-central1a --zone us-central1-a --quiet

gcloud compute instance-groups unmanaged delete www-instance-group-central1c --zone us-central1-c --quiet

8. 恭喜!

恭喜您完成此 Codelab。

所学内容

  • 了解区域级后端服务的优势
  • 创建包含目标池的网络负载平衡器
  • 执行目标池验证
  • 使用非代管实例组创建区域级后端服务
  • 执行目标池到后端服务的迁移
  • 执行后端服务验证