设置具有混合连接的跨区域内部应用负载均衡器

本页面介绍了如何部署跨区域内部应用负载均衡器,以将流量负载均衡到位于本地或其他公有云的网络端点以及可通过使用混合连接访问的网络端点。

如果您尚未设置混合连接性 NEG,请查看混合连接性 NEG 概览,以了解设置混合负载均衡的网络要求。

设置概览

以下示例设置了同时使用可用区级和混合连接 NEG 后端的跨区域内部应用负载均衡器,如下图所示:

混合可用区和混合连接 NEG 后端的跨区域内部应用负载均衡器示例。
同时使用可用区级和混合连接 NEG 后端的跨区域内部应用负载均衡器示例(点击可放大)。

您必须先配置混合连接,然后才能设置混合负载均衡部署。根据您选择的混合连接产品,请使用 Cloud VPN 或 Cloud Interconnect(专用或合作伙伴)。

设置 SSL 证书资源

按照以下所述创建 Certificate Manager SSL 证书资源:

我们建议您使用 Google 管理的证书。

权限

如需设置混合负载均衡,您必须拥有以下权限:

  • 在 Google Cloud 上

    • 在 Google Cloud 与本地环境或其他云环境之间建立混合连接的权限。如需查看所需的权限列表,请参阅相关的 Network Connectivity 产品文档
    • 创建混合连接 NEG 和负载均衡器的权限。Compute Load Balancer Admin 角色 (roles/compute.loadBalancerAdmin) 可提供执行本指南中描述的任务所需的权限。
  • 在本地环境或其他非 Google Cloud 云环境中

    • 配置网络端点的权限,以允许使用 IP:Port 组合从 Google Cloud 访问本地环境或其他云环境中的服务。如需了解详情,请与您的环境的网络管理员联系。
    • 在本地环境或其他云环境中创建防火墙规则的权限,以允许 Google 的健康检查探测到达端点。

此外,如需完成本页面上的说明,您需要创建混合连接 NEG、负载均衡器和可用区级 NEG(及其端点),以用作负载均衡器的基于 Google Cloud 的后端。

您应该是项目的 Owner 或 Editor,或者应具有以下 Compute Engine IAM 角色

任务 所需角色
创建网络、子网和负载均衡器组件 Compute Network Admin (roles/compute.networkAdmin)
添加和移除防火墙规则 Compute Security Admin (roles/compute.securityAdmin)
创建实例 Compute Instance Admin (roles/compute.instanceAdmin)

建立混合连接

您必须将 Cloud Interconnect VLAN 连接或 Cloud VPN 隧道与 Cloud Router 结合使用通过混合连接来连接 Google Cloud 和本地环境或其他云环境。我们建议您使用高可用性连接。

通过全球动态路由启用的 Cloud Router 路由器会通过边界网关协议 (BGP) 获知特定端点并将其编程到您的 Google Cloud VPC 网络中。不支持区域动态路由。也不支持静态路由。

您用于配置 Cloud Interconnect 或 Cloud VPN 的 VPC 网络与您用于配置混合负载均衡部署的网络相同。确保您的 VPC 网络的子网 CIDR 范围与远程 CIDR 范围无冲突。当 IP 地址重叠时,子网路由优先于远程连接。

如需查看相关说明,请参阅以下文档:

设置 Google Cloud 外部的环境

执行以下步骤,设置本地环境或其他云环境以用于混合负载均衡:

  • 将网络端点配置为向 Google Cloud 公开本地服务 (IP:Port)。
  • 在本地环境或其他云环境中配置防火墙规则。
  • 将 Cloud Router 路由器配置为向专用环境通告所需的特定路由。

设置网络端点

设置混合连接后,您可以在本地环境或其他云环境中配置一个或多个网络端点,这些端点可使用 IP:port 组合通过 Cloud Interconnect 或 Cloud VPN 进行访问。此 IP:port 组合将配置为混合连接 NEG(稍后将在此流程中在 Google Cloud 中创建)的一个或多个端点。

如果 IP 端点有多个路径,则路由将遵循 Cloud Router 概览中所述的行为。

设置防火墙规则

您必须在本地环境或其他云环境中创建以下防火墙规则:

  • 在本地环境或其他云环境中创建入站流量允许防火墙规则,以允许来自区域的代理专用子网的流量到达端点。
  • 对于混合 NEG,无需将 Google 的健康检查探测范围列入许可名单。但是,如果您在单个后端服务中结合使用混合和可用区级 NEG,则需要将可用区级 NEG 的 Google 健康检查探测范围列入许可名单。

将 Cloud Router 配置为向本地环境或其他云环境通告以下自定义 IP 范围

  • 区域的代理专用子网的范围。

设置 Google Cloud 环境

对于以下步骤,请确保使用用于在环境之间配置混合连接的同一 VPC 网络(在此过程中称为 NETWORK)。

此外,确保使用的区域(在此过程中称为 REGION_AREGION_B)与用于创建 Cloud VPN 隧道或 Cloud Interconnect VLAN 连接的区域相同。

(可选)您可以配置 DNS 路由政策(类型为 GEO),以便在发生区域性服务中断期间将客户端流量路由到离客户端最近的区域中的负载均衡器 VIP。

配置后端子网

使用此子网创建负载均衡器的可用区级 NEG 后端:

控制台

  1. 在 Google Cloud 控制台中,进入 VPC 网络页面。

    进入 VPC 网络页面

  2. 找到用于配置环境之间的混合连接的网络。

  3. 子网部分中执行以下操作:

    • 子网创建模式设置为自定义
    • 新子网部分中,输入以下信息:
      • 为子网提供名称
      • 选择区域REGION_A
      • 输入一个 IP 地址范围
    • 点击完成
  4. 点击创建

  5. 如需在不同区域中添加更多子网,请点击添加子网,然后对 REGION_B 重复执行上述步骤

gcloud

  1. 在用于配置环境之间的混合连接的网络中创建子网。

    gcloud compute networks subnets create SUBNET_A \
        --network=NETWORK \
        --range=LB_SUBNET_RANGE1 \
        --region=REGION_A
    
    gcloud compute networks subnets create SUBNET_B \
        --network=NETWORK \
        --range=LB_SUBNET_RANGE2 \
        --region=REGION_B
    

API

subnetworks.insert 方法发出 POST 请求。请将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/subnetworks

{
 "name": "SUBNET_A",
 "network": "projects/PROJECT_ID/global/networks/NETWORK",
 "ipCidrRange": "LB_SUBNET_RANGE1",
 "region": "projects/PROJECT_ID/regions/REGION_A",
}

subnetworks.insert 方法发出 POST 请求。请将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/subnetworks

{
 "name": "SUBNET_B",
 "network": "projects/PROJECT_ID/global/networks/NETWORK",
 "ipCidrRange": "LB_SUBNET_RANGE2",
 "region": "projects/PROJECT_ID/regions/REGION_B",
}

替换以下内容:

  • SUBNET_ASUBNET_B:子网的名称
  • LB_SUBNET_RANGE1LB_SUBNET_RANGE2:子网的 IP 地址范围
  • REGION_AREGION_B:您在其中配置了负载均衡器的区域

配置代理专用子网

代理专用子网提供了一组 IP 地址,供 Google 用于代表您运行 Envoy 代理。代理会终结来自客户端的连接并创建与后端的新连接。

此代理专用子网用于 VPC 网络的同一区域中的所有基于 Envoy 的区域级负载均衡器。在每个网络中,每个区域只能有一个活跃代理专用子网用于给定目的。

控制台

如果您使用的是 Google Cloud 控制台,则可以稍后在负载均衡页面上创建代理专用子网。

如需立即创建代理专用子网,请按以下步骤操作:

  1. 在 Google Cloud 控制台中,转到 VPC 网络页面。

    转到 VPC 网络页面

  2. 点击 VPC 网络的名称。
  3. 子网标签页上,点击添加子网
  4. 为代理专用子网提供名称
  5. 区域列表中,选择 REGION_A
  6. 用途列表中,选择跨区域托管式代理
  7. IP 地址范围字段中,输入 10.129.0.0/23
  8. 点击添加

REGION_B 中创建代理专用子网

  1. 点击添加子网
  2. 为代理专用子网提供名称
  3. 区域列表中,选择 REGION_B
  4. 用途列表中,选择跨区域托管式代理
  5. IP 地址范围字段中,输入 10.130.0.0/23
  6. 点击添加

gcloud

使用 gcloud compute networks subnets create 命令创建代理专用子网。

    gcloud compute networks subnets create PROXY_SN_A \
        --purpose=GLOBAL_MANAGED_PROXY \
        --role=ACTIVE \
        --region=REGION_A \
        --network=NETWORK \
        --range=PROXY_ONLY_SUBNET_RANGE1
    
    gcloud compute networks subnets create PROXY_SN_B \
        --purpose=GLOBAL_MANAGED_PROXY \
        --role=ACTIVE \
        --region=REGION_B \
        --network=NETWORK \
        --range=PROXY_ONLY_SUBNET_RANGE2
    

请替换以下内容:

  • PROXY_SN_APROXY_SN_B:代理专用子网的名称
  • PROXY_ONLY_SUBNET_RANGE1PROXY_ONLY_SUBNET_RANGE2:代理专用子网的 IP 地址范围
  • REGION_AREGION_B:您在其中配置了负载均衡器的区域

API

使用 subnetworks.insert 方法创建代理专用子网,并将 PROJECT_ID 替换为您的项目 ID。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/subnetworks

    {
      "name": "PROXY_SN_A",
      "ipCidrRange": "PROXY_ONLY_SUBNET_RANGE1",
      "network": "projects/PROJECT_ID/global/networks/NETWORK",
      "region": "projects/PROJECT_ID/regions/REGION_A",
      "purpose": "GLOBAL_MANAGED_PROXY",
      "role": "ACTIVE"
    }
  
    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/subnetworks

    {
      "name": " PROXY_SN_B",
      "ipCidrRange": "PROXY_ONLY_SUBNET_RANGE2",
      "network": "projects/PROJECT_ID/global/networks/NETWORK",
      "region": "projects/PROJECT_ID/regions/REGION_B",
      "purpose": "GLOBAL_MANAGED_PROXY",
      "role": "ACTIVE"
    }
  

创建防火墙规则

在此示例中,您将为 Google Cloud 上的可用区级 NEG 后端创建以下防火墙规则:

  • fw-allow-health-check:适用于负载均衡实例的入站流量规则,该规则允许来自 Google Cloud 健康检查系统(130.211.0.0/2235.191.0.0/16)的流量。此示例使用目标标记 allow-health-check 来标识它应该应用于的可用区级 NEG。
  • fw-allow-ssh:一个入站流量规则,用于允许从任何地址到 TCP 端口 22 的传入 SSH 连接。您可以为此规则选择限制性更高的源 IP 地址范围;例如,您可以仅指定要从中启动 SSH 会话的系统的 IP 地址范围。此示例使用目标标记 allow-ssh 来标识应该应用该规则的虚拟机 (VM) 实例。
  • fw-allow-proxy-only-subnet:入站流量规则,允许来自代理专用子网的连接到达可用区级 NEG 后端。

控制台

  1. 在 Google Cloud 控制台中,转到防火墙页面。

    转到“防火墙政策”

  2. 点击创建防火墙规则,以创建允许来自健康检查探测的流量的规则:

    1. 输入 fw-allow-health-check 作为名称
    2. 对于网络,请选择 NETWORK
    3. 对于目标,选择 Specified target tags
    4. 使用 allow-health-check 填充目标标记字段。
    5. 来源过滤条件设置为 IPv4 范围
    6. 来源 IPv4 范围设置为 130.211.0.0/2235.191.0.0/16
    7. 协议和端口部分,选择指定的协议和端口
    8. 选择 TCP,然后输入 80 作为端口号。
    9. 点击创建
  3. 再次点击创建防火墙规则,以创建允许传入 SSH 连接的规则:

    1. 名称fw-allow-ssh
    2. 网络NETWORK
    3. 优先级1000
    4. 流量方向:入站
    5. 对匹配项执行的操作:允许
    6. 目标:指定的目标标记
    7. 目标标记allow-ssh
    8. 来源过滤条件IPv4 范围
    9. 来源 IPv4 范围0.0.0.0/0
    10. 协议和端口:选择指定的协议和端口
    11. 选择 TCP,然后输入 22 作为端口号。
    12. 点击创建
  4. 再次点击创建防火墙规则,以创建允许来自代理专用子网的传入连接的规则:

    1. 名称fw-allow-proxy-only-subnet
    2. 网络NETWORK
    3. 优先级1000
    4. 流量方向:入站
    5. 对匹配项执行的操作:允许
    6. 目标:指定的目标标记
    7. 目标标记allow-proxy-only-subnet
    8. 来源过滤条件IPv4 范围
    9. 来源 IPv4 范围PROXY_ONLY_SUBNET_RANGE1PROXY_ONLY_SUBNET_RANGE2
    10. 协议和端口:选择指定的协议和端口
    11. 选择 TCP,然后输入 80 作为端口号。
    12. 点击创建

gcloud

  1. 创建 fw-allow-health-check-and-proxy 规则,以允许 Google Cloud 健康检查通过 TCP 端口 80 访问后端实例:

    gcloud compute firewall-rules create fw-allow-health-check \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-health-check \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 \
        --rules=tcp:80
    
  2. 创建 fw-allow-ssh 防火墙规则,允许通过 SSH 连接到网络标记为 allow-ssh 的虚拟机。如果省略 source-ranges,Google Cloud 会将规则解释为表示所有来源

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  3. 为代理专用子网创建入站流量允许防火墙规则,以允许负载均衡器与 TCP 端口 80 上的后端实例进行通信:

    gcloud compute firewall-rules create fw-allow-proxy-only-subnet \
        --network=NETWORK \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-proxy-only-subnet \
        --source-ranges=PROXY_ONLY_SUBNET_RANGE1,PROXY_ONLY_SUBNET_RANGE2 \
        --rules=tcp:80
    

设置可用区级 NEG

对于基于 Google Cloud 的后端,我们建议您在配置混合连接的同一区域中配置多个可用区级 NEG。

对于此示例,在 REGION_A 区域中设置可用区级 NEG(具有 GCE_VM_IP_PORT 类型的端点)。首先在 ZONE_A 可用区创建虚拟机。接着,在 ZONE_A 可用区中创建可用区级 NEG,然后将虚拟机的网络端点添加到此 NEG。为了支持高可用性,在 REGION_B 区域中设置一个类似的可用区级 NEG。如果一个区域中的后端发生故障,则流量会故障切换到另一个区域。

创建虚拟机

控制台

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到虚拟机实例

  2. 使用以下名称和可用区组合对每个虚拟机重复执行第 3 步到第 8 步。

    • 名称:vm-a1
      • 可用区:区域 REGION_A 中的 ZONE_A
      • 子网:SUBNET_A
    • 名称:vm-b1
      • 可用区:区域 REGION_B 中的 ZONE_B
      • 子网:SUBNET_B
  3. 点击创建实例

  4. 按照上一步中的说明设置名称。

  5. 区域部分,按照上一步中的说明进行选择。

  6. 可用区部分,按照上一步中的说明进行选择。

  7. 启动磁盘部分中,确保为启动磁盘选项选择了 Debian 操作系统和 10 (Buster) 版本。如有必要,请点击选择以更改映像。

  8. 高级选项部分中,展开网络,然后执行以下操作:

    • 添加以下网络标记allow-sshallow-health-checkallow-proxy-only-subnet
    • 网络接口部分中,点击添加网络接口以进行以下更改,然后点击完成
      • 网络NETWORK
      • 子网:如上述步骤所示。
      • 主要内部 IP:临时(自动)
      • 外部 IP:临时
    • 展开管理。 在自动化字段中,复制并粘贴以下脚本内容。所有虚拟机的脚本内容均相同:

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://metadata.google.internal/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
  9. 点击创建

gcloud

使用虚拟机名称及其可用区的以下组合,通过运行以下命令来创建虚拟机。两个虚拟机的脚本内容相同。

gcloud compute instances create VM_NAME \
    --zone=GCP_NEG_ZONE \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=allow-ssh,allow-health-check,allow-proxy-only-subnet \
    --subnet=LB_SUBNET_NAME \
    --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://metadata.google.internal/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2'
  • VM_NAMEvm-a1
    • 可用区 GCP_NEG_ZONE 作为区域 REGION_A 中的 ZONE_A
    • 子网 LB_SUBNET_NAME 作为 SUBNET_A
  • VM_NAMEvm-b1
    • 可用区 GCP_NEG_ZONE 作为区域 REGION_B 中的 ZONE_B
    • 子网 LB_SUBNET_NAME 作为 SUBNET_B

创建可用区级 NEG

控制台

如需创建可用区级网络端点组,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到网络端点组页面。

    转到“网络端点组”

  2. 使用以下名称和可用区组合对每个可用区级 NEG 重复执行第 3 步到第 8 步:

    • 名称:neg-1
      • 可用区:区域 ZONE_A 中的 REGION_A
      • 子网:SUBNET_A
    • 名称:neg-2
      • 可用区:区域 ZONE_B 中的 REGION_B
      • 子网:SUBNET_B
  3. 点击创建网络端点组

  4. 按照上一步中的说明设置名称。

  5. 选择网络端点组类型网络端点组(可用区级)

  6. 选择网络NETWORK

  7. 按照上一步中的说明选择子网

  8. 按照上一步中的说明选择可用区

  9. 输入默认端口80

  10. 点击创建

将端点添加到可用区级 NEG:

  1. 在 Google Cloud 控制台中,转到网络端点组页面。

    前往“网络端点组”

  2. 点击上一步中创建的网络端点组的名称。随即会出现网络端点组详情页面。

  3. 此组中的网络端点部分,点击添加网络端点。您会看到添加网络端点页面。

  4. 选择一个虚拟机实例,将其内部 IP 地址添加为网络端点。网络接口部分会显示虚拟机的名称、可用区和子网。

  5. 输入新网络端点的 IP 地址

  6. 选择端口类型

    1. 如果您选择默认,端点会使用网络端点组中所有端点的默认端口 80。这足以满足我们的示例需求,因为 Apache 服务器在端口 80 处理请求。
    2. 如果您选择自定义,请输入要供端点使用的端口号
  7. 如需添加更多端点,请点击添加网络端点,并重复上述步骤。

  8. 添加所有端点后,点击创建

gcloud

  1. 使用名称、可用区和子网组合创建可用区级 NEG(具有 GCE_VM_IP_PORT 端点)。使用 gcloud compute network-endpoint-groups create 命令

    gcloud compute network-endpoint-groups create GCP_NEG_NAME \
        --network-endpoint-type=GCE_VM_IP_PORT \
        --zone=GCP_NEG_ZONE \
        --network=NETWORK \
        --subnet=LB_SUBNET_NAME
    
    • 名称:neg-1
      • 可用区 GCP_NEG_ZONE:区域 REGION_A 中的 ZONE_A
      • 子网 LB_SUBNET_NAMESUBNET_A
    • 名称:neg-2
      • 可用区 GCP_NEG_ZONE:区域 REGION_B 中的 ZONE_B
      • 子网 LB_SUBNET_NAMESUBNET_B

    您可以在创建 NEG 时使用 --default-port 选项指定端口,也可以为每个端点指定端口号,如下一步所示。

  2. 将端点添加到 neg1neg2

    gcloud compute network-endpoint-groups update neg1 \
        --zone=ZONE_A \
        --add-endpoint='instance=vm-a1,port=80'
    
    gcloud compute network-endpoint-groups update neg2 \
        --zone=ZONE_B \
        --add-endpoint='instance=vm-b1,port=80'
    

设置混合连接 NEG

创建 NEG 时,请使用使 Google Cloud 与您的本地或其他云环境之间的地理距离最短的可用区。例如,如果您在德国法兰克福的某一本地环境中托管一项服务,则可以在创建 NEG 时指定 europe-west3-a Google Cloud 可用区。

如果您使用的是 Cloud Interconnect,则用于创建 NEG 的可用区位于在其中配置了 Cloud Interconnect 连接的区域。

混合 NEG 仅支持分布式 Envoy 健康检查

控制台

如需创建混合连接网络端点组,请执行以下操作:

  1. 在 Google Cloud 控制台中,转到网络端点组页面。

    进入“网络端点组”

  2. 点击创建网络端点组

  3. 使用以下名称和可用区组合对每个混合 NEG 重复执行第 4 步到第 9 步。

    • 名称 ON_PREM_NEG_NAMEhybrid-1
      • 可用区:ON_PREM_NEG_ZONE1
      • 子网:SUBNET_A
    • 名称 ON_PREM_NEG_NAMEhybrid-2
      • 可用区:ON_PREM_NEG_ZONE2
      • 子网:SUBNET_B
  4. 按照上一步中的说明设置名称。

  5. 选择网络端点组类型混合连接网络端点组(可用区级)

  6. 选择网络NETWORK

  7. 子网部分,按照上一步中的说明进行选择。

  8. 可用区部分,按照上一步中的说明进行选择。

  9. 输入默认端口

  10. 点击创建

将端点添加到混合连接 NEG:

  1. 在 Google Cloud 控制台中,转到网络端点组页面。

    进入“网络端点组”

  2. 点击上一步中创建的网络端点组的名称。随即会出现网络端点组详情页面。

  3. 此组中的网络端点部分,点击添加网络端点。您会看到添加网络端点页面。

  4. 输入新网络端点的 IP 地址

  5. 选择端口类型

    1. 如果您选择默认,端点会使用网络端点组中所有端点的默认端口。
    2. 如果您选择自定义,可以输入其他端口号以供端点使用。
  6. 如需添加更多端点,请点击添加网络端点,并重复上述步骤。

  7. 添加所有非 Google Cloud 端点后,点击创建

gcloud

  1. 创建使用以下名称组合的混合连接 NEG。使用 gcloud compute network-endpoint-groups create 命令

    gcloud compute network-endpoint-groups create ON_PREM_NEG_NAME \
        --network-endpoint-type=NON_GCP_PRIVATE_IP_PORT \
        --zone=ON_PREM_NEG_ZONE \
        --network=NETWORK
    
    • 名称 ON_PREM_NEG_NAMEhybrid-1
      • 可用区 ON_PREM_NEG_ZONEON_PREM_NEG_ZONE1
    • 名称 ON_PREM_NEG_NAMEhybrid-2
      • 可用区 GCP_NEG_ZONEON_PREM_NEG_ZONE2
  2. 将本地后端虚拟机端点添加到 ON_PREM_NEG_NAME

    gcloud compute network-endpoint-groups update ON_PREM_NEG_NAME \
        --zone=ON_PREM_NEG_ZONE \
        --add-endpoint="ip=ON_PREM_IP_ADDRESS_1,port=PORT_1" \
        --add-endpoint="ip=ON_PREM_IP_ADDRESS_2,port=PORT_2"
    

您可以使用此命令添加之前在本地环境或云环境中配置的网络端点。根据需要重复执行 --add-endpoint

配置负载平衡器

控制台

gcloud

  1. 使用 gcloud compute health-checks create http 命令定义 HTTP 健康检查。

    gcloud compute health-checks create http gil7-basic-check \
       --use-serving-port \
       --global
    
  2. 使用 gcloud compute backend-services create 命令创建后端服务并启用日志记录功能。

    gcloud compute backend-services create BACKEND_SERVICE \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --protocol=HTTP \
      --enable-logging \
      --logging-sample-rate=1.0 \
      --health-checks=gil7-basic-check \
      --global-health-checks \
      --global
    
  3. 使用 gcloud compute backend-services add-backend 命令将后端添加到后端服务。

    gcloud compute backend-services add-backend BACKEND_SERVICE \
      --global \
      --balancing-mode=RATE \
      --max-rate-per-endpoint=MAX_REQUEST_RATE_PER_ENDPOINT \
      --network-endpoint-group=neg1 \
      --network-endpoint-group-zone=ZONE_A \
      --network-endpoint-group=neg2 \
      --network-endpoint-group-zone=ZONE_B
    

    如需详细了解如何配置均衡模式,请参阅 gcloud CLI 文档中的 --max-rate-per-endpoint 标志。

  4. 将混合 NEG 作为后端添加到后端服务。

    gcloud compute backend-services add-backend BACKEND_SERVICE \
      --global \
      --balancing-mode=RATE \
      --max-rate-per-endpoint=MAX_REQUEST_RATE_PER_ENDPOINT \
      --network-endpoint-group=hybrid1 \
      --network-endpoint-group-zone=ON_PREM_NEG_ZONE1 \
      --network-endpoint-group=hybrid2 \
      --network-endpoint-group-zone=ON_PREM_NEG_ZONE2 \
    

    如需详细了解如何配置均衡模式,请参阅 gcloud CLI 文档中的 --max-rate-per-endpoint 参数。

  5. 使用 gcloud compute url-maps create 命令创建网址映射。

    gcloud compute url-maps create gil7-map \
      --default-service=BACKEND_SERVICE \
      --global
    
  6. 创建目标代理。

    对于 HTTP

    使用 gcloud compute target-http-proxies create 命令创建目标代理。

    gcloud compute target-http-proxies create gil7-http-proxy \
      --url-map=gil7-map \
      --global
    

    对于 HTTPS

    如需创建 Google 管理的证书,请参阅以下文档:

    创建 Google 管理的证书后,请将该证书附加到目标代理。跨区域内部应用负载均衡器不支持证书映射。

    如需创建自行管理的证书,请参阅以下文档:

    将文件路径分配给变量名称。

    export LB_CERT=PATH_TO_PEM_FORMATTED_FILE
    
    export LB_PRIVATE_KEY=PATH_TO_PEM_LB_PRIVATE_FILE
    

    使用 gcloud certificate-manager certificates create 命令创建所有区域 SSL 证书。

    gcloud certificate-manager certificates create gilb-certificate \
      --private-key-file=$LB_CERT \
      --certificate-file=$LB_PRIVATE_KEY \
      --scope=all-regions
    

    使用 SSL 证书通过 gcloud compute target-https-proxies create 命令创建目标代理

    gcloud compute target-https-proxies create gil7-https-proxy \
      --url-map=gil7-map \
      --certificate-manager-certificates=gilb-certificate \
      --global
    
  7. 创建两条转发规则,一条规则使用 REGION_A 区域中的 VIP IP_ADDRESS1,另一条规则使用 REGION_B 区域的 VIP IP_ADDRESS2。对于转发规则的 IP 地址,请使用 LB_SUBNET_RANGE1LB_SUBNET_RANGE2 IP 地址范围。如果您尝试使用代理专用子网,则转发规则创建会失败。

    对于自定义网络,必须在转发规则中引用子网。请注意,这是虚拟机子网,而非代理子网。

    对于 HTTP

    gcloud compute forwarding-rules create 命令与正确的标志结合使用。

    gcloud compute forwarding-rules create FWRULE_A \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_A \
      --subnet-region=REGION_A \
      --address=IP_ADDRESS1 \
      --ports=80 \
      --target-http-proxy=gil7-http-proxy \
      --global
    
    gcloud compute forwarding-rules create FWRULE_B \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_B \
      --subnet-region=REGION_B \
      --address=IP_ADDRESS2 \
      --ports=80 \
      --target-http-proxy=gil7-http-proxy \
      --global
    

    对于 HTTPS

    gcloud compute forwarding-rules create 命令与正确的标志结合使用来创建转发规则。

    gcloud compute forwarding-rules create FWRULE_A \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_A \
      --subnet-region=REGION_A \
      --address=IP_ADDRESS1 \
      --ports=443 \
      --target-https-proxy=gil7-https-proxy \
      --global
    
    gcloud compute forwarding-rules create FWRULE_B \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=NETWORK \
      --subnet=SUBNET_B \
      --subnet-region=REGION_B \
      --address=IP_ADDRESS2 \
      --ports=443 \
      --target-https-proxy=gil7-https-proxy \
      --global
    

将您的网域连接到负载均衡器

创建负载均衡器后,请记下与负载均衡器关联的 IP 地址,例如 IP_ADDRESS1IP_ADDRESS2。如需将您的网域指向负载均衡器,请使用 Cloud DNS 或网域注册服务创建 A 记录。如果您向 SSL 证书添加了多个网域,则必须为每个网域添加一条 A 记录,所有网域均指向负载均衡器的 IP 地址。

测试负载均衡器

创建虚拟机实例以测试连接性

  1. 创建客户端虚拟机:

    gcloud compute instances create l7-ilb-client-a \
        --image-family=debian-10 \
        --image-project=debian-cloud \
        --network=NETWORK \
        --subnet=SUBNET_A \
        --zone=ZONE_A \
        --tags=allow-ssh
    
    gcloud compute instances create l7-ilb-client-b \
        --image-family=debian-10 \
        --image-project=debian-cloud \
        --network=NETWORK \
        --subnet=SUBNET_B \
        --zone=ZONE_B \
        --tags=allow-ssh
    
  2. 使用 SSH 连接到每个客户端实例。

    gcloud compute ssh l7-ilb-client-a \
       --zone=ZONE_A
    
    gcloud compute ssh l7-ilb-client-b \
       --zone=ZONE_B
    
  3. 验证 IP 地址是否提供其主机名。

    • 验证客户端虚拟机是否可以访问以下两个 IP 地址。该命令应该会成功,并返回传送请求的后端虚拟机的名称:

      curl IP_ADDRESS1
      
      curl IP_ADDRESS2
      

      对于 HTTPS 测试,请将 curl 替换为:

      curl -k -s 'https://test.example.com:443' --connect-to test.example.com:443:IP_ADDRESS1:443
      
      curl -k -s 'https://test.example.com:443' --connect-to test.example.com:443:IP_ADDRESS2:443
      

      -k 标志会导致 curl 跳过证书验证。

    • 可选:使用配置的 DNS 记录解析离客户端虚拟机最近的 IP 地址。例如,DNS_ENTRY 可以是 service.example.com

      curl DNS_ENTRY
      

运行 100 个请求

运行 100 个 curl 请求,并通过响应确认它们已进行负载均衡。

对于 HTTP

  • 验证客户端虚拟机是否可以访问以下两个 IP 地址。该命令应该会成功,并返回传送请求的后端虚拟机的名称:

    {
      RESULTS=
      for i in {1..100}
      do
        RESULTS="$RESULTS:$(curl --silent IP_ADDRESS1)"
      done
      echo "***"
      echo "*** Results of load-balancing to IP_ADDRESS1: "
      echo "***"
      echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
      echo
    }
    
    {
      RESULTS=
      for i in {1..100}
      do
        RESULTS="$RESULTS:$(curl --silent IP_ADDRESS2)"
      done
      echo "***"
      echo "*** Results of load-balancing to IP_ADDRESS2: "
      echo "***"
      echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
      echo
    }
    

对于 HTTPS

  • 验证客户端虚拟机是否可以访问以下两个 IP 地址。该命令应该会成功,并返回传送请求的后端虚拟机的名称:

    {
      RESULTS=
      for i in {1..100}
      do
        RESULTS="$RESULTS:$(curl -k -s 'https://test.example.com:443' --connect-to test.example.com:443:IP_ADDRESS1:443)"
      done
      echo "***"
      echo "*** Results of load-balancing to IP_ADDRESS1: "
      echo "***"
      echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
      echo
    }
    
    {
      RESULTS=
      for i in {1..100}
      do
        RESULTS="$RESULTS:$(curl -k -s 'https://test.example.com:443' --connect-to test.example.com:443:IP_ADDRESS2:443)"
      done
      echo "***"
      echo "*** Results of load-balancing to IP_ADDRESS2: "
      echo "***"
      echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
      echo
    }
    

测试故障切换

  1. REGION_B 中的后端健康状况不佳或无法访问时,验证故障切换到 REGION_A 区域的后端。我们通过从 REGION_B 中移除所有后端来进行模拟:

    gcloud compute backend-services remove-backend BACKEND_SERVICE \
       --balancing-mode=RATE \
       --network-endpoint-group=neg2 \
       --network-endpoint-group-zone=ZONE_B
    
  2. 使用 SSH 连接到 REGION_B 中的客户端虚拟机。

    gcloud compute ssh l7-ilb-client-b \
       --zone=ZONE_B
    
  3. REGION_B 区域中的负载均衡 IP 地址发送请求。输出类似于以下内容:

    {
    RESULTS=
    for i in {1..100}
    do
      RESULTS="$RESULTS:$(curl -k -s 'https://test.example.com:443' --connect-to test.example.com:443:IP_ADDRESS2:443)"
    done
    echo "***"
    echo "*** Results of load-balancing to IP_ADDRESS2: "
    echo "***"
    echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
    echo
    }
    

其他配置选项

本部分对配置示例进行了扩展,以提供一些额外的替代配置选项。所有任务均为可选任务。您可以按任意顺序执行这些任务。

配置 DNS 路由政策

如果您的客户端位于多个区域,则建议您在这些区域中使用 VIP 使跨区域内部应用负载均衡器可供访问。这种多区域设置可最大限度地减少延迟和网络传输费用。此外,您还可以设置基于 DNS 的全球负载均衡解决方案,以应对区域级服务中断。如需了解详情,请参阅管理 DNS 路由政策和健康检查

gcloud

如需创建 TTL 为 30 秒 DNS 条目,请使用 gcloud dns record-sets create 命令

gcloud dns record-sets create DNS_ENTRY --ttl="30" \
  --type="A" --zone="service-zone" \
  --routing-policy-type="GEO" \
  --routing-policy-data="REGION_A=gil7-forwarding-rule-a@global;REGION_B=gil7-forwarding-rule-b@global" \
  --enable-health-checking

请替换以下内容:

  • DNS_ENTRY:记录集的 DNS 或域名

    例如 service.example.com

  • REGION_AREGION_B:您在其中配置了负载均衡器的区域

API

通过向 ResourceRecordSets.create 方法发出 POST 请求来创建 DNS 记录。请将 PROJECT_ID 替换为您的项目 ID。

POST https://www.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones/SERVICE_ZONE/rrsets
{
  "name": "DNS_ENTRY",
  "type": "A",
  "ttl": 30,
  "routingPolicy": {
    "geo": {
      "items": [
        {
          "location": "REGION_A",
          "healthCheckedTargets": {
            "internalLoadBalancers": [
              {
                "loadBalancerType": "globalL7ilb",
                "ipAddress": "gil7-forwarding-rule-a",
                "port": "80",
                "ipProtocol": "tcp",
                "networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
                "project": "PROJECT_ID"
              }
            ]
          }
        },
        {
          "location": "REGION_B",
          "healthCheckedTargets": {
            "internalLoadBalancers": [
              {
                "loadBalancerType": "globalL7ilb",
                "ipAddress": "gil7-forwarding-rule-b",
                "port": "80",
                "ipProtocol": "tcp",
                "networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network",
                "project": "PROJECT_ID"
              }
            ]
          }
        }
      ]
    }
  }
}

启用离群值检测

您可以在全球后端服务上启用离群值检测,以识别运行状况不佳的无服务器 NEG 并减少发送到运行状况不佳的无服务器 NEG 的请求数。

可以使用以下方法之一在后端服务上启用离群值检测:

  • consecutiveErrors 方法 (outlierDetection.consecutiveErrors),其中 5xx 系列 HTTP 状态代码被视为错误。
  • consecutiveGatewayFailure 方法 (outlierDetection.consecutiveGatewayFailure),其中只有 502503504 HTTP 状态代码被视为错误。

请按照以下步骤为现有后端服务启用离群值检测。请注意,即使在启用离群值检测后,某些请求也可以发送到运行状况不佳的服务,并向客户端返回 5xx 状态代码。为了进一步降低错误率,您可以为离群值检测参数配置更激进的值。如需了解详情,请参阅 outlierDetection 字段

控制台

  1. 在 Google Cloud 控制台中,转到负载均衡页面。

    转到“负载均衡”

  2. 点击要修改其后端服务的负载均衡器的名称。

  3. 负载均衡器详情页面上,点击 修改

  4. 修改跨区域内部应用负载均衡器页面上,点击后端配置

  5. 后端配置页面上,针对要修改的后端服务点击 修改

  6. 向下滚动并展开高级配置部分。

  7. 离群值检测部分中,选中启用复选框。

  8. 点击 修改以配置离群值检测。

    验证以下选项是否配置了这些值:

    属性 价值
    连续错误数 5
    间隔时间 1000
    基本移除时间 30000
    最大移除百分比 50
    引发强制执行的连续错误数 100

    在此示例中,离群值检测分析每秒运行一次。如果 Envoy 代理收到的连续 HTTP 5xx 状态代码数为 5 个或更多,则后端端点会从 Envoy 代理的负载均衡池中移除 30 秒。当强制百分比设置为 100% 时,后端服务会在每次运行离群值检测分析时从这些特定 Envoy 代理的负载均衡池中逐出运行状况不佳的端点。如果满足移除条件,则最多可以从负载均衡池中移除 50% 的后端端点。

  9. 点击保存

  10. 如需更新后端服务,请点击更新

  11. 如需更新负载均衡器,请在修改跨区域内部应用负载均衡器页面上,点击更新

gcloud

  1. 将后端服务导出到 YAML 文件。

    gcloud compute backend-services export BACKEND_SERVICE_NAME \
      --destination=BACKEND_SERVICE_NAME.yaml --global
    

    BACKEND_SERVICE_NAME 替换为后端服务的名称。

  2. 修改后端服务的 YAML 配置,以添加离群值检测字段,如以下 YAML 配置所示。

    在此示例中,离群值检测分析每秒运行一次。如果 Envoy 代理收到的连续 HTTP 5xx 状态代码数为 5 个或更多,则后端端点会从 Envoy 代理的负载均衡池中移除 30 秒。当强制百分比设置为 100% 时,后端服务会在每次运行离群值检测分析时从这些特定 Envoy 代理的负载均衡池中逐出运行状况不佳的端点。如果满足移除条件,则最多可以从负载均衡池中移除 50% 的后端端点。

    name: BACKEND_SERVICE_NAME
    backends:
    - balancingMode: UTILIZATION
      capacityScaler: 1.0
      group: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/networkEndpointGroups/SERVERLESS_NEG_NAME
    - balancingMode: UTILIZATION
      capacityScaler: 1.0
      group: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/networkEndpointGroups/SERVERLESS_NEG_NAME_2
    outlierDetection:
      baseEjectionTime:
        nanos: 0
        seconds: 30
      consecutiveErrors: 5
      enforcingConsecutiveErrors: 100
      interval:
        nanos: 0
        seconds: 1
      maxEjectionPercent: 50
    port: 80
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/BACKEND_SERVICE_NAME
    sessionAffinity: NONE
    timeoutSec: 30
    ...
    

    请替换以下内容:

    • BACKEND_SERVICE_NAME:后端服务的名称
    • PROJECT_ID:您的项目的 ID
    • REGION_AREGION_B:已配置负载均衡器的区域。
    • SERVERLESS_NEG_NAME:第一个无服务器 NEG 的名称
    • SERVERLESS_NEG_NAME_2:第二个无服务器 NEG 的名称
  3. 通过导入最新配置来更新后端服务。

    gcloud compute backend-services import BACKEND_SERVICE_NAME \
      --source=BACKEND_SERVICE_NAME.yaml --global
    

    离群值检测现已在后端服务上启用。

后续步骤