设置内部 HTTP(S) 负载平衡

本文档介绍了如何为 Compute Engine 虚拟机上运行的服务配置内部 HTTP(S) 负载平衡。

如需为在 GKE pod 中运行的服务配置负载平衡,请参阅使用独立 NEG 的容器原生负载平衡将内部 HTTP(S) 负载平衡器关联到独立 NEG 部分。

内部 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. 一个子网用于后端(实例组和 NEG)和转发规则。该子网的主要 IP 地址范围为 10.1.2.0/24

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

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

  3. 后端实例。本示例图演示了以下后端部署:

    1. Compute Engine 虚拟机
    2. 添加到独立网络端点组 (NEG) 的 Google Kubernetes Engine (GKE) 后端
  4. 实例组和 NEG:

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

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

  5. 用于报告后端就绪情况的地区运行状况检查。

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

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

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

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

    与转发规则关联的内部 IP 地址可以来自任何子网(位于同一网络和地区),其 --purpose 标志设置为 PRIVATE。请注意以下事项:

    • 该 IP 地址可以(但并非必须)与后端实例组来自同一子网。
    • 该 IP 地址不得来自 --purpose 标志设置为 INTERNAL_HTTPS_LOAD_BALANCER 的预留代理专用子网。

配置网络和子网

您需要一个包含两个子网的 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 地址范围。

为后端配置网络和子网

控制台

  1. 转到 Google Cloud Console 中的“VPC 网络”页面。
    转到“VPC 网络”页面
  2. 点击创建 VPC 网络
  3. 对于名称,请输入 lb-network
  4. 子网部分中执行以下操作:
    • 子网创建模式设置为自定义
    • 新子网部分中,输入以下信息:
      • 名称backend-subnet
      • 地区us-west1
      • IP 地址范围10.1.2.0/24
    • 点击完成
  5. 点击创建

gcloud

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

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

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

API

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

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks

{
  "routingConfig": {
    "routingMode": "REGIONAL"
  },
  "name": "lb-network",
  "autoCreateSubnetworks": false
}

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

POST https://compute.googleapis.com/compute/v1/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",
}

配置代理专用子网

代理专用子网适用于 us-west1 地区内的所有内部 HTTP(S) 负载平衡器。

控制台

如果您使用的是 Google Cloud Console,则可以稍后在“负载平衡”页面上创建代理专用子网。

gcloud

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

gcloud compute networks subnets create proxy-only-subnet \
  --purpose=INTERNAL_HTTPS_LOAD_BALANCER \
  --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/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": "INTERNAL_HTTPS_LOAD_BALANCER",
  "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
    • 来源过滤条件IP 地址范围
    • 来源 IP 地址范围0.0.0.0/0
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 tcp 复选框,然后输入 22 作为端口号。
  3. 点击创建
  4. 再次点击创建防火墙规则,创建允许 Google Cloud 运行状况检查的规则:
    • 名称fw-allow-health-check
    • 网络lb-network
    • 流量方向入站
    • 对匹配项执行的操作允许
    • 目标指定的目标标记
    • 目标标记load-balanced-backend
    • 来源过滤条件IP 地址范围
    • 来源 IP 地址范围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
    • 来源过滤条件IP 地址范围
    • 来源 IP 地址范围10.129.0.0/23
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 tcp 复选框,然后输入 80, 443, 8080 作为端口号。
  7. 点击创建

gcloud

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

    gcloud 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 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) 负载平衡器的代理连接到您的后端。

    gcloud compute firewall-rules create fw-allow-proxies \
      --network=lb-network \
      --action=allow \
      --direction=ingress \
      --source-ranges=10.129.0.0/23 \
      --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/v1/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。

POST https://compute.googleapis.com/compute/v1/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/v1/projects/{project}/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) 负载平衡器的网址映射转发到您的后端虚拟机。

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

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

创建代管式实例组

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

Cloud Console

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

    转到“实例组”页面

  2. 点击创建实例组
  3. 选择左侧的新建代管实例组
  4. 对于名称,请输入 l7-ilb-backend-example
  5. 位置下方,选择单个区域
  6. 对于地区,请选择 us-west1
  7. 对于区域,请选择 us-west1-a
  8. 实例模板下,选择创建新的实例模板

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

      #! /bin/bash
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      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
      systemctl restart apache2'
      
    4. 网络下,选择 lb-network 作为网络,对于子网,选择 backend-subnet

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

    6. 点击保存并继续

  9. 指定要在组中创建的实例数。

    对于此示例,您可以在自动扩缩模式下选择以下选项:

    • 不配置自动扩缩
    • 实例数下,输入 2

    (可选)在界面的自动扩缩部分中,您可以将实例组配置为根据实例 CPU 使用情况自动添加或移除实例

  10. 点击创建以创建新实例组。

gcloud

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

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

    gcloud compute instance-templates create l7-ilb-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
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    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
    systemctl restart apache2'
    
  2. 使用 gcloud compute instance-groups managed create 命令在该区域中创建一个代管式实例组。

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

API

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

POST https://compute.googleapis.com/compute/v1/projects/[project-id]/global/instanceTemplates
{
  "name":"l7-ilb-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\napt-get update\napt-get install apache2 -y\na2ensite default-ssl\na2enmod ssl\nvm_hostname=\"$(curl -H \"Metadata-Flavor:Google\" \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\necho \"Page served from: $vm_hostname\" | \\\ntee /var/www/html/index.html\nsystemctl 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
       }
     ]
  }
}

使用 instanceGroupManagers.insert 方法在每个区域中创建一个代管式实例组,注意要将 PROJECT_ID 替换为您的项目 ID。

POST https://compute.googleapis.com/compute/v1/projects/[project-id]/zones/{zone}/instanceGroupManagers
{
  "name": "l7-ilb-backend-example",
  "zone": "projects/[project-id]/zones/us-west1-a",
  "instanceTemplate": "projects/[project-id]/global/instanceTemplates/l7-ilb-backend-template",
  "baseInstanceName": "l7-ilb-backend-example",
  "targetSize": 2
}

配置负载平衡器

下面的示例介绍了如何创建以下内部 HTTP(S) 负载平衡器资源:

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

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

代理可用性

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

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

Cloud Console

选择负载平衡器类型

  1. 转到 Google Cloud Console 中的“负载平衡”页面。
    转到“负载平衡”页面
  2. HTTP(S) 负载平衡下,点击开始配置
  3. 选择“仅在我的虚拟机之间”。此设置表示负载平衡器是内部的。
  4. 点击继续

准备负载平衡器

  1. 对于负载平衡器的名称,请输入 l7-ilb-map
  2. 对于地区,请选择 us-west1
  3. 对于网络,请选择 lb-network
  4. 不关闭窗口继续操作。

预留代理专用子网

对于内部 HTTP(S) 负载平衡,预留代理子网:

  1. 点击 Reserve a Subnet(预留子网)。
  2. 名称输入 proxy-only-subnet
  3. 对于 IP 地址范围,请输入 10.129.0.0/23
  4. 点击添加

配置后端服务

  1. 点击后端配置
  2. 创建或选择后端服务菜单中,选择创建后端服务
  3. 将后端服务的名称设置为 l7-ilb-backend-service
  4. 后端类型设置为“实例组”
  5. 新后端部分:
    1. 实例组设置为 l7-ilb-backend-example
    2. 端口号设置为 80
    3. 平衡模式设置为“利用率”
    4. 点击完成
  6. 运行状况检查部分,使用以下参数选择“创建运行状况检查”
    1. 名称l7-ilb-basic-check
    2. 协议:HTTP
    3. 端口80
    4. 点击保存并继续
  7. 点击创建

配置网址映射

点击主机和路径规则。确保 l7-ilb-backend-service 是任何不匹配的主机和任何不匹配的路径的唯一后端服务。

如需了解流量管理,请参阅设置流量管理

配置前端

对于 HTTP

  1. 点击前端配置
  2. 点击添加前端 IP 和端口
  3. 名称设置为“l7-ilb-forwarding-rule”
  4. 协议设置为“HTTP”
  5. 子网设置为 backend-subnet
  6. 内部 IP 下,选择“预留静态内部 IP 地址”
  7. 在显示的面板中提供以下详细信息:
    1. 名称:l7-ilb-ip
    2. 静态 IP 地址部分,选择“让我选择”
    3. 自定义 IP 地址部分,输入 10.1.2.99
    4. 点击保留
  8. 端口设置为 80
  9. 点击完成

对于 HTTPS

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

  1. 点击前端配置
  2. 点击添加前端 IP 和端口
  3. 名称字段中,输入 l7-ilb-forwarding-rule
  4. 协议字段中,选择 HTTPS (includes HTTP/2)
  5. 子网设置为 backend-subnet
  6. 内部 IP 下,选择“预留静态内部 IP 地址”
  7. 在显示的面板中提供以下详细信息:
    1. 名称:l7-ilb-ip
    2. 静态 IP 地址部分,选择“让我选择”
    3. 自定义 IP 地址部分,输入 10.1.2.99
    4. 点击保留
  8. 确保将端口设置为 443,以允许 HTTPS 流量。
  9. 点击证书下拉列表。
    1. 如果您已经拥有要用作主要 SSL 证书的自行管理的 SSL 证书资源,请从下拉菜单中选择该证书。
    2. 否则,请选择创建新证书
      1. 填写名称 l7-ilb-cert
      2. 在相应字段中上传您的 PEM 格式的文件:
        • 公钥证书
        • 证书链
        • 私钥
      3. 点击创建
  10. 如需添加除了主要 SSL 证书资源之外的其他证书资源,请执行以下操作:
    1. 点击添加证书
    2. 证书列表中选择一个证书,或点击创建新证书并按照上述说明操作。
  11. 点击完成

完成配置

点击创建

gcloud

  1. 使用 gcloud compute health-checks create http 命令定义 HTTP 运行状况检查。

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

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

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

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

    对于 HTTP

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

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

    对于 HTTPS

    如需了解如何创建 SSL 证书资源,请参阅 SSL 证书。内部 HTTP(S) 负载平衡器目前不支持由 Google 管理的证书。

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

    export LB_CERT=path to PEM-formatted file
    
    export LB_PRIVATE_KEY=path to PEM-formatted file
    

    使用 gcloud compute ssl-certificates create 命令创建地区 SSL 证书。

    gcloud compute ssl-certificates create l7-ilb-cert \
      --certificate=$LB_CERT \
      --private-key=$LB_PRIVATE_KEY \
      --region=us-west1
    

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

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

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

    对于 HTTP

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

    gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=lb-network \
      --subnet=backend-subnet \
      --address=10.1.2.99 \
      --ports=80 \
      --region=us-west1 \
      --target-http-proxy=l7-ilb-proxy \
      --target-http-proxy-region=us-west1
    

    对于 HTTPS

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

    gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=lb-network \
      --subnet=backend-subnet \
      --address=10.1.2.99 \
      --ports=443 \
      --region=us-west1 \
      --target-https-proxy=l7-ilb-proxy \
      --target-https-proxy-region=us-west1
    

API

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

POST https://compute.googleapis.com/compute/v1/projects/[project-id]/regions/{region}/healthChecks
{
  "name": "l7-ilb-basic-check",
  "type": "HTTP",
  "httpHealthCheck": {
    "portSpecification": "USE_SERVING_PORT"
  }
}

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

POST https://compute.googleapis.com/compute/v1/projects/[project-id]/regions/us-west1/backendServices
{
  "name": "l7-ilb-backend-service",
  "backends": [
    {
      "group": "projects/[project-id]/zones/us-west1-a/instanceGroups/l7-ilb-backend-example",
      "balancingMode": "UTILIZATION"
    }
  ],
  "healthChecks": [
    "projects/[project-id]/regions/us-west1/healthChecks/l7-ilb-basic-check"
  ],
  "loadBalancingScheme": "INTERNAL_MANAGED"
}

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

POST https://compute.googleapis.com/compute/v1/projects/[project-id]/regions/us-west1/urlMaps
{
  "name": "l7-ilb-map",
  "defaultService": "projects/[project-id]/regions/us-west1/backendServices/l7-ilb-backend-service"
}

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

POST https://compute.googleapis.com/compute/v1/projects/[project-id]/regions/us-west1/targetHttpProxy
{
  "name": "l7-ilb-proxy",
  "urlMap": "projects/[project-id]/global/urlMaps/l7-ilb-map",
  "region": "us-west1"
}

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

POST https://compute.googleapis.com/compute/v1/projects/[project-id]/regions/us-west1/forwardingRules
{
  "name": "l7-ilb-forwarding-rule",
  "IPAddress": "10.1.2.99",
  "IPProtocol": "TCP",
  "portRange": "80-80",
  "target": "projects/[project-id]/regions/us-west1/targetHttpProxies/l7-ilb-proxy",
  "loadBalancingScheme": "INTERNAL_MANAGED",
  "subnetwork": "projects/[project-id]/regions/us-west1/subnetworks/backend-subnet",
  "network": "projects/[project-id]/global/networks/lb-network",
  "networkTier": "PREMIUM",
}

测试

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

gcloud compute instances create l7-ilb-client-us-west1-a \
    --image-family=debian-9 \
    --image-project=debian-cloud \
    --network=lb-network \
    --subnet=backend-subnet \
    --zone=us-west1-a \
    --tags=allow-ssh

测试负载平衡器

登录您刚刚创建的实例,通过测试确定可以通过内部 HTTP(S) 负载平衡器的转发规则 IP 地址访问后端的 HTTP(S) 服务,并且流量正在后端实例之间进行负载平衡。

通过 SSH 连接到每个客户端实例

gcloud compute ssh l7-ilb-client-us-west1-a \
    --zone=us-west1-a

验证 IP 是否提供其主机名

curl 10.1.2.99

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

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

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

运行 100 个请求并确认它们已进行负载平衡

对于 HTTP

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

对于 HTTPS

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

其他配置选项

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

启用会话亲和性

这些过程介绍了如何为示例内部 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. 点击 l7-ilb-backend-service(您为此示例创建的后端服务的名称),然后点击修改
  4. 后端服务详情页面上,点击高级配置
  5. 会话亲和性下,从菜单中选择所需的会话亲和性类型。
  6. 点击更新

gcloud

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

gcloud compute backend-services update l7-ilb-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/v1/projects/[PROJECT_ID]/regions/us-west1/regionBackendServices/l7-ilb-backend-service
{
  "sessionAffinity": ["GENERATED_COOKIE" | "HEADER_FIELD" | "HTTP_COOKIE" | "CLIENT_IP" ]
}

后续步骤