每个实例的加权网络负载均衡

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 健康检查报告的权重在负载平衡器的后端实例之间分配流量。

自定进度的环境设置

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 项目名称是此项目参与者的显示名称。它是 Google API 尚未使用的字符串。您可以随时对其进行更新。
  • 项目 ID 在所有 Google Cloud 项目中是唯一的,并且是不可变的(一经设置便无法更改)。Cloud 控制台会自动生成一个唯一字符串;通常您不在乎这是什么在大多数 Codelab 中,您都需要引用项目 ID(它通常标识为 PROJECT_ID)。如果您不喜欢生成的 ID,可以再随机生成一个 ID。或者,您也可以尝试自己的项目 ID,看看是否可用。完成此步骤后便无法更改该 ID,并且该 ID 在项目期间会一直保留。
  • 此外,还有第三个值,即某些 API 使用的项目编号,供您参考。如需详细了解所有这三个值,请参阅文档
  1. 接下来,您需要在 Cloud 控制台中启用结算功能,以便使用 Cloud 资源/API。运行此 Codelab 应该不会产生太多的费用(如果有费用的话)。如需关停资源,以免产生超出本教程范围的结算费用,您可以删除自己创建的资源或删除整个项目。Google Cloud 的新用户符合参与 $300 USD 免费试用计划的条件。

启动 Cloud Shell

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

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

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

这个虚拟机已加载了您需要的所有开发工具。它提供了一个持久的 5 GB 主目录,并且在 Google Cloud 中运行,大大增强了网络性能和身份验证功能。您在此 Codelab 中的所有工作都可以在浏览器中完成。您无需安装任何程序。

2. 开始配置

Codelab 需要单个项目。

在本教程中,您将创建一个包含三个虚拟机实例的实例组,并为每个实例分配权重。您将创建 HTTP 健康检查来报告后端实例权重。已对后端服务启用加权网络负载平衡器,且局部负载平衡器政策为 WEIGHTED_MAGLEV。

准备工作

gcloud services enable compute.googleapis.com

注意:您无法使用 Google Cloud 控制台来配置位置负载平衡器政策,以及为虚拟机实例分配权重。请改用 Google Cloud CLI。

创建 VPC 网络、子网和防火墙规则

创建 VPC 网络、子网和入站流量允许防火墙规则,以允许连接到负载平衡器的后端虚拟机。

  1. 创建 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:要创建的子网的名称。
  1. 创建入站允许防火墙规则,允许发送到目标 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 替换为要创建的防火墙规则的名称。

创建虚拟机实例并分配权重

创建三个虚拟机实例并分配权重:

  1. 配置三个后端虚拟机实例,以通过 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
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 响应。

gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

HTTP_HEALTH_CHECK_NAME 替换为要创建的 HTTP 健康检查的名称。

创建后端服务

以下示例说明了如何创建配置为使用加权负载均衡的区域级外部后端服务。

  1. 创建具有 HTTP 健康检查的后端服务,并将位置负载平衡器政策设置为 WEIGHTED_MAGLEV。
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 替换为要创建的后端服务的名称。
  1. 将实例组添加到后端服务。
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
  --instance-group=INSTANCE_GROUP \
  --instance-group-zone=us-central1-a \
  --region=us-central1
  1. 为负载均衡器预留区域外部 IP 地址:
gcloud compute addresses create ADDRESS_NAME \
 --region us-central1

ADDRESS_NAME 替换为要创建的 IP 地址的名称。使用 compute addresses describe 命令查看结果。请记下预留的静态外部 IP 地址(“IP_ADDRESS'”)。

gcloud compute addresses describe ADDRESS_NAME
  1. 使用预留的区域外部 IP 地址“IP_ADDRESS”创建转发规则。将转发规则连接到后端服务。
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 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