为虚拟机实例组后端设置内部 HTTP(S) 负载均衡

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

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

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

如需配置负载均衡以使用 Private Service Connect 访问 Google API 和服务,请参阅通过使用方 HTTP(S) Service Controls 配置 Private Service Connect

内部 HTTP(S) 负载均衡的设置包括两个部分:

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

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

权限

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

任务 所需角色
创建网络、子网和负载均衡器组件 Compute Network Admin
添加和移除防火墙规则 计算安全管理员
创建实例 Compute 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,这是建议的子网大小。如需了解详情,请参阅代理专用子网

  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 地址可以来自同一网络和区域中的任何子网。请注意以下条件:

    • 该 IP 地址可以(但并非必须)与后端实例组来自同一子网。
    • 该 IP 地址不得来自 --purpose 标志设置为 REGIONAL_MANAGED_PROXY 的预留代理专用子网。
    • 如果要与多个转发规则共享内部 IP 地址,请将 IP 地址的 --purpose 标志设置为 SHARED_LOADBALANCER_VIP

配置网络和子网

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

为了演示全球访问权限,此示例还会在其他区域和子网中再创建一个测试客户端虚拟机:

  • 地区:europe-west1
  • 子网:europe-subnet(其主要 IP 地址范围为 10.3.4.0/24

配置网络和子网

控制台

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

    进入 VPC 网络页面

  2. 点击创建 VPC 网络

  3. 对于名称,输入 lb-network

  4. 子网部分,将子网创建模式设置为自定义

  5. 为负载均衡器的后端创建子网。在新子网部分中,输入以下信息:

    • 名称backend-subnet
    • 区域us-west1
    • IP 地址范围10.1.2.0/24
  6. 点击完成

  7. 点击添加子网

  8. 创建一个子网以演示全球访问权限。在新子网部分中,输入以下信息:

    • 名称europe-subnet
    • 区域europe-west1
    • IP 地址范围10.3.4.0/24
  9. 点击完成

  10. 点击创建

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
    
  3. 使用 gcloud compute networks subnets create 命令europe-west1 区域的 lb-network 网络中创建子网:

    gcloud compute networks subnets create europe-subnet \
        --network=lb-network \
        --range=10.3.4.0/24 \
        --region=europe-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",
}

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

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/europe-west1/subnetworks

{
 "name": "europe-subnet",
 "network": "projects/PROJECT_ID/global/networks/lb-network",
 "ipCidrRange": "10.3.4.0/24",
 "region": "projects/PROJECT_ID/regions/europe-west1",
}

配置代理专用子网

此代理专用子网用于 lb-networkus-west1 区域内所有基于 Envoy 的区域负载均衡器

控制台

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

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

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

    进入 VPC 网络页面

  2. 点击 VPC 网络的名称:lb-network

  3. 点击添加子网

  4. 对于名称,输入 proxy-only-subnet

  5. 对于区域,请选择 us-west1

  6. 用途设置为区域级代管式代理

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

  8. 点击添加

gcloud

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

gcloud 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/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 控制台中,进入防火墙规则页面。

    进入“防火墙规则”

  2. 点击创建防火墙规则,以创建允许传入 SSH 连接的规则:

    • 名称fw-allow-ssh
    • 网络lb-network
    • 流量方向入站
    • 对匹配项执行的操作允许
    • 目标指定的目标标记
    • 目标标记allow-ssh
    • 来源过滤条件IPv4 范围
    • 来源 IPv4 范围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 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) 负载均衡器的代理连接到您的后端。将 source-ranges 设置为该代理专用子网的分配范围,例如 10.129.0.0/23

    gcloud 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/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_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) 负载均衡器的网址映射转发到您的后端虚拟机。

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

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

创建代管式实例组

本部分介绍如何创建模板和代管式实例组。这个代管实例组提供运行示例内部 HTTP(S) 负载均衡器的后端服务器的虚拟机实例。对于您的实例组,您可以定义一个 HTTP 服务并将端口名称映射到相关端口上。负载均衡器的后端服务会将流量转发到已命名的端口。来自客户端的流量在经过负载均衡处理后传送到后端服务器。出于演示目的,后端会传送其自己的主机名。

控制台

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

    转到“实例模板”

    1. 点击创建实例模板
    2. 对于名称,输入 l7-ilb-backend-template
    3. 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 10 (buster)。本文中的说明使用仅 Debian 支持的命令,例如 apt-get
    4. 点击高级选项
    5. 点击网络并配置以下字段:
      1. 对于网络标记,请输入 allow-sshload-balanced-backend
      2. 对于网络接口,请选择以下内容:
        • 网络lb-network
        • 子网backend-subnet
    6. 点击管理。将以下脚本输入启动脚本字段。

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

  2. 创建代管式实例组。在 Google Cloud 控制台中,进入实例组页面。

    进入“实例组”

    1. 点击创建实例组
    2. 选择新的代管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 MIG
    3. 对于名称,输入 l7-ilb-backend-example
    4. 对于位置,选择单个可用区
    5. 对于区域,请选择 us-west1
    6. 对于可用区,请选择 us-west1-a
    7. 对于实例模板,请选择 l7-ilb-backend-template
    8. 指定要在组中创建的实例数。

      对于此示例,请在自动扩缩下指定以下选项:

      • 对于自动扩缩模式,请选择 Off:do not autoscale
      • 对于实例数上限,请输入 2

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

    9. 点击创建

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-10 \
    --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
      vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://metadata.google.internal/computeMetadata/v1/instance/name)"
      sudo echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      sudo 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\nsudo apt-get update\nsudo apt-get install
            apache2 -y\nsudo a2ensite default-ssl\nsudo a2enmod ssl\n
            vm_hostname=\"$(curl -H \"Metadata-Flavor:Google\"
            \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\n
            sudo 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-10"
         },
         "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 区域没有足够的代理容量来容纳新的负载均衡器。如果发生这种情况,Google Cloud 控制台会在您创建负载均衡器时提供一条代理可用性警告消息。如需解决此问题,您可以执行以下任一操作:

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

控制台

选择负载均衡器类型

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

    进入“负载均衡”

  2. HTTP(S) 负载均衡卡中,点击开始配置

  3. 面向互联网或仅限内部部分中,选择仅在我的虚拟机之间。此设置表明负载均衡器是内部的。

  4. 点击继续

准备负载均衡器

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

预留代理专用子网

对于内部 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. 点击创建

配置网址映射

  1. 点击主机和路径规则

  2. 对于模式,选择简单主机和路径规则

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

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

配置前端

对于 HTTP

  1. 点击前端配置
  2. 将转发规则的名称设置为 l7-ilb-forwarding-rule
  3. 协议设置为 HTTP
  4. 子网设置为 backend-subnet
  5. 端口设置为 80
  6. IP 地址下拉列表中,选择创建 IP 地址,然后输入以下值:
    1. 名称:l7-ilb-ip
    2. 静态 IP 地址:让我选择
    3. 自定义 IP 地址10.1.2.99
    4. 点击预留
  7. 点击完成

对于 HTTPS

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

  1. 点击前端配置
  2. 将转发规则的名称设置为 l7-ilb-forwarding-rule
  3. 协议设置为 HTTPS (includes HTTP/2)
  4. 子网设置为 backend-subnet
  5. 确保将端口设置为 443,以允许 HTTPS 流量。
  6. IP 地址下拉列表中,选择创建 IP 地址,然后输入以下值:
    1. 名称:l7-ilb-ip
    2. 静态 IP 地址:让我选择
    3. 自定义 IP 地址10.1.2.99
    4. 点击预留
  7. 点击证书下拉列表。
    1. 如果您已经拥有要用作主要 SSL 证书的自行管理的 SSL 证书资源,请从列表中选择该证书。
    2. 否则,请选择创建新证书
      1. 将证书的名称设置为 l7-ilb-cert
      2. 在相应字段中上传您的 PEM 格式的文件:
        • 公钥证书
        • 证书链
        • 私钥
      3. 点击创建
  8. 如需添加除了主要 SSL 证书资源之外的其他证书资源,请执行以下操作:
    1. 点击添加证书
    2. 证书列表中选择一个证书,或点击创建新证书并按照上述说明操作。
  9. SSL 政策列表中选择一项 SSL 政策。如果您尚未创建任何 SSL 政策,则应用默认 GCP SSL 政策
  10. 点击完成

检查配置

检查负载均衡器,确保其已按需要配置,然后点击创建

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"
}

对于 HTTP

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"
}

对于 HTTPS

读取证书和私钥文件,然后创建 SSL 证书。以下示例展示了如何使用 Python 执行此操作。

from pprint import pprint
from typing import Union

from googleapiclient import discovery

def create_regional_certificate(
    project_id: str,
    region: str,
    certificate_file: Union[str, Path],
    private_key_file: Union[str, Path],
    certificate_name: str,
    description: str = "Certificate created from a code sample."
) -> None:
    """
    Create a regional SSL self-signed certificate within your Google Cloud project.

    Args:
        project_id: project ID or project number of the Cloud project you want to use.
        region: name of the region you want to use.
        certificate_file: path to the file with the certificate you want to create in your project.
        private_key_file: path to the private key you used to sign the certificate with.
        certificate_name: name for the certificate once it's created in your project.
        description: description of the certificate.
    """
    service = discovery.build("compute", "v1")

    # Read the cert into memory
    with open(certificate_file) as f:
        _temp_cert = f.read()

    # Read the private_key into memory
    with open(private_key_file) as f:
        _temp_key = f.read()

    # Now that the certificate and private key are in memory, you can create the
    # certificate resource
    ssl_certificate_body = {
        "name": certificate_name,
        "description": description,
        "certificate": _temp_cert,
        "privateKey": _temp_key,
    }
    request = service.regionSslCertificates().insert(
        project=project_id, region=region, body=ssl_certificate_body
    )
    response = request.execute()
    pprint(response)

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

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/regionTargetHttpsProxy

{
"name": "l7-ilb-proxy",
"urlMap": "projects/PROJECT_ID/regions/us-west1/urlMaps/l7-ilb-map",
"sslCertificates": /projects/PROJECT_ID/regions/us-west1/sslCertificates/SSL_CERT_NAME
}

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/targetHttpsProxies/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",
}

测试负载均衡器

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

控制台

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

    转到虚拟机实例

  2. 点击创建实例

  3. 名称设置为 l7-ilb-client-us-west1-a

  4. 地区设置为 us-west1-a

  5. 点击高级选项

  6. 点击网络并配置以下字段:

    1. 对于网络标记,请输入 allow-ssh
    2. 对于网络接口,请选择以下内容:
      1. 网络lb-network
      2. 子网backend-subnet
  7. 点击创建

gcloud

gcloud compute instances create l7-ilb-client-us-west1-a \
    --image-family=debian-10 \
    --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
}

其他配置选项

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

启用全球访问权限

您可以为负载均衡器启用全球访问权限,以使其可供所有区域的客户端访问。示例负载均衡器的后端仍必须位于一个区域 (us-west1) 中。

具有全球访问权限的内部 HTTP(S) 负载均衡器(点击可放大)
具有全球访问权限的内部 HTTP(S) 负载均衡器(点击可放大)

您无法修改现有的区域转发规则来启用全球访问权限。为此,您必须创建新的转发规则。此外,启用全球访问权限的转发规则创建后,便无法修改。如需停用全球访问权限,您必须创建新的区域访问权限转发规则,并删除以前的全球访问权限转发规则。

如需配置全球访问权限,请更改以下配置。

控制台

您无法使用 Google Cloud 控制台启用全球访问权限。请改用 gcloud CLI 或 REST API。

gcloud

  1. 使用 --allow-global-access 标志为负载均衡器创建新的转发规则。

    对于 HTTP

    gcloud compute forwarding-rules create l7-ilb-forwarding-rule-global-access \
      --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 \
      --allow-global-access
    

    对于 HTTPS

    gcloud compute forwarding-rules create l7-ilb-forwarding-rule-global-access \
      --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 \
      --allow-global-access
    

  2. 您可以使用 gcloud compute forwarding-rules describe 命令来确定转发规则是否启用了全球访问权限。例如:

    gcloud compute forwarding-rules describe l7-ilb-forwarding-rule-global-access \
      --region=us-west1 \
      --format="get(name,region,allowGlobalAccess)"
    

    启用全球访问权限后,在输出中转发规则的名称和区域之后会出现 True 一词。

创建客户端虚拟机以测试全球访问权限

控制台

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

    转到虚拟机实例

  2. 点击创建实例

  3. 名称设置为 europe-client-vm

  4. 地区设置为 europe-west1-b

  5. 点击高级选项

  6. 点击网络并配置以下字段:

    1. 对于网络标记,请输入 allow-ssh
    2. 对于网络接口,请选择以下内容:
      • 网络lb-network
      • 子网europe-subnet
  7. 点击创建

gcloud

europe-west1-b 可用区中创建客户端虚拟机。

gcloud compute instances create europe-client-vm \
    --zone=europe-west1-b \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=europe-subnet

连接到虚拟机客户端并测试连接

  1. 使用 ssh 连接到客户端实例。

    gcloud compute ssh europe-client-vm \
        --zone=europe-west1-b
    
  2. 按照与从 us-west1 区域中的 vm-client 相同的方式测试与负载均衡器的连接。

    curl http://10.1.2.99
    

启用会话亲和性

这些过程介绍了如何为示例内部 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 亲和性才有效。

控制台

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

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

    进入“负载均衡”

  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" ]
}

限制哪些客户端可以向负载均衡器发送流量

您可以通过在客户端上配置出站防火墙规则,限制客户端与内部 HTTP(S) 负载均衡器转发规则 VIP 的通信。您可以根据服务帐号标记在特定客户端虚拟机上设置这些防火墙规则。

您无法使用防火墙规则将入站流量限制到特定的内部 HTTP(S) 负载均衡器转发规则 VIP。与转发规则 VIP 位于同一 VPC 网络和同一区域的任何客户端通常都可以将流量发送到该转发规则 VIP。

此外,发送到后端的所有请求都来自于使用代理专用子网范围内的 IP 地址的代理。您无法创建防火墙规则来根据客户端使用的转发规则 VIP 允许或拒绝这些后端上的入站流量。

以下示例说明了如何使用出站防火墙规则来限制到负载均衡器的转发规则 VIP 的流量。

控制台

为了识别客户端虚拟机,您需要标记要限制的特定虚拟机。这些标记用于将防火墙规则与标记的客户端虚拟机相关联。然后,在这些步骤中,在 TARGET_TAG 字段中添加标记。

请使用一个或多个防火墙规则进行设置。

单个出站防火墙规则

您可以配置一个防火墙出站规则,以拒绝从标记客户端虚拟机到负载均衡器的 VIP 的所有出站流量。

  1. 在 Google Cloud 控制台中,进入防火墙规则页面。

    进入“防火墙规则”

  2. 点击创建防火墙规则以创建一个规则,拒绝从标记的客户端虚拟机到负载均衡器的 VIP 的出站流量。

    • 名称fr-deny-access
    • 网络lb-network
    • 优先级100
    • 流量方向出站
    • 对匹配项执行的操作拒绝
    • 目标指定的目标标记
    • 目标标记TARGET_TAG
    • 目标过滤条件IP 范围
    • 目标 IP 地址范围10.1.2.99
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 tcp 复选框,然后输入 80 作为端口号。
  3. 点击创建

多个出站防火墙规则

扩缩性更高的方法涉及设置两个规则。默认的低优先级规则禁止所有客户端访问负载均衡器的 VIP。第二个优先级较高的规则允许一部分标记客户端访问负载均衡器的 VIP。只有标记的虚拟机才能访问 VIP。

  1. 在 Google Cloud 控制台中,进入防火墙规则页面。

    进入“防火墙规则”

  2. 点击创建防火墙规则,创建优先级较低的规则以默认拒绝访问:

    • 名称fr-deny-all-access-low-priority
    • 网络lb-network
    • 优先级200
    • 流量方向出站
    • 对匹配项执行的操作拒绝
    • 目标指定的目标标记
    • 目标标记TARGET_TAG
    • 目标过滤条件IP 范围
    • 目标 IP 地址范围10.1.2.99
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 tcp 复选框,然后输入 80 作为端口号。
  3. 点击创建

  4. 点击创建防火墙规则,创建优先级较高的规则,以允许来自某些标记实例的流量。

    • 名称fr-allow-some-access-high-priority
    • 网络lb-network
    • 优先级100
    • 流量方向出站
    • 对匹配项执行的操作允许
    • 目标指定的目标标记
    • 目标标记TARGET_TAG
    • 目标过滤条件IP 范围
    • 目标 IP 地址范围10.1.2.99
    • 协议和端口
      • 选择指定的协议和端口
      • 选中 tcp 复选框,然后输入 80 作为端口号。
  5. 点击创建

gcloud

为了识别客户端虚拟机,您需要标记要限制的特定虚拟机。然后,在这些步骤中,在 TARGET_TAG 字段中添加标记。

请使用一个或多个防火墙规则进行设置。

单个出站防火墙规则

您可以配置一个防火墙出站规则,以拒绝从标记客户端虚拟机到负载均衡器的 VIP 的所有出站流量。

gcloud compute firewall-rules create fr-deny-access \
  --network=lb-network \
  --action=deny \
  --direction=egress \
  --rules=tcp \
  --priority=100 \
  --destination-ranges=10.1.2.99 \
  --target-tags=TARGET_TAG

多个出站防火墙规则

扩缩性更高的方法涉及设置两个规则。默认的低优先级规则禁止所有客户端访问负载均衡器的 VIP。第二个优先级较高的规则允许一部分标记客户端访问负载均衡器的 VIP。只有标记的虚拟机才能访问 VIP。

  1. 创建优先级较低的规则:

    gcloud compute firewall-rules create fr-deny-all-access-low-priority \
    --network=lb-network \
    --action=deny \
    --direction=egress \
    --rules=tcp \
    --priority=200 \
    --destination-ranges=10.1.2.99
    
  2. 创建优先级较高的规则:

    gcloud compute firewall-rules create fr-allow-some-access-high-priority \
    --network=lb-network \
    --action=allow \
    --direction=egress \
    --rules=tcp \
    --priority=100 \
    --destination-ranges=10.1.2.99 \
    --target-tags=TARGET_TAG
    

如需使用服务帐号(而不是标记)来控制访问,请在创建防火墙规则时使用 --target-service-accounts 而不是 --target-tags 标志。

根据子网扩缩对内部 HTTP(S) 负载均衡器后端的受限访问

随着转发规则的增加,维护单独的防火墙规则或向现有规则添加新的负载均衡 IP(如上面部分所述)变得非常不方便。防止这种情况的一个方法是从预留子网中分配转发规则 IP 地址。然后,通过将预留子网用作防火墙规则的目标范围来允许或阻止来自标记实例或服务帐号的流量。这样,您就可以有效地控制对一组转发规则 VIP 的访问,而无需维护每个 VIP 的防火墙出站规则。

下面简要说明了设置步骤(假设您要分别创建所有其他必需的负载均衡器资源)。

gcloud

  1. 创建一个区域子网,用于为转发规则分配负载均衡的 IP 地址:

    gcloud compute networks subnets create l7-ilb-restricted-subnet \
      --network=lb-network \
      --region=us-west1 \
      --range=10.127.0.0/24
    
  2. 创建使用新分配子网中的地址的转发规则。在此示例中,我们从上一步中创建的子网中选择 10.127.0.1

    gcloud compute forwarding-rules create l7-ilb-forwarding-rule-restricted \
      --load-balancing-scheme=INTERNAL_MANAGED \
      --network=lb-network \
      --subnet=l7-ilb-restricted-subnet \
      --address=10.127.0.1 \
      --ports=80 \
      --region=us-west1 \
      --target-http-proxy=l7-ilb-proxy \
      --target-http-proxy-region=us-west1
    
  3. 创建一个防火墙规则以限制流向转发规则子网 (l7-ilb-restricted-subnet) 中 IP 地址范围的流量:

    gcloud compute firewall-rules create restrict-traffic-to-subnet \
      --network=lb-network \
      --action=deny \
      --direction=egress \
      --rules=tcp:80 \
      --priority=100 \
      --destination-ranges=10.127.0.0/24 \
      --target-tags=TARGET_TAG
    

配置后端子集化

后端子集化通过为每个代理实例分配后端子集来提高性能和可扩缩性。为后端服务启用子集化后,系统便会使用该功能调整每个代理实例使用的后端数量,如下所示:

  • 随着参与负载均衡器的代理实例数量的增加,子集的大小会减小。

  • 当网络中的后端总数超过单个代理实例的容量时,系统会自动为启用了后端子集化的每项服务减小子集的大小。

下面的示例介绍了如何创建内部 HTTP(S) 负载均衡器资源并启用后端子集化

  1. 使用示例配置创建区域后端服务 l7-ilb-backend-service
  2. 通过将 --subsetting-policy 指定为 CONSISTENT_HASH_SUBSETTING 来启用后端子集化。负载均衡方案为 INTERNAL_MANAGED

    gcloud

    使用以下 gcloud 命令用后端子集化更新 l7-ilb-backend-service

    gcloud beta compute backend-services update l7-ilb-backend-service \
       --region=us-west1 \
       --subsetting-policy=CONSISTENT_HASH_SUBSETTING
    

    API

    regionBackendServices/patch 方法发出 PATCH 请求。

    PATCH https://compute.googleapis.com/compute/beta/projects/PROJECT_ID/regions/us-west1/backendServices/l7-ilb-backend-service

    {
     "subsetting":
    {
     "policy": CONSISTENT_HASH_SUBSETTING
    }
    }
    

您还可以通过设置 localityLbPolicy 政策来优化后端负载均衡。如需了解详情,请参阅流量政策

在多个内部转发规则中共用 IP 地址

如果多个内部转发规则共用一个内部 IP 地址,您必须预留该 IP 地址,并将其 --purpose 标志设置为 SHARED_LOADBALANCER_VIP

gcloud

gcloud compute addresses create IP_ADDRESS_NAME \
    --region=us-west1 \
    --subnet=backend-subnet \
    --purpose=SHARED_LOADBALANCER_VIP

如果您需要将 HTTP 流量重定向到 HTTPS,则可以创建两条共用一个 IP 地址的转发规则。如需了解详情,请参阅为内部 HTTP(S) 负载均衡器设置 HTTP 到 HTTPS 重定向

后续步骤