设置具有虚拟机实例组后端的区域级内部应用负载均衡器

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

如需为 Google Kubernetes Engine (GKE) Pod 中运行的服务配置负载均衡,请参阅使用独立 NEG 实现容器原生负载均衡将区域级内部应用负载均衡器连接到独立 NEG 部分。

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

内部应用负载均衡器的设置包含两个部分:

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

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

权限

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

任务 所需角色
创建网络、子网和负载均衡器组件 Compute Network Admin
添加和移除防火墙规则 计算安全管理员
创建实例 Compute Instance Admin

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

设置概览

您可以按照以下总体配置流程所述配置内部应用负载均衡器。以下带编号的步骤对应于该图中的标号。

内部应用负载均衡器编号组件。
内部应用负载均衡器编号组件(点击可放大)。

如上图所示,该示例在 us-west1 区域的 VPC 网络中创建了一个内部应用负载均衡器,该均衡器包含一项后端服务和两个后端组。

图中显示了以下内容:

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

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

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

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

  3. 后端 Compute Engine 虚拟机实例。

  4. Compute Engine 虚拟机部署所用的托管式实例组或非托管式实例组。

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

  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

    本页面上的示例会使用为区域级内部应用负载均衡器的转发规则预留的内部 IP 地址,而不是允许分配临时内部 IP 地址。我们建议的最佳实践是,为转发规则预留 IP 地址。

配置网络和子网

您需要一个包含两个子网的 VPC 网络:一个用于负载均衡器的后端,另一个用于负载均衡器的代理。内部应用负载均衡器是区域性的。对于 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 控制台,则可以稍后在负载均衡页面上创建代理专用子网。

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

  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。适用于负载均衡实例的入站流量规则,该规则允许从内部应用负载均衡器的代管式代理发送到端口 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 规则以允许内部应用负载均衡器的代理连接到您的后端。将 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"
}

预留负载均衡器的 IP 地址

默认情况下,每个转发规则使用一个 IP 地址。您可以预留一个共享 IP 地址,这样就可以将同一 IP 地址用于多个转发规则。但是,如果您要使用 Private Service Connect 发布负载均衡器,请勿将共享 IP 地址用于转发规则。

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

控制台

您可以使用 Google Cloud 控制台预留独立内部 IP 地址。

  1. 转到 VPC 网络页面。

    转到 VPC 网络页面

  2. 点击用于配置环境之间的混合连接的网络。
  3. 点击静态内部 IP 地址,然后点击预留静态地址
  4. 对于名称,输入 l7-ilb-ip-address
  5. 对于子网,请选择 backend-subnet
  6. 如果要指定要预留的 IP 地址,请在静态 IP 地址下选择让我自行选择,然后填写自定义 IP 地址。否则,系统会自动为您分配子网中的 IP 地址。
  7. 如果要将此 IP 地址与多个转发规则一起使用,请在用途下选择共享
  8. 点击保留以完成此流程。

gcloud

  1. 使用 gcloud CLI 运行 compute addresses create 命令

    gcloud compute addresses create l7-ilb-ip-address \
      --region=us-west1 \
      --subnet=backend-subnet
    

    如果要将同一 IP 地址用于多个转发规则,请指定 --purpose=SHARED_LOADBALANCER_VIP

  2. 使用 compute addresses describe 命令查看分配的 IP 地址:

    gcloud compute addresses describe l7-ilb-ip-address \
      --region=us-west1
    

创建代管式虚拟机实例组后端

本部分介绍如何创建实例组模板和托管实例组。代管式实例组提供运行示例区域级内部应用负载均衡器的后端服务器的虚拟机实例。对于您的实例组,您可以定义一个 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
      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
      
    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
      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'
    
  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\n
            vm_hostname=\"$(curl -H \"Metadata-Flavor:Google\"
            \\\nhttp://metadata.google.internal/computeMetadata/v1/instance/name)\"\n
            echo \"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-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 健康检查
  • 将代管实例组用作后端的后端服务
  • 网址映射
    • 如果为目标 HTTP(S) 代理定义了区域,请务必参阅区域网址映射。区域网址映射根据您为传入网址的主机和路径定义的规则将请求路由到区域后端服务。区域网址映射只能由同一区域中的区域目标代理规则引用。
  • SSL 证书(适用于 HTTPS)
  • 目标代理
  • 转发规则

代理可用性

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

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

控制台

开始配置

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

    转到“负载均衡”

  2. 点击创建负载均衡器
  3. 负载均衡器的类型字段中,选择应用负载均衡器 (HTTP/HTTPS),然后点击下一步
  4. 公共或内部字段中,选择内部,然后点击下一步
  5. 跨区域或单区域部署字段中,选择最适合区域级工作负载,然后点击下一步
  6. 点击配置

基本配置

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

预留代理专用子网

预留代理专用子网:

  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 地址列表中,选择 l7-ilb-ip-address
  7. 点击完成

对于 HTTPS

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

检查配置

  1. 点击检查并最终确定
  2. 查看负载均衡器配置设置。
  3. 可选:点击等效代码以查看将用于创建负载均衡器的 REST API 请求。
  4. 点击创建

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

    您可以创建 Compute Engine 证书或 Certificate Manager 证书。使用以下任一方法通过 Certificate Manager 创建证书:

    • 自行管理的区域级证书。如需了解如何创建和使用自行管理的区域级证书,请参阅部署自行管理的区域级证书。不支持证书映射。

    • Google 管理的区域级证书。不支持证书映射。

      Certificate Manager 支持以下类型的 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
      
    • 创建转发规则。

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

      对于 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=l7-ilb-ip-address \
        --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=l7-ilb-ip-address \
        --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": "IP_ADDRESS",
"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

您可以创建 Compute Engine 证书或 Certificate Manager 证书。使用以下任一方法通过 Certificate Manager 创建证书:

  • 自行管理的区域级证书。如需了解如何创建和使用自行管理的区域级证书,请参阅部署自行管理的区域级证书。不支持证书映射。

  • Google 管理的区域级证书。不支持证书映射。

    Certificate Manager 支持以下类型的 Google 管理的区域级证书:

  • 创建证书后,将证书直接附加到目标代理。

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

    from pathlib import Path
    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.",
    ) -> dict:
        """
        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.
    
            Returns:
            Dictionary with information about the new regional SSL self-signed 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)
    
        return 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": "IP_ADDRESS",
    "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",
    }
    

测试负载均衡器

如需测试负载均衡器,请创建一个客户端虚拟机。然后与虚拟机建立 SSH 会话,并将来自此虚拟机的流量发送到负载均衡器。

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

控制台

  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

将流量发送到负载均衡器

登录您刚刚创建的实例,测试是否可以使用区域级内部应用负载均衡器的转发规则 IP 地址访问后端上的 HTTP(S) 服务,以及流量是否正在后端实例之间进行负载均衡。

使用 SSH 连接到每个客户端实例

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

获取负载均衡器的 IP 地址

使用 gcloud compute addresses describe 命令查看分配的 IP 地址:

gcloud compute addresses describe l7-ilb-ip-address \
    --region=us-west1

验证 IP 地址是否传送其主机名

IP_ADDRESS 替换为负载均衡器的 IP 地址。

curl IP_ADDRESS

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

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

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

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

IP_ADDRESS 替换为负载均衡器的 IP 地址。

对于 HTTP

{
  RESULTS=
  for i in {1..100}
  do
      RESULTS="$RESULTS:$(curl --silent IP_ADDRESS)"
  done
  echo "***"
  echo "*** Results of load-balancing: "
  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:IP_ADDRESS:443)"
  done
  echo "***"
  echo "*** Results of load-balancing: "
  echo "***"
  echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
  echo
}

其他配置选项

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

启用全球访问权限

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

具有全球访问权限的区域级内部应用负载均衡器。
具有全球访问权限的区域级内部应用负载均衡器(点击可放大)。

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

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

控制台

为负载均衡器创建新的转发规则:

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

    进入“负载均衡”

  2. 名称列中,点击您的负载均衡器。

  3. 点击前端配置

  4. 点击添加前端 IP 和端口

  5. 输入新转发规则的名称和子网详细信息。

  6. 对于子网,选择 backend-subnet

  7. IP 地址部分,您可以选择与现有转发规则相同的 IP 地址、预留新的 IP 地址,或使用临时 IP 地址。只有在创建 IP 地址时将 IP 地址 --purpose 标志设置为 SHARED_LOADBALANCER_VIP 后,才能在多个转发规则之间共享相同的 IP 地址。

  8. 端口号部分,输入 110

  9. 全球访问权限部分,选择启用

  10. 点击完成

  11. 点击更新

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
    

启用会话亲和性

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

启用生成的 Cookie 亲和性后,负载均衡器会针对第一个请求发出一个 Cookie。对于具有相同 Cookie 的每个后续请求,负载均衡器会将请求定向到同一个后端虚拟机 (VM) 实例或端点。在此示例中,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

使用以下 Google Cloud CLI 命令可以将后端服务更新为不同类型的会话亲和性:

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

API

如需设置会话亲和性,请向 backendServices/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" ]
    }
    

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

您可以通过在客户端上配置出站防火墙规则,限制客户端连接到内部应用负载均衡器转发规则 VIP。您可以根据服务账号标记在特定客户端虚拟机上设置这些防火墙规则。

您无法使用防火墙规则将入站流量限制到特定的内部应用负载均衡器转发规则 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 Console 中,转到防火墙规则页面。

    进入“防火墙规则”

  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 标志。

根据子网扩缩对内部应用负载均衡器后端的受限访问

随着转发规则数量的增加,维护单独的防火墙规则或向现有规则添加新的负载均衡 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
    

配置后端子集化

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

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

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

以下示例介绍了如何创建区域级内部应用负载均衡器资源并启用后端子集化

  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 SHARED_IP_ADDRESS_NAME \
    --region=REGION \
    --subnet=SUBNET_NAME \
    --purpose=SHARED_LOADBALANCER_VIP
如果您需要将 HTTP 流量重定向到 HTTPS,则可以创建两个共用一个 IP 地址的转发规则。如需了解详情,请参阅为内部应用负载均衡器设置 HTTP 到 HTTPS 重定向

后续步骤