1. 简介
您可以使用加权负载均衡,根据 HTTP 健康检查报告的权重,将网络负载平衡器配置为在负载平衡器的后端实例之间分配流量。
加权负载均衡要求您配置以下两项:
- 您必须将后端服务的位置负载平衡器政策 (localityLbPolicy) 设置为 WEIGHTED_MAGLEV。
- 您必须使用 HTTP/HTTP2/HTTPS 健康检查来配置后端服务。HTTP 健康检查响应必须包含自定义 HTTP 响应标头字段 X-Load-Balancing-Endpoint-Weight,以便为每个后端实例指定 0 到 1000 之间整数值(以十进制数表示)的权重。
如果您将同一实例组用作使用加权负载均衡的多个基于后端服务的网络负载平衡器的后端,则建议为后端服务的每个健康检查使用唯一的请求路径。如需了解详情,请参阅 HTTP、HTTPS 和 HTTP/2 健康检查的成功标准。
如果健康检查通过,并且后端实例被视为健康状况良好,则 HTTP 健康检查应返回 HTTP 200 (OK) 响应。如果所有后端实例都通过了健康检查并返回权重为零的 X-Load-Balancing-Endpoint-Weight ,则负载平衡器会在健康状况良好的后端之间分配新连接,并将它们视为相同的权重。负载平衡器还可以在健康状况不佳的后端之间分配新连接。如需了解详情,请参阅流量分配。
如需查看加权负载均衡的示例,请参阅后端选择和连接跟踪。
加权负载均衡适用于以下情况:
- 如果某些连接处理的数据比其他连接多,或者某些连接的存在时间比其他连接长,则后端负载分配可能会变得不均匀。通过发出信号较低的实例权重,具有高负载的实例可以减少其新连接所占的份额,同时它将继续提供服务现有连接。
- 如果后端过载,分配更多连接可能会中断现有连接,那么此类后端向自身分配零权重。通过发出权重零的信号,后端实例会停止服务新的连接,但仍为现有连接提供服务。
- 如果后端在维护前排空现有连接,则不会为其自身分配零权重。通过发出权重零的信号,后端实例会停止服务新的连接,但仍为现有连接提供服务。
学习内容
- 如何使用加权负载均衡来配置网络负载平衡器,以根据 HTTP 健康检查报告的权重在负载平衡器的后端实例之间分配流量。
自定进度的环境设置
- 登录 Google Cloud 控制台,然后创建一个新项目或重复使用现有项目。如果您还没有 Gmail 或 Google Workspace 账号,则必须创建一个。
- 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
- 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常您不在乎这是什么在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为
PROJECT_ID
)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且该 ID 在项目期间会一直保留。 - 此外,还有第三个值,即某些 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档。
- 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。如需关停资源,以免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除整个项目。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。
启动 Cloud Shell
虽然可以通过笔记本电脑对 Google Cloud 进行远程操作,但在此 Codelab 中,您将使用 Google Cloud Shell,这是一个在云端运行的命令行环境。
在 Google Cloud 控制台 中,点击右上角工具栏中的 Cloud Shell 图标:
预配和连接到环境应该只需要片刻时间。完成后,您应该会看到如下内容:
这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。您在此 Codelab 中的所有工作都可以在浏览器中完成。您无需安装任何程序。
2. 开始配置
Codelab 需要单个项目。
在本教程中,您将创建一个包含三个虚拟机实例的实例组,并为每个实例分配权重。您将创建 HTTP 健康检查来报告后端实例权重。已对后端服务启用加权网络负载平衡器,且局部负载平衡器政策为 WEIGHTED_MAGLEV。
准备工作
- 阅读基于后端服务的外部网络负载均衡概览。
- 安装 Google Cloud CLI。如需全面了解此工具,请参阅 gcloud CLI 概览。您可以在 API 和 gcloud CLI 参考中找到与负载均衡相关的命令。如果您之前没有运行过 Google Cloud CLI,请先运行 gcloud init 进行身份验证。
- 启用 Compute API。
gcloud services enable compute.googleapis.com
注意:您无法使用 Google Cloud 控制台来配置位置负载平衡器政策,以及为虚拟机实例分配权重。请改用 Google Cloud CLI。
创建 VPC 网络、子网和防火墙规则
创建 VPC 网络、子网和入站流量允许防火墙规则,以允许连接到负载平衡器的后端虚拟机。
- 创建 VPC 网络和子网。a.如需创建 VPC 网络,请运行
gcloud compute networks create
命令:
gcloud compute networks create NETWORK_NAME --subnet-mode custom
b. 在此示例中,子网的主要 IPv4 地址范围为 10.10.0.0/24
。
如需创建子网,请运行 gcloud compute networks subnets create
命令:
gcloud compute networks subnets create SUBNET_NAME \ --network=NETWORK_NAME \ --range=10.10.0.0/24 \ --region=us-central1
替换以下内容:
NETWORK_NAME
:要创建的 VPC 网络的名称。SUBNET_NAME
:要创建的子网的名称。
- 创建入站允许防火墙规则,允许发送到目标 TCP 端口 80 和 443 的数据包传送到后端虚拟机。在此示例中,防火墙规则允许来自任何来源 IP 地址的连接。防火墙规则适用于网络标记为
network-lb-tag
的虚拟机。如需创建防火墙规则,请运行gcloud compute firewall-rules create
命令:
gcloud compute firewall-rules create FIREWALL_RULE_NAME \ --direction=INGRESS \ --priority=1000 \ --network=NETWORK_NAME \ --action=ALLOW \ --rules=tcp:80,tcp:443 \ --source-ranges=0.0.0.0/0 \ --target-tags=network-lb-tag
将 FIREWALL_RULE_NAME
替换为要创建的防火墙规则的名称。
创建虚拟机实例并分配权重
创建三个虚拟机实例并分配权重:
- 配置三个后端虚拟机实例,以通过 HTTP 响应在 X-Load-Balancing-Endpoint-Weight 标头中返回权重。在本教程中,您将配置一个后端实例报告权重 0,将第二个后端实例报告权重 100,将第三个后端实例报告权重 900。如需创建实例,请运行
gcloud compute instances create
命令:
gcloud compute instances create instance-0 \ --zone=us-central1-a \ --tags=network-lb-tag \ --image-family=debian-10 \ --image-project=debian-cloud \ --subnet= SUBNET_NAME \ --metadata=load-balancing-weight=0,startup-script='#! /bin/bash apt-get update apt-get install apache2 -y ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html lb_weight="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)" echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \ tee /etc/apache2/conf-enabled/headers.conf systemctl restart apache2'
gcloud compute instances create instance-100 \ --zone=us-central1-a \ --tags=network-lb-tag \ --image-family=debian-10 \ --image-project=debian-cloud \ --subnet=SUBNET_NAME \ --metadata=load-balancing-weight=100,startup-script='#! /bin/bash apt-get update apt-get install apache2 -y ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html lb_weight="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)" echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \ tee /etc/apache2/conf-enabled/headers.conf systemctl restart apache2'
gcloud compute instances create instance-900 \ --zone=us-central1-a \ --tags=network-lb-tag \ --image-family=debian-10 \ --image-project=debian-cloud \ --subnet= SUBNET_NAME \ --metadata=load-balancing-weight=900,startup-script='#! /bin/bash apt-get update apt-get install apache2 -y ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html lb_weight="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)" echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \ tee /etc/apache2/conf-enabled/headers.conf systemctl restart apache2'
创建实例组
在本教程中,您将介绍如何创建包含所有三个虚拟机实例(instance-0, instance-100, and instance-900
) 的非托管式实例组。
- 如需创建实例组,请运行
gcloud compute instance-groups unmanaged create
命令:
gcloud compute instance-groups unmanaged create INSTANCE_GROUP --zone=us-central1-a
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP \ --zone=us-central1-a \ --instances=instance-0,instance-100,instance-900
将 INSTANCE_GROUP
替换为要创建的实例组的名称。
创建 HTTP 健康检查
在本教程中,您将介绍如何创建 HTTP 健康检查,以读取包含后端虚拟机权重的 HTTP 响应。
- 如需创建 HTTP 健康检查,请运行
gcloud compute health-checks create
命令:
gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \ --region=us-central1
将 HTTP_HEALTH_CHECK_NAME
替换为要创建的 HTTP 健康检查的名称。
创建后端服务
以下示例说明了如何创建配置为使用加权负载均衡的区域级外部后端服务。
- 创建具有 HTTP 健康检查的后端服务,并将位置负载平衡器政策设置为 WEIGHTED_MAGLEV。
- 如需创建后端服务,请运行
gcloud compute backend-services create
命令:
gcloud compute backend-services create BACKEND_SERVICE_NAME \ --load-balancing-scheme=external \ --protocol=tcp \ --region=us-central1 \ --health-checks=HTTP_HEALTH_CHECK_NAME \ --health-checks-region=us-central1 \ --locality-lb-policy=WEIGHTED_MAGLEV
- 将
BACKEND_SERVICE_NAME
替换为要创建的后端服务的名称。
- 将实例组添加到后端服务。
- 如需添加实例组,请运行
gcloud compute backend-services add-backend
命令:
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --instance-group=INSTANCE_GROUP \ --instance-group-zone=us-central1-a \ --region=us-central1
- 为负载均衡器预留区域外部 IP 地址:
- 如需预留一个或多个 IP 地址,请运行
gcloud compute addresses create
命令:
gcloud compute addresses create ADDRESS_NAME \ --region us-central1
将 ADDRESS_NAME
替换为要创建的 IP 地址的名称。使用 compute addresses describe
命令查看结果。请记下预留的静态外部 IP 地址(“IP_ADDRESS'
”)。
gcloud compute addresses describe ADDRESS_NAME
- 使用预留的区域外部 IP 地址“IP_ADDRESS”创建转发规则。将转发规则连接到后端服务。
- 如需创建转发规则,请运行
gcloud compute forwarding-rules create
命令:
gcloud compute forwarding-rules create FORWARDING_RULE \ --region=us-central1 \ --ports=80 \ --address=IP_ADDRESS \ --backend-service=BACKEND_SERVICE_NAME
- 将以下内容替换为
FORWARDING_RULE
:要创建的转发规则的名称。IP_ADDRESS:
是分配给实例的 IP 地址。使用预留的静态外部 IP 地址,而不是地址名称。
使用后端服务 API 验证后端权重
验证后端权重已正确报告给 HTTP 健康检查。
- 如需从后端服务获取后端权重(以及运行状况),请运行
gcloud compute backend-services get-health
命令:
gcloud compute backend-services get-health HTTP_HEALTH_CHECK_NAME \ --region=us-central1
输出应如下所示:
backend: https://www.googleapis.com/compute/projects/project-name/{project}/zones/us-central1-a/instanceGroups/{instance-group-name} status: healthStatus: - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name} forwardingRuleIp: 34.135.46.66 healthState: HEALTHY instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-0 ipAddress: 10.10.0.5 port: 80 weight: '0' - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name} forwardingRuleIp: 34.135.46.66 healthState: HEALTHY instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-100 ipAddress: 10.10.0.6 port: 80 weight: '100' - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name} forwardingRuleIp: 34.135.46.66 healthState: HEALTHY instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-900 ipAddress: 10.10.0.7 port: 80 weight: '900' kind: compute#backendServiceGroupHealth