设置区域级外部 HTTP(S) 负载均衡器

本文档介绍了如何为 Compute Engine 虚拟机上运行的服务配置区域级外部 HTTP(S) 负载均衡器。

由于区域级外部 HTTP(S) 负载均衡器允许您在特定区域中创建负载均衡器,因此它们通常用于具有管辖区合规性要求的工作负载。需要访问标准网络层级出站流量的工作负载是区域级外部 HTTP(S) 负载均衡器的另一常见用例,因为区域级外部 HTTP(S) 负载均衡器支持标准网络服务层级。

替代解决方案

准备设置

区域级外部 HTTP(S) 负载均衡器的设置包含两个部分:

  • 执行前提任务,例如确保所需帐号拥有正确权限以及准备 Virtual Private Cloud (VPC) 网络。
  • 设置负载平衡器资源。

在按照本指南进行操作之前,请先熟悉以下内容:

权限

若要按照本指南中的说明进行操作,您必须能够创建实例以及修改项目中的网络。因此,您必须是项目 Owner 或 Editor,或者必须具有以下所有 Compute Engine IAM 角色

任务 所需角色
创建网络、子网和负载均衡器组件 Network Admin
添加和移除防火墙规则 Security Admin
创建实例 Instance Admin

如需了解详情,请参阅以下指南:

设置概览

您可以按照以下总体配置流程所述配置区域级外部 HTTP(S) 负载均衡器。以下带编号的步骤对应于该图中的标号。

区域级外部 HTTP(S) 负载均衡器编号组件(点击可放大)
区域级外部 HTTP(S) 负载均衡器编号组件(点击可放大)

如上图所示,该示例在 us-west1 区域的 VPC 网络中创建了一个区域级外部 HTTP(S) 负载均衡器,其中包含一项后端服务和两个后端实例组。

上图显示了以下信息:

  1. 包含两个子网的 VPC 网络:

    1. 一个子网用于后端(实例组)。该子网的主要 IP 地址范围为 10.1.2.0/24

    2. 一个子网是 us-west1 区域中的代理专用子网。您必须在其中使用区域级外部 HTTP(S) 负载均衡器的 VPC 网络的每个区域中创建一个代理专用子网。该区域的代理专用子网会在该区域的所有区域级负载均衡器之间共享。对于从负载均衡器发送到服务后端的数据包,系统会从该代理专用子网分配其来源地址。在本示例中,该区域中代理专用子网的主要 IP 地址范围为 10.129.0.0/23,这是建议的子网大小。如需了解详情,请参阅代理专用子网

  2. 允许在您的网络中使用代理专用子网流量的防火墙规则。这意味着添加一条规则以允许来自 10.129.0.0/23(在此示例中为代理专用子网的范围)的 TCP 端口 804438080 流量。用于健康检查探测的另一个防火墙规则。

  3. 后端实例。

  4. 实例组:

    1. Compute Engine 虚拟机部署所用的托管式实例组或非托管式实例组
    2. GKE 部署所用的 NEG

    在每个区域中,您可以根据自己的部署要求组合使用各种后端组。

  5. 用于报告后端就绪情况的地区健康检查。

  6. 用于监控后端使用情况和运行状况的区域性后端服务。

  7. 地区网址映射,用于解析请求的网址,并根据请求网址的主机和路径将请求转发到特定后端服务。

  8. 地区目标 HTTP 或 HTTPS 代理,用于接收用户请求并将其转发到网址映射。对于 HTTPS,请配置区域 SSL 证书资源。如果您配置 HTTPS 负载均衡,则目标代理会使用 SSL 证书来解密 SSL 流量。目标代理可以通过 HTTP 或 HTTPS 将流量转发到您的实例。

  9. 包含负载均衡器外部 IP 地址的转发规则,用于将每个传入请求转发到目标代理。

    与该转发规则关联的外部 IP 地址使用 gcloud beta compute addresses create 命令进行预留,如预留负载均衡器的 IP 地址中所述。

配置网络和子网

您需要一个包含两个子网的 VPC 网络:一个用于负载均衡器的后端,另一个用于负载均衡器的代理。区域级外部 HTTP(S) 负载均衡器是区域性的。对于 VPC 网络中的流量,如果其来源所在的子网与负载均衡器位于同一区域,那么该流量会被路由到负载均衡器。

本示例使用以下 VPC 网络、区域和子网:

  • 网络:网络是名为 lb-network自定义模式 VPC 网络

  • 后端子网us-west1 地区中名为 backend-subnet 的子网使用 10.1.2.0/24 作为其主要 IP 地址范围。

  • 代理子网us-west1 地区中名为 proxy-only-subnet 的子网使用 10.129.0.0/23 作为其主要 IP 地址范围。

为后端配置网络和子网

gcloud

  1. 使用 gcloud beta compute networks create 命令创建自定义 VPC 网络:

    gcloud beta compute networks create lb-network --subnet-mode=custom
    
  2. 使用 gcloud beta compute networks subnets create 命令在 us-west1 区域的 lb-network 网络中创建子网:

    gcloud beta compute networks subnets create backend-subnet \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

API

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

    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/global/networks
    {
     "routingConfig": {
       "routingMode": "REGIONAL"
     },
     "name": "lb-network",
     "autoCreateSubnetworks": false
    }
    
  2. subnetworks.insert 方法发出 POST 请求,并将 PROJECT_ID 替换为您的项目 ID。

    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/regions/us-west1/subnetworks
    {
     "name": "backend-subnet",
     "network": "projects/PROJECT_ID/global/networks/lb-network",
     "ipCidrRange": "10.1.2.0/24",
     "region": "projects/PROJECT_ID/regions/us-west1",
    }
    

配置代理专用子网

代理专用子网适用于同一区域和 VPC 网络中的所有区域级外部 HTTP(S) 负载均衡器。

gcloud

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

gcloud beta compute networks subnets create proxy-only-subnet \
  --purpose=REGIONAL_MANAGED_PROXY \
  --role=ACTIVE \
  --region=us-west1 \
  --network=lb-network \
  --range=10.129.0.0/23

API

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

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/regions/us-west1/subnetworks
{
  "name": "proxy-only-subnet",
  "ipCidrRange": "10.129.0.0/23",
  "network": "projects/PROJECT_ID/global/networks/lb-network",
  "region": "projects/PROJECT_ID/regions/us-west1",
  "purpose": "REGIONAL_MANAGED_PROXY",
  "role": "ACTIVE"
}

配置防火墙规则

此示例使用以下防火墙规则:

  • fw-allow-ssh。适用于负载平衡实例的入站流量规则,该规则允许从任何地址到 TCP 端口 22 的传入 SSH 连接。您可以为此规则选择限制性更高的来源 IP 地址范围;例如,您可以仅指定要从中启动 SSH 会话的系统的 IP 地址范围。此示例使用目标标记 allow-ssh

  • fw-allow-health-check。适用于负载均衡实例的入站流量规则,该规则允许来自 Google Cloud 健康检查系统(130.211.0.0/2235.191.0.0/16)的所有 TCP 流量。此示例使用目标标记 load-balanced-backend

  • fw-allow-proxies。适用于负载均衡实例的入站规则,该规则允许从区域级外部 HTTP(S) 负载均衡器的代管式代理发送到端口 804438080 的 TCP 流量。此示例使用目标标记 load-balanced-backend

如果不使用上述防火墙规则,则默认拒绝入站规则会阻止传入后端实例的流量。

目标标记定义了后端实例。没有目标标记,防火墙规则将应用于 VPC 网络中的所有后端实例。创建后端虚拟机时,请务必包括指定的目标标记,如创建代管实例组中所示。

控制台

  1. 转到 Google Cloud Console 中的“防火墙规则”页面。
    转到“防火墙规则”页面
  2. 点击创建防火墙规则,以创建允许传入 SSH 连接的规则:
    • 名称fw-allow-ssh
    • 网络lb-network
    • 流量方向入站
    • 对匹配项执行的操作允许
    • 目标指定的目标标记
    • 目标标记allow-ssh
    • 来源过滤条件IPv4 范围
    • 来源 IP 地址范围0.0.0.0/0
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 tcp 复选框,然后输入 22 作为端口号。
  3. 点击创建
  4. 再次点击创建防火墙规则,创建允许 Google Cloud 健康检查的规则:
    • 名称fw-allow-health-check
    • 网络lb-network
    • 流量方向入站
    • 对匹配项执行的操作允许
    • 目标指定的目标标记
    • 目标标记load-balanced-backend
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围130.211.0.0/2235.191.0.0/16
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 tcp 复选框,然后输入 80 作为端口号。
        最佳做法是将此规则限制为仅使用与健康检查所使用的协议和端口匹配的协议和端口。如果您使用 tcp:80 协议和端口,则 Google Cloud 可以使用 HTTP 通过端口 80 联系您的虚拟机,但无法使用 HTTPS 通过端口 443 联系这些虚拟机。
  5. 点击创建
  6. 第三次点击创建防火墙规则,以创建允许负载平衡器的代理服务器连接后端的规则:
    • 名称fw-allow-proxies
    • 网络lb-network
    • 流量方向入站
    • 对匹配项执行的操作允许
    • 目标指定的目标标记
    • 目标标记load-balanced-backend
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围10.129.0.0/23
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 tcp 复选框,然后输入 80, 443, 8080 作为端口号。
  7. 点击创建

gcloud

  1. 创建 fw-allow-ssh 防火墙规则,允许通过 SSH 连接到网络标记为 allow-ssh 的虚拟机。如果省略 source-ranges,Google Cloud 会将规则解释为表示所有来源

    gcloud beta compute firewall-rules create fw-allow-ssh \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  2. 创建 fw-allow-health-check 规则以允许 Google Cloud 健康检查。本示例允许来自健康检查探测工具的所有 TCP 流量;但是,您可以根据自己的需求配置较小范围的端口集。

    gcloud beta compute firewall-rules create fw-allow-health-check \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=130.211.0.0/22,35.191.0.0/16 \
        --target-tags=load-balanced-backend \
        --rules=tcp
    
  3. 创建 fw-allow-proxies 规则以允许区域级外部 HTTP(S) 负载均衡器的代理连接到您的后端。将 source-ranges 设置为代理专用子网的分配范围,例如 10.129.0.0/23

    gcloud beta compute firewall-rules create fw-allow-proxies \
      --network=lb-network \
      --action=allow \
      --direction=ingress \
      --source-ranges=source-range \
      --target-tags=load-balanced-backend \
      --rules=tcp:80,tcp:443,tcp:8080
    

API

通过向 firewalls.insert 方法发出 POST 请求以创建 fw-allow-ssh 防火墙规则,注意要将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/global/firewalls
{
  "name": "fw-allow-ssh",
  "network": "projects/PROJECT_ID/global/networks/lb-network",
  "sourceRanges": [
    "0.0.0.0/0"
  ],
  "targetTags": [
    "allow-ssh"
  ],
  "allowed": [
   {
     "IPProtocol": "tcp",
     "ports": [
       "22"
     ]
   }
  ],
  "direction": "INGRESS"
}

通过向 firewalls.insert 方法发出 POST 请求以创建 fw-allow-health-check 防火墙规则,注意要将 PROJECT_ID 替换为您的项目 ID。

API

创建防火墙规则。

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/global/firewalls
{
  "name": "fw-allow-health-check",
  "network": "projects/PROJECT-ID/global/networks/lb-network",
  "sourceRanges": [
    "130.211.0.0/22",
    "35.191.0.0/16"
  ],
  "targetTags": [
    "load-balanced-backend"
  ],
  "allowed": [
    {
      "IPProtocol": "tcp"
    }
  ],
  "direction": "INGRESS"
}

通过 firewalls.insert 方法创建 fw-allow-proxies 防火墙规则,以允许代理子网内的 TCP 流量,注意要将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/global/firewalls
{
  "name": "fw-allow-proxies",
  "network": "projects/PROJECT_ID/global/networks/lb-network",
  "sourceRanges": [
    "10.129.0.0/23"
  ],
  "targetTags": [
    "load-balanced-backend"
  ],
  "allowed": [
    {
      "IPProtocol": "tcp",
      "ports": [
        "80"
      ]
    },
    {
      "IPProtocol": "tcp",
      "ports": [
        "443"
      ]
    },
    {
      "IPProtocol": "tcp",
      "ports": [
        "8080"
      ]
    }
  ],
  "direction": "INGRESS"
}

使用基于虚拟机的服务配置区域级外部 HTTP(S) 负载均衡器

本部分介绍了在 Compute Engine 虚拟机上运行的服务需要的配置。客户端虚拟机中的应用会访问您在转发规则中配置的虚拟 IP 地址 (VIP)。当您的客户端应用向此 IP 地址和端口发送流量时,它们的请求会根据您的区域级外部 HTTP(S) 负载均衡器的网址映射转发到您的后端虚拟机 (VM)。

此页面上的示例明确设置区域级外部 HTTP(S) 负载均衡器转发规则的预留外部 IP 地址,而不是允许分配临时外部 IP 地址。我们建议的最佳做法是,为转发规则预留 IP 地址。

对于转发规则的 IP 地址,请使用 backend-subnet。如果您尝试使用代理专用子网,则无法创建转发规则。

创建代管式实例组

本部分介绍如何创建模板和代管实例组。代管式实例组提供运行示例区域级外部 HTTP(S) 负载均衡器的后端服务器的虚拟机实例。来自客户端的流量在经过负载均衡处理后传送到这些后端服务器。出于演示目的,后端会传送其自己的主机名。

Cloud Console

  1. 创建实例模板。在 Google Cloud Console 中,转到实例模板页面。

    转到“实例模板”

    1. 点击创建实例模板
    2. 对于名称,输入 l7-xlb-backend-template
    3. 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 9 (stretch)。本文中的说明使用仅 Debian 支持的命令,例如 apt-get
    4. 管理、安全、磁盘、网络、单独租用下的管理标签页上,将以下脚本插入到启动脚本字段。

      #! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo a2ensite default-ssl
      sudo a2enmod ssl
      sudo vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://169.254.169.254/computeMetadata/v1/instance/name)"
      sudo echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      sudo systemctl restart apache2
      
    5. 网络下,选择 lb-network 作为网络,对于子网,选择 backend-subnet

    6. 添加以下网络标记:allow-sshload-balanced-backend

    7. 点击创建

  2. 创建托管实例组。
    转到 Google Cloud 控制台中的实例组页面。

    转到“实例组”

    1. 点击创建实例组
    2. 选择新的代管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 MIG
    3. 对于名称,输入 l7-xlb-backend-example
    4. 位置下方,选择单个可用区
    5. 对于区域,选择 us-west1
    6. 对于可用区,选择 us-west1-a
    7. 实例模板下,选择 l7-xlb-backend-template
    8. 通过在自动扩缩下选择以下选项之一,控制在实例组中创建的实例数:

      • On: add and remove instances to the group
      • Scale up: only add instances to the group
      • Off: do not autoscale

      实例数下限设置为 2,并将实例数上限设置为 2 或更大。

    9. 点击创建

gcloud

本指南中的 gcloud 说明假定您使用的是 Cloud Shell 或安装了 bash 的其他环境。

  1. 使用 gcloud beta compute instance-templates create 命令创建含有 HTTP 服务器的虚拟机实例模板。

    gcloud beta compute instance-templates create l7-xlb-backend-template \
    --region=us-west1 \
    --network=lb-network \
    --subnet=backend-subnet \
    --tags=allow-ssh,load-balanced-backend \
    --image-family=debian-9 \
    --image-project=debian-cloud \
    --metadata=startup-script='#! /bin/bash
    sudo apt-get update
    sudo apt-get install apache2 -y
    sudo a2ensite default-ssl
    sudo a2enmod ssl
    sudo vm_hostname="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    sudo echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    sudo systemctl restart apache2'
    
  2. 使用 gcloud beta compute instance-groups managed create 命令在该可用区中创建一个代管式实例组。

    gcloud beta compute instance-groups managed create l7-xlb-backend-example \
        --zone=us-west1-a \
        --size=2 \
        --template=l7-xlb-backend-template
    

API

  1. 使用 instanceTemplates.insert 方法创建实例模板,注意要将 PROJECT_ID 替换为您的项目 ID。

    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/global/instanceTemplates
    {
     "name":"l7-xlb-backend-template",
     "properties": {
       "machineType":"e2-standard-2",
       "tags": {
         "items":[
           "allow-ssh",
           "load-balanced-backend"
         ]
       },
       "metadata": {
         "kind":"compute#metadata",
         "items":[
           {
             "key":"startup-script",
             "value":"#! /bin/bash\nsudo apt-get update\nsudo apt-get install apache2 -y\nsudo a2ensite default-ssl\nsudo a2enmod ssl\nsudo vm_hostname=\"$(curl -H \"Metadata-Flavor:Google\" \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\nsudo echo \"Page served from: $vm_hostname\" | \\\ntee /var/www/html/index.html\nsudo systemctl restart apache2"
           }
         ]
       },
       "networkInterfaces":[
         {
           "network":"projects/PROJECT_ID/global/networks/lb-network",
           "subnetwork":"regions/us-west1/subnetworks/backend-subnet",
           "accessConfigs":[
             {
               "type":"ONE_TO_ONE_NAT"
             }
           ]
         }
       ],
       "disks": [
         {
           "index":0,
           "boot":true,
           "initializeParams": {
             "sourceImage":"projects/debian-cloud/global/images/family/debian-9"
           },
           "autoDelete":true
         }
       ]
     }
    }
    
  2. 使用 instanceGroupManagers.insert 方法在每个可用区中创建一个代管式实例组,注意要将 PROJECT_ID 替换为您的项目 ID。

    POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/zones/{zone}/instanceGroupManagers
    {
     "name": "l7-xlb-backend-example",
     "zone": "projects/PROJECT_ID/zones/us-west1-a",
     "instanceTemplate": "projects/PROJECT_ID/global/instanceTemplates/l7-xlb-backend-template",
     "baseInstanceName": "l7-xlb-backend-example",
     "targetSize": 2
    }
    

向实例组添加已命名端口

对于您的实例组,定义一个 HTTP 服务并将端口名称映射到相关端口上。负载均衡服务会将流量转发到已命名的端口。

控制台

  1. 在 Google Cloud Console 中,转到实例组页面。

    转到“实例组”

  2. 点击实例组的名称(在此示例中为 l7-xlb-backend-example)。
  3. 在实例组的概览页面上,点击修改
  4. 点击指定端口名称映射
  5. 点击添加项目
  6. 对于端口名称,请输入 http。对于端口号,请输入 80
  7. 点击保存

gcloud

使用 gcloud beta compute instance-groups set-named-ports 命令。

gcloud beta compute instance-groups set-named-ports l7-xlb-backend-example \
    --named-ports http:80 \
    --zone us-west1-a

预留负载均衡器的 IP 地址

Cloud 控制台

  1. 在 Google Cloud 控制台中,转到预留静态地址页面。

    转到“预留静态地址”

  2. 为新地址选择一个名称

  3. 对于网络服务层级,选择标准

  4. 选择 IPv4。IPv6 地址仅限为全球地址,只适用于全球负载均衡器。

  5. 选择区域级

  6. 选择要在其中创建地址的区域。

  7. 保留关联到选项设置为。创建负载均衡器后,此 IP 地址将关联到负载均衡器的转发规则。

  8. 点击预留以预留该 IP 地址。

gcloud

  1. 如需使用 gcloud beta compute 预留静态外部 IP 地址,请使用 compute addresses create 命令

    gcloud beta compute addresses create ADDRESS_NAME  \
       --region=us-west1 \
       --network-tier=STANDARD
    

    替换以下内容:

    • ADDRESS_NAME:您要为此地址指定的名称。
    • REGION:您要预留此地址的区域。此区域应与负载均衡器所在的区域相同。所有区域级 IP 地址均为 IPv4
  2. 使用 compute addresses describe 命令可以查看结果:

    gcloud beta compute addresses describe ADDRESS_NAME
    

API

如需创建区域 IPv4 地址,请调用区域 addresses.insert 方法

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/addresses

请求正文应包含以下内容:

{
  "name": "ADDRESS_NAME"
  "networkTier": "STANDARD"
  "region": "us-west1"
}

替换以下内容:

  • ADDRESS_NAME:地址的名称
  • REGION:此请求的区域名称
  • PROJECT_ID:此请求的项目 ID

配置负载均衡器

下面的示例介绍了如何创建以下区域级外部 HTTP(S) 负载均衡器资源:

  • HTTP 健康检查
  • 将代管实例组用作后端的后端服务
  • 网址映射
    • 如果为目标 HTTP(S) 代理定义了地区,请务必参阅地区网址映射。区域网址映射根据您为传入网址的主机和路径定义的规则将请求路由到区域后端服务。地区网址映射只能由同一地区中的地区目标代理规则引用。
  • SSL 证书(适用于 HTTPS)
  • 目标代理
  • 转发规则

对于转发规则的 IP 地址,请使用 backend-subnet。如果您尝试使用代理专用子网,则无法创建转发规则。

代理可用性

有时,Google Cloud 区域没有足够的代理容量来容纳新的负载均衡器。如果发生这种情况,Google Cloud 控制台会在您创建负载均衡器时提供一条代理可用性警告消息。如需解决此问题,您可以执行以下任一操作:

  • 为您的负载平衡器选择其他地区。如果您的后端位于其他地区,这是一种切实可行的做法。
  • 选择一个已分配有代理专用子网的 VPC 网络。
  • 等待容量问题的解决。

Cloud Console

选择负载均衡器类型

  1. 在 Google Cloud 控制台中,转到创建负载均衡器页面。
    转到“创建负载均衡器”
  2. HTTP(S) 负载均衡下,点击开始配置
  3. 面向互联网或仅限内部部分,选择从互联网到我的虚拟机或无服务器服务。此设置表明负载均衡器是外部 HTTP(S) 负载均衡器。
  4. 高级流量管理部分中:
    1. 选择具有高级流量管理功能的 HTTP(S) 负载均衡器
    2. 选择区域级 HTTP(S) 负载均衡器
  5. 点击继续

创建区域级外部 HTTP(S) 负载均衡器

  1. 对于负载均衡器的名称,请输入 regional-l7-xlb
  2. 对于地区,请选择 us-west1
  3. 对于网络,请选择 lb-network

预留代理专用子网

对于区域级外部 HTTP(S) 负载均衡器,请预留代理专用子网:

  1. 点击 Reserve a Subnet(预留子网)。
  2. 名称输入 proxy-only-subnet

  3. 对于 IP 地址范围,请输入 10.129.0.0/23

  4. 点击添加

配置前端

对于 HTTP:

  1. 点击前端配置
  2. 名称设置为 l7-xlb-forwarding-rule
  3. 协议设置为 HTTP
  4. 端口设置为 80
  5. 选择您在预留负载均衡器的 IP 地址中创建的 IP 地址
  6. 点击完成

对于 HTTPS:

如果您在客户端和负载均衡器之间使用 HTTPS,则需要一个或多个 SSL 证书资源来配置代理。如需了解如何创建 SSL 证书资源,请参阅 SSL 证书。区域级外部 HTTP(S) 负载均衡器目前不支持由 Google 管理的证书。

  1. 点击前端配置
  2. 名称字段中,输入 l7-xlb-forwarding-rule
  3. 协议字段中,选择 HTTPS (includes HTTP/2)
  4. 确保将端口设置为 443
  5. 选择您在预留负载均衡器的 IP 地址中创建的 IP 地址
  6. 证书列表中,执行以下操作:
    1. 如果您已拥有自行管理的 SSL 证书资源,请选择主要 SSL 证书。
    2. 点击创建新证书
      1. 名称字段中,输入 l7-xlb-cert
      2. 在相应字段中上传您的 PEM 格式的文件:
        • 公钥证书
        • 证书链
        • 私钥
      3. 点击创建
  7. 可选:如需添加除了主要 SSL 证书之外的其他证书,请执行以下操作:
    1. 点击添加证书
    2. 如果您已有证书,请从证书列表中选择。
    3. 可选:点击创建新证书并按照上述说明操作。
  8. 点击完成

配置后端服务

  1. 点击后端配置
  2. 创建或选择后端服务菜单中,选择创建后端服务
  3. 将后端服务的名称设置为 l7-xlb-backend-service
  4. 对于协议,选择 HTTP
  5. 已命名端口中输入 http
  6. 后端类型设置为实例组
  7. 新后端部分:
    1. 实例组设置为 l7-xlb-backend-example
    2. 端口号设置为 80
    3. 平衡模式设置为利用率
    4. 点击完成
  8. 健康检查部分中,点击创建健康检查
    1. 名称设置为 l7-xlb-basic-check
    2. 协议设置为 HTTP
    3. 端口设置为 80
    4. 点击保存
  9. 点击创建

配置路由规则

  1. 点击路由规则
  2. 模式下,选择简单主机和路径规则
  3. 确保 l7-xlb-backend-service 是任何不匹配的主机和任何不匹配的路径的唯一后端服务。

完成配置

点击创建

gcloud

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

    gcloud beta compute health-checks create http l7-xlb-basic-check \
       --region=us-west1 \
       --request-path='/' \
       --use-serving-port
    
  2. 使用 gcloud beta compute backend-services create 命令定义后端服务。

    gcloud beta compute backend-services create l7-xlb-backend-service \
      --load-balancing-scheme=EXTERNAL_MANAGED \
      --protocol=HTTP \
      --port-name=http \
      --health-checks=l7-xlb-basic-check \
      --health-checks-region=us-west1 \
      --region=us-west1
    
  3. 使用 gcloud beta compute backend-services add-backend 命令将后端添加到后端服务。

    gcloud beta compute backend-services add-backend l7-xlb-backend-service \
      --balancing-mode=UTILIZATION \
      --instance-group=l7-xlb-backend-example \
      --instance-group-zone=us-west1-a \
      --region=us-west1
    
  4. 使用 gcloud beta compute url-maps create 命令创建网址映射。

    gcloud beta compute url-maps create regional-l7-xlb-map \
      --default-service=l7-xlb-backend-service \
      --region=us-west1
    
  5. 创建目标代理。

    对于 HTTP

    对于 HTTP 负载均衡器,使用 gcloud beta compute target-http-proxies create 命令创建目标代理。

    gcloud beta compute target-http-proxies create l7-xlb-proxy \
      --url-map=regional-l7-xlb-map \
      --url-map-region=us-west1 \
      --region=us-west1
    

    对于 HTTPS

    如需了解如何创建 SSL 证书资源,请参阅 SSL 证书。区域级外部 HTTP(S) 负载均衡器不支持由 Google 管理的证书。

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

      export LB_CERT=path to PEM-formatted file
      
      export LB_PRIVATE_KEY=path to PEM-formatted file
      
    2. 使用 gcloud beta compute ssl-certificates create 命令创建区域 SSL 证书。

      gcloud beta compute ssl-certificates create l7-xlb-cert \
       --certificate=$LB_CERT \
       --private-key=$LB_PRIVATE_KEY \
       --region=us-west1
      
    3. 使用区域 SSL 证书通过 gcloud beta compute target-https-proxies create 命令创建目标代理。

      gcloud beta compute target-https-proxies create l7-xlb-proxy \
       --url-map=regional-l7-xlb-map \
       --region=us-west1 \
       --ssl-certificates=l7-xlb-cert
      
  6. 创建转发规则。

    对于 HTTP

    使用带有正确标志的 gcloud beta compute forwarding-rules create 命令。

    gcloud beta compute forwarding-rules create l7-xlb-forwarding-rule \
      --load-balancing-scheme=EXTERNAL_MANAGED \
      --network-tier=STANDARD \
      --network=lb-network \
      --address=ADDRESS_NAME \
      --ports=80 \
      --region=us-west1 \
      --target-http-proxy=l7-xlb-proxy \
      --target-http-proxy-region=us-west1
    

    对于 HTTPS

    使用带有正确标志的 gcloud beta compute forwarding-rules create 命令创建转发规则。

    gcloud beta compute forwarding-rules create l7-xlb-forwarding-rule \
      --load-balancing-scheme=EXTERNAL_MANAGED \
      --network-tier=STANDARD \
      --network=lb-network \
      --address=ADDRESS_NAME \
      --ports=443 \
      --region=us-west1 \
      --target-https-proxy=l7-xlb-proxy \
      --target-https-proxy-region=us-west1
    

API

regionHealthChecks.insert 方法发出 POST 请求以创建健康检查,注意要将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/beta/projects/<var>PROJECT_ID</var>/regions/{region}/healthChecks
{
  "name": "l7-xlb-basic-check",
  "type": "HTTP",
  "httpHealthCheck": {
    "portSpecification": "USE_SERVING_PORT"
  }
}

regionBackendServices.insert 方法发出 POST 请求以创建区域后端服务,注意要将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/beta/projects/<var>PROJECT_ID</var>/regions/us-west1/backendServices
{
  "name": "l7-xlb-backend-service",
  "backends": [
    {
      "group": "projects/<var>PROJECT_ID</var>/zones/us-west1-a/instanceGroups/l7-xlb-backend-example",
      "balancingMode": "UTILIZATION"
    }
  ],
  "healthChecks": [
    "projects/<var>PROJECT_ID</var>/regions/us-west1/healthChecks/l7-xlb-basic-check"
  ],
  "loadBalancingScheme": "EXTERNAL_MANAGED"
}

regionUrlMaps.insert 方法发出 POST 请求以创建网址映射,注意要将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/beta/projects/<var>PROJECT_ID</var>/regions/us-west1/urlMaps
{
  "name": "regional-l7-xlb-map",
  "defaultService": "projects/<var>PROJECT_ID</var>/regions/us-west1/backendServices/l7-xlb-backend-service"
}

regionTargetHttpProxies.insert 方法发出 POST 请求以创建目标 HTTP 代理,注意要将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/regions/us-west1/targetHttpProxy
{
  "name": "l7-xlb-proxy",
  "urlMap": "projects/PROJECT_ID/global/urlMaps/regional-l7-xlb-map",
  "region": "us-west1"
}

forwardingRules.insert 方法发出 POST 请求以创建转发规则,注意要将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/regions/us-west1/forwardingRules
{
  "name": "l7-xlb-forwarding-rule",
  "IPAddress": "10.1.2.99",
  "IPProtocol": "TCP",
  "portRange": "80-80",
  "target": "projects/PROJECT_ID/regions/us-west1/targetHttpProxies/l7-xlb-proxy",
  "loadBalancingScheme": "EXTERNAL_MANAGED",
  "network": "projects/PROJECT_ID/global/networks/lb-network",
  "networkTier": "STANDARD",
}

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

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

NAME                  TYPE     DATA
www                   A        30.90.80.100
@                     A        30.90.80.100

如果您使用的是 Google Domains,请参阅 Google Domains 帮助页面了解详情。

测试发送到您的实例的流量

现在负载均衡服务已运行,您可以将流量发送到转发规则并会发现流量被分散到不同的实例。

Cloud 控制台

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

    转到“负载均衡”

  2. 点击您刚刚创建的负载均衡器。
  3. 后端部分中,确认虚拟机运行状况良好。运行状况良好列应该会填充相应信息,指示两个虚拟机运行状况都良好 (2/2)。否则,请先尝试重新加载页面。Google Cloud 控制台可能需要一些时间才能指示虚拟机运行状况良好。如果几分钟后后端似乎仍运行状况不佳,请检查防火墙配置以及分配给后端虚拟机的网络标记。
  4. 在 Google Cloud 控制台显示后端实例运行状况良好后,您可使用网络浏览器转到 https://IP_ADDRESS(或 http://IP_ADDRESS),来测试您的负载均衡器。将 IP_ADDRESS 替换为负载均衡器的 IP 地址
  5. 如果您使用自签名证书来测试 HTTPS,您的浏览器将显示警告。您必须明确指示浏览器接受自签名证书。
  6. 您的浏览器应该会呈现一个页面,其中的内容显示提供该页面的实例的名称以及其可用区(例如,Page served from: lb-backend-example-xxxx)。如果您的浏览器未呈现此页面,请查看本指南中的配置设置。

gcloud

请记下预留的 IPv4 地址:

gcloud beta compute addresses describe ADDRESS_NAME \
    --format="get(address)" \
    --region="us-west1"

您可以使用网络浏览器转到 https://IP_ADDRESS(或 http://IP_ADDRESS)来测试您的负载均衡器。将 IP_ADDRESS 替换为负载均衡器的 IP 地址

如果您使用自签名证书来测试 HTTPS,您的浏览器将显示警告。您必须明确指示浏览器接受自签名证书。

您的浏览器应会打开一个页面,其中包含有关后端实例的极少量信息。如果您的浏览器没有打开此页面,请检查本指南中的配置设置。

其他配置选项

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

启用会话亲和性

这些过程介绍了如何为示例区域级外部 HTTP(S) 负载均衡器更新后端服务,以便后端服务使用生成的 Cookie 亲和性、标头字段亲和性或 HTTP Cookie 亲和性。

启用生成的 Cookie 亲和性后,负载均衡器会针对第一个请求发出一个 Cookie。对于具有相同 Cookie 的每个后续请求,负载均衡器会将请求定向到同一个后端虚拟机或端点。对于外部 HTTP(S) 负载均衡器,Cookie 名为 GCILB

启用标头字段亲和性时,负载均衡器会根据 --custom-request-header 标志中指定的 HTTP 标头的值将请求路由到 NEG 中的后端虚拟机或端点。仅当负载平衡位置政策为 RING_HASHMAGLEV 且后端服务的一致性哈希指定 HTTP 标头的名称时,标头字段亲和性才有效。

启用 HTTP Cookie 亲和性后,负载平衡器会根据带有可选 --affinity-cookie-ttl 标志的 HTTP_COOKIE 标志中指定的 HTTP Cookie,将请求路由到 NEG 中的后端虚拟机或端点。如果客户端未在其 HTTP 请求中提供 Cookie,则代理会生成 Cookie 并通过 Set-Cookie 标头将其返回给客户端。仅当负载平衡位置政策为 RING_HASHMAGLEV 且后端服务的一致性哈希指定 HTTP Cookie 时,HTTP Cookie 亲和性才有效。

Cloud Console

如需针对后端服务启用或更改会话亲和性,请执行以下操作:

  1. 转到 Google Cloud Console 中的“负载均衡”页面。
    转到“负载平衡”
  2. 点击您刚刚创建的负载均衡器。
  3. 点击后端
  4. 点击 l7-xlb-backend-service(您为此示例创建的后端服务的名称),然后点击修改
  5. 后端服务详情页面上,点击高级配置
  6. 会话亲和性下,从菜单中选择所需的会话亲和性类型。
  7. 点击更新

gcloud

使用以下 gcloud 命令将 l7-xlb-backend-service 后端服务更新为不同类型的会话亲和性:

gcloud beta compute backend-services update l7-xlb-backend-service \
    --session-affinity=[GENERATED_COOKIE | HEADER_FIELD | HTTP_COOKIE | CLIENT_IP]
    --region=us-west1

API

如需设置会话亲和性,请向 regionBackendServices/patch 方法发出 PATCH 请求。

PATCH https://compute.googleapis.com/compute/beta/projects/[PROJECT_ID]/regions/us-west1/regionBackendServices/l7-xlb-backend-service
{
  "sessionAffinity": ["GENERATED_COOKIE" | "HEADER_FIELD" | "HTTP_COOKIE" | "CLIENT_IP" ]
}

后续步骤