本文档介绍了如何为 Compute Engine 虚拟机上运行的服务配置跨区域内部代理网络负载均衡器。
准备工作
在按照本指南进行操作之前,请先熟悉以下内容:
权限
若要按照本指南中的说明进行操作,您必须能够创建实例以及修改项目中的网络。因此,您必须是项目 Owner 或 Editor,或者必须具有以下所有 Compute Engine IAM 角色。
任务 | 所需角色 |
---|---|
创建网络、子网和负载均衡器组件 | Compute Network Admin |
添加和移除防火墙规则 | 计算安全管理员 |
创建实例 | Compute Instance Admin |
如需了解详情,请参阅以下指南:
设置概览
您可以配置负载均衡器,如下图所示:
如上图所示,该示例在 VPC 网络中创建了一个跨区域内部代理网络负载均衡器,其中区域 REGION_A
和 REGION_B
中包含一个后端服务和两个后端代管式实例组 (MIG)。
图中显示了以下内容:
一个具有以下子网的 VPC 网络:
- 子网
SUBNET_A
和REGION_A
中的代理专用子网。 - 子网
SUBNET_B
和REGION_B
中的代理专用子网。
您必须在其中使用跨区域内部代理网络负载均衡器的 VPC 网络的每个区域中创建代理专用子网。该区域的代理专用子网会在该区域的所有跨区域内部代理网络负载均衡器之间共享。对于从负载均衡器发送到服务后端的数据包,系统会从代理专用子网分配其来源地址。在此示例中,区域
REGION_B
的代理专用子网的主要 IP 地址范围为10.129.0.0/23
,REGION_A
的主要 IP 地址范围为10.130.0.0/23
,这是建议的子网大小。- 子网
高可用性设置具有适用于
REGION_A
和REGION_B
区域中的 Compute Engine 虚拟机部署的代管实例组后端。如果一个区域中的后端发生故障,则流量会故障切换到另一个区域。用于监控后端使用情况和健康状况全球后端服务。
全球目标 TCP 代理,用于接收用户请求并将其转发到后端服务。
具有负载均衡器的区域级内部 IP 地址且可以将每个传入请求转发到目标代理的全球转发规则。
与转发规则关联的内部 IP 地址可以来自与后端位于同一网络和区域的子网。请注意以下条件:
- 该 IP 地址可以(但并非必须)与后端实例组来自同一子网。
- 该 IP 地址不得来自
--purpose
标志设置为GLOBAL_MANAGED_PROXY
的预留代理专用子网。 - 如果要将同一内部 IP 地址与多个转发规则结合使用,请将 IP 地址
--purpose
标志设置为SHARED_LOADBALANCER_VIP
。
配置网络和子网
在 VPC 网络中,在配置了后端的每个区域中配置一个子网。此外,请在要配置负载均衡器的每个区域中配置 proxy-only-subnet
。
本示例使用以下 VPC 网络、区域和子网:
网络。网络是名为
NETWORK
的自定义模式 VPC 网络。后端子网。
REGION_A
区域中名为SUBNET_A
的子网使用10.1.2.0/24
作为其主要 IP 范围。REGION_B
区域中名为SUBNET_B
的子网使用10.1.3.0/24
作为其主要 IP 范围。
代理子网。
REGION_A
区域中名为PROXY_SN_A
的子网使用10.129.0.0/23
作为其主要 IP 范围。REGION_B
区域中名为PROXY_SN_B
的子网使用10.130.0.0/23
作为其主要 IP 范围。
您可以从 VPC 中的任何区域访问跨区域内部应用负载均衡器。因此,来自任何区域的客户端都可以在全球范围内访问负载均衡器后端。
配置后端子网
控制台
在 Google Cloud 控制台中,进入 VPC 网络页面。
点击创建 VPC 网络。
为网络提供名称。
在子网部分中,将子网创建模式设置为自定义。
为负载均衡器的后端创建子网。在新子网部分中,输入以下信息:
- 为子网提供名称。
- 选择区域:REGION_A
- 输入 IP 地址范围:
10.1.2.0/24
点击完成。
点击添加子网。
为负载均衡器的后端创建子网。在新子网部分中,输入以下信息:
- 为子网提供名称。
- 选择区域:REGION_B
- 输入 IP 地址范围:
10.1.3.0/24
点击完成。
点击创建。
gcloud
使用
gcloud compute networks create
命令创建自定义 VPC 网络:gcloud compute networks create NETWORK \ --subnet-mode=custom
使用
gcloud compute networks subnets create
命令在REGION_A
区域的NETWORK
网络中创建子网:gcloud compute networks subnets create SUBNET_A \ --network=NETWORK \ --range=10.1.2.0/24 \ --region=REGION_A
使用
gcloud compute networks subnets create
命令在REGION_B
区域的NETWORK
网络中创建子网:gcloud compute networks subnets create SUBNET_B \ --network=NETWORK \ --range=10.1.3.0/24 \ --region=REGION_B
Terraform
如需创建 VPC 网络,请使用 google_compute_network
资源。
如需在 lb-network-crs-reg
网络中创建 VPC 子网,请使用 google_compute_subnetwork
资源。
API
向 networks.insert
方法发出 POST
请求。请将 PROJECT_ID
替换为您的项目 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks { "routingConfig": { "routingMode": "regional" }, "name": "NETWORK", "autoCreateSubnetworks": false }
向 subnetworks.insert
方法发出 POST
请求。请将 PROJECT_ID
替换为您的项目 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/subnetworks { "name": "SUBNET_A", "network": "projects/PROJECT_ID/global/networks/lb-network-crs-reg", "ipCidrRange": "10.1.2.0/24", "region": "projects/PROJECT_ID/regions/REGION_A", }
向 subnetworks.insert
方法发出 POST
请求。请将 PROJECT_ID
替换为您的项目 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/subnetworks { "name": "SUBNET_B", "network": "projects/PROJECT_ID/global/networks/NETWORK", "ipCidrRange": "10.1.3.0/24", "region": "projects/PROJECT_ID/regions/REGION_B", }
配置代理专用子网
代理专用子网提供了一组 IP 地址,供 Google Cloud 用于代表您运行 Envoy 代理。代理会终结来自客户端的连接并创建与后端的新连接。
此代理专用子网用于与 VPC 网络位于同一区域的所有基于 Envoy 的区域级负载均衡器。在每个网络中,每个区域只能有一个活跃代理专用子网用于给定目的。
控制台
如果您使用的是 Google Cloud 控制台,则可以稍后在负载均衡页面上创建代理专用子网。
如需立即创建代理专用子网,请按以下步骤操作:
在 Google Cloud 控制台中,转到 VPC 网络页面。
- 点击 VPC 网络的名称。
- 在子网标签页上,点击添加子网。
- 为代理专用子网提供名称。
- 选择区域:REGION_A
- 在用途列表中,选择跨区域托管式代理。
- 在 IP 地址范围字段中,输入
10.129.0.0/23
。 - 点击添加。
在 REGION_B
中创建代理专用子网
- 在子网标签页上,点击添加子网。
- 为代理专用子网提供名称。
- 选择区域:REGION_B
- 在用途列表中,选择跨区域托管式代理。
- 在 IP 地址范围字段中,输入
10.130.0.0/23
。 - 点击添加。
gcloud
使用 gcloud compute networks subnets create
命令创建代理专用子网。
gcloud compute networks subnets create PROXY_SN_A \ --purpose=GLOBAL_MANAGED_PROXY \ --role=ACTIVE \ --region=REGION_A \ --network=NETWORK \ --range=10.129.0.0/23
gcloud compute networks subnets create PROXY_SN_B \ --purpose=GLOBAL_MANAGED_PROXY \ --role=ACTIVE \ --region=REGION_B \ --network=NETWORK \ --range=10.130.0.0/23
Terraform
如需在 lb-network-crs-reg
网络中创建 VPC 代理专用子网,请使用 google_compute_subnetwork
资源。
API
使用 subnetworks.insert
方法创建代理专用子网,并将 PROJECT_ID
替换为您的项目 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_A/subnetworks { "name": " PROXY_SN_A", "ipCidrRange": "10.129.0.0/23", "network": "projects/PROJECT_ID/global/networks/NETWORK", "region": "projects/PROJECT_ID/regions/REGION_A", "purpose": "GLOBAL_MANAGED_PROXY", "role": "ACTIVE" }
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION_B/subnetworks { "name": "PROXY_SN_B", "ipCidrRange": "10.130.0.0/23", "network": "projects/PROJECT_ID/global/networks/NETWORK", "region": "projects/PROJECT_ID/regions/REGION_B", "purpose": "GLOBAL_MANAGED_PROXY", "role": "ACTIVE" }
配置防火墙规则
此示例使用以下防火墙规则:
fw-ilb-to-backends
。适用于负载均衡实例的入站流量规则,该规则允许从任何地址到 TCP 端口22
的传入 SSH 连接。您可以为此规则选择限制性更高的来源 IP 地址范围;例如,您可以仅指定从中启动 SSH 会话的系统的 IP 地址范围。此示例使用目标标记allow-ssh
来标识防火墙规则应用到的虚拟机。fw-healthcheck
。适用于负载均衡实例的入站流量规则,该规则允许来自 Google Cloud 健康检查系统(130.211.0.0/22
和35.191.0.0/16
)的所有 TCP 流量。此示例使用目标标记load-balanced-backend
来标识防火墙规则应用到的实例。fw-backends
。适用于负载均衡实例的入站流量规则,该规则允许从内部代理网络负载均衡器的代管式代理发送到端口80
、443
和8080
的 TCP 流量。此示例使用目标标记load-balanced-backend
来标识防火墙规则应用到的虚拟机。
如果不使用上述防火墙规则,则默认拒绝入站规则会阻止传入后端实例的流量。
目标标记定义了后端实例。没有目标标记,防火墙规则将应用于 VPC 网络中的所有后端实例。创建后端虚拟机时,请务必包括指定的目标标记,如创建代管实例组中所示。
控制台
在 Google Cloud 控制台中,转到防火墙页面。
点击创建防火墙规则,以创建允许传入 SSH 连接的规则:
- 名称:
fw-ilb-to-backends
- 网络:NETWORK
- 流量方向:入站
- 对匹配项执行的操作:允许
- 目标:指定的目标标记
- 目标标记:
allow-ssh
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:
0.0.0.0/0
- 协议和端口:
- 选择指定的协议和端口。
- 选中 TCP 复选框,然后输入
22
作为端口号。
- 名称:
点击创建。
再次点击创建防火墙规则,创建允许 Google Cloud 健康检查的规则:
- 名称:
fw-healthcheck
- 网络:NETWORK
- 流量方向:入站
- 对匹配项执行的操作:允许
- 目标:指定的目标标记
- 目标标记:
load-balanced-backend
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:
130.211.0.0/22
和35.191.0.0/16
协议和端口:
- 选择指定的协议和端口。
- 选中 TCP 复选框,然后输入
80
作为端口号。
最佳做法是将此规则限制为仅使用与健康检查所使用的协议和端口匹配的协议和端口。如果您使用
tcp:80
协议和端口,则 Google Cloud 可以使用 HTTP 通过端口80
联系您的虚拟机,但无法使用 HTTPS 通过端口443
联系这些虚拟机。
- 名称:
点击创建。
第三次点击创建防火墙规则,以创建允许负载均衡器的代理服务器连接后端的规则:
- 名称:
fw-backends
- 网络:NETWORK
- 流量方向:入站
- 对匹配项执行的操作:允许
- 目标:指定的目标标记
- 目标标记:
load-balanced-backend
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:
10.129.0.0/23
和10.130.0.0/23
- 协议和端口:
- 选择指定的协议和端口。
- 选中 TCP 复选框,然后输入
80, 443, 8080
作为端口号。
- 名称:
点击创建。
gcloud
创建
fw-ilb-to-backends
防火墙规则,允许通过 SSH 连接到网络标记为allow-ssh
的虚拟机。如果省略source-ranges
,Google Cloud 会将规则解释为表示所有来源。gcloud compute firewall-rules create fw-ilb-to-backends \ --network=NETWORK \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --rules=tcp:22
创建
fw-healthcheck
规则以允许 Google Cloud 健康检查。本示例允许来自健康检查探测工具的所有 TCP 流量;但是,您可以根据自己的需求配置较小范围的端口集。gcloud compute firewall-rules create fw-healthcheck \ --network=NETWORK \ --action=allow \ --direction=ingress \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --target-tags=load-balanced-backend \ --rules=tcp
创建
fw-backends
规则以允许内部代理网络负载均衡器的代理连接到您的后端。将source-ranges
设置为代理专用子网的分配范围,例如10.129.0.0/23
和10.130.0.0/23
。gcloud compute firewall-rules create fw-backends \ --network=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-ilb-to-backends
防火墙规则,并将 PROJECT_ID
替换为您的项目 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls { "name": "fw-ilb-to-backends", "network": "projects/PROJECT_ID/global/networks/NETWORK", "sourceRanges": [ "0.0.0.0/0" ], "targetTags": [ "allow-ssh" ], "allowed": [ { "IPProtocol": "tcp", "ports": [ "22" ] } ], "direction": "INGRESS" }
通过向 firewalls.insert
方法发出 POST
请求来创建 fw-healthcheck
防火墙规则,并将 PROJECT_ID
替换为您的项目 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls { "name": "fw-healthcheck", "network": "projects/PROJECT_ID/global/networks/NETWORK", "sourceRanges": [ "130.211.0.0/22", "35.191.0.0/16" ], "targetTags": [ "load-balanced-backend" ], "allowed": [ { "IPProtocol": "tcp" } ], "direction": "INGRESS" }
通过 firewalls.insert
方法创建 fw-backends
防火墙规则以允许代理子网内的 TCP 流量,并将 PROJECT_ID
替换为您的项目 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls { "name": "fw-backends", "network": "projects/PROJECT_ID/global/networks/NETWORK", "sourceRanges": [ "10.129.0.0/23", "10.130.0.0/23" ], "targetTags": [ "load-balanced-backend" ], "allowed": [ { "IPProtocol": "tcp", "ports": [ "80" ] }, { "IPProtocol": "tcp", "ports": [ "443" ] }, { "IPProtocol": "tcp", "ports": [ "8080" ] } ], "direction": "INGRESS" }
创建代管式实例组
本部分介绍如何创建模板和代管式实例组。代管式实例组提供运行示例跨区域内部代理网络负载均衡器的后端服务器的虚拟机实例。对于您的实例组,您可以定义一个 HTTP 服务并将端口名称映射到相关端口上。负载均衡器的后端服务会将流量转发到已命名的端口。 来自客户端的流量在经过负载均衡处理后传送到后端服务器。出于演示目的,后端会传送其各自的主机名。
控制台
在 Google Cloud 控制台中,转到实例模板页面。
- 点击创建实例模板。
- 对于名称,输入
gil4-backendeast1-template
。 - 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 10 (buster)。本文中的说明使用仅 Debian 支持的命令,例如
apt-get
。 - 点击高级选项。
- 点击网络并配置以下字段:
- 在网络标记部分,输入
allow-ssh
和load-balanced-backend
。 - 对于网络接口,请选择以下内容:
- 网络:NETWORK
- 子网:SUBNET_B
- 在网络标记部分,输入
点击管理。将以下脚本输入启动脚本字段。
#! /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
点击创建。
点击创建实例模板。
对于名称,输入
gil4-backendwest1-template
。确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 10 (buster)。本文中的说明使用仅 Debian 支持的命令,例如
apt-get
。点击高级选项。
点击网络并配置以下字段:
- 在网络标记部分,输入
allow-ssh
和load-balanced-backend
。 - 对于网络接口,请选择以下内容:
- 网络:NETWORK
- 子网:SUBNET_A
- 在网络标记部分,输入
点击管理。将以下脚本输入启动脚本字段。
#! /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
点击创建。
在 Google Cloud 控制台中,转到实例组页面。
- 点击创建实例组。
- 选择新的代管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 MIG。
- 对于名称,输入
gl7-ilb-mig-a
。 - 对于位置,选择单个可用区。
- 对于区域,请选择 REGION_A。
- 对于可用区,请选择 ZONE_A。
- 对于实例模板,请选择
gil4-backendwest1-template
。 指定要在组中创建的实例数。
对于此示例,请在自动扩缩下指定以下选项:
- 对于自动扩缩模式,请选择
Off:do not autoscale
。 - 对于实例数上限,请输入
2
。
(可选)在界面的自动扩缩部分中,您可以将实例组配置为根据实例 CPU 使用情况自动添加或移除实例。
- 对于自动扩缩模式,请选择
点击创建。
点击创建实例组。
选择新的代管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 MIG。
对于名称,输入
gl7-ilb-mig-b
。对于位置,选择单个可用区。
对于区域,请选择 REGION_B。
对于可用区,请选择 ZONE_B。
对于实例模板,请选择
gil4-backendeast1-template
。指定要在组中创建的实例数。
对于此示例,请在自动扩缩下指定以下选项:
- 对于自动扩缩模式,请选择
Off:do not autoscale
。 - 对于实例数上限,请输入
2
。
(可选)在界面的自动扩缩部分中,您可以将实例组配置为根据实例 CPU 使用情况自动添加或移除实例。
- 对于自动扩缩模式,请选择
点击创建。
gcloud
本指南中的 gcloud CLI 说明假定您使用的是Cloud Shell 或安装了 bash 的其他环境。
使用
gcloud compute instance-templates create
命令创建一个具有 HTTP 服务器的虚拟机实例模板。gcloud compute instance-templates create gil4-backendwest1-template \ --region=REGION_A \ --network=NETWORK \ --subnet=SUBNET_A \ --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://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
gcloud compute instance-templates create gil4-backendeast1-template \ --region=REGION_B \ --network=NETWORK \ --subnet=SUBNET_B \ --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://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
使用
gcloud compute instance-groups managed create
命令在可用区中创建一个代管式实例组。gcloud compute instance-groups managed create gl7-ilb-mig-a \ --zone=ZONE_A \ --size=2 \ --template=gil4-backendwest1-template
gcloud compute instance-groups managed create gl7-ilb-mig-b \ --zone=ZONE_B \ --size=2 \ --template=gil4-backendeast1-template
API
使用 instanceTemplates.insert
方法创建实例模板,并将 PROJECT_ID
替换为您的项目 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates { "name":"gil4-backendwest1-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://169.254.169.254/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/NETWORK", "subnetwork":"regions/REGION_A/subnetworks/SUBNET_A", "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": "gl7-ilb-mig-a", "zone": "projects/PROJECT_ID/zones/ZONE_A", "instanceTemplate": "projects/PROJECT_ID/global/instanceTemplates/gil4-backendwest1-template", "baseInstanceName": "gl4-ilb-migb", "targetSize": 2 }
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/instanceTemplates { "name":"gil4-backendeast1-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://169.254.169.254/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/NETWORK", "subnetwork":"regions/REGION_B/subnetworks/SUBNET_B", "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": "gl7-ilb-mig-b", "zone": "projects/PROJECT_ID/zones/ZONE_A", "instanceTemplate": "projects/PROJECT_ID/global/instanceTemplates/gil4-backendwest1-template", "baseInstanceName": "gl4-ilb-migb", "targetSize": 2 }
配置负载均衡器
下面的示例介绍了如何创建以下跨区域内部代理网络负载均衡器资源:
- 全球 TCP 健康检查。
- 与后端具有相同 MIG 的全球后端服务。
- 全球目标代理。
- 两条使用区域级 IP 地址的全球转发规则。对于转发规则的 IP 地址,请使用
SUBNET_A
或SUBNET_B
IP 地址范围。如果您尝试使用代理专用子网,则转发规则创建会失败。
代理可用性
有时,Google Cloud 区域没有足够的代理容量来容纳新的负载均衡器。如果发生这种情况,Google Cloud 控制台会在您创建负载均衡器时提供一条代理可用性警告消息。如需解决此问题,您可以执行以下任一操作:
- 为您的负载均衡器选择其他区域。如果您的后端位于其他区域,这是一种切实可行的做法。
- 选择一个已分配有代理专用子网的 VPC 网络。
等待容量问题的解决。
控制台
开始配置
在 Google Cloud 控制台中,转到负载均衡页面。
- 点击创建负载均衡器。
- 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步。
- 对于代理或直通,选择代理负载均衡器,然后点击下一步。
- 在公共或内部字段中,选择内部,然后点击下一步。
- 在跨区域或单区域部署字段中,选择最适合跨区域工作负载,然后点击下一步。
- 点击配置。
基本配置
- 为负载均衡器提供名称。
- 对于网络,请选择 NETWORK。
使用两条转发规则配置前端
- 点击前端配置。
- 为转发规则提供名称。
- 在 Subnetwork region 列表中,选择 REGION_A。
预留代理专用子网
- 在子网列表中,选择 SUBNET_A。
- 在 IP 地址列表中,点击创建 IP 地址。系统会打开预留静态内部 IP 地址页面。
- 为静态 IP 地址提供名称。
- 在静态 IP 地址列表中,选择让我选择。
- 在自定义 IP 地址字段中,输入
10.1.2.99
。 - 选择预留。
- 点击完成。
- 如需添加第二条转发规则,请点击添加前端 IP 和端口。
- 为转发规则提供名称。
- 在 Subnetwork region 列表中,选择 REGION_B。
预留代理专用子网
- 在子网列表中,选择 SUBNET_B。
- 在 IP 地址列表中,点击创建 IP 地址。系统会打开预留静态内部 IP 地址页面。
- 为静态 IP 地址提供名称。
- 在静态 IP 地址列表中,选择让我选择。
- 在自定义 IP 地址字段中,输入
10.1.3.99
。 - 选择预留。
- 点击完成。
- 点击后端配置。
- 在创建或选择后端服务列表中,点击创建后端服务。
- 为后端服务提供名称。
- 对于 Protocol(协议),选择 TCP。
- 对于已命名端口,输入
http
。 - 在后端类型列表中,选择实例组。
- 在新后端部分:
- 在实例组列表中,选择 REGION_A 中的
gl7-ilb-mig-a
。 - 将端口号设置为
80
。 - 点击完成。
- 如需添加其他后端,请点击添加后端。
- 在实例组列表中,选择 REGION_B 中的
gl7-ilb-mig-b
。 - 将端口号设置为
80
。 - 点击完成。
- 在健康检查列表中,点击创建健康检查。
- 在名称字段中,输入
global-http-health-check
。 - 将协议设置为
HTTP
。 - 将端口设置为
80
。 - 点击保存。
检查配置
- 点击检查并最终确定。
- 查看负载均衡器配置设置。
- 点击创建。
gcloud
使用
gcloud compute health-checks create tcp
命令定义 TCP 健康检查。gcloud compute health-checks create tcp global-health-check \ --use-serving-port \ --global
使用
gcloud compute backend-services create
命令定义后端服务。gcloud compute backend-services create gl4-gilb-backend-service \ --load-balancing-scheme=INTERNAL_MANAGED \ --protocol=TCP \ --enable-logging \ --logging-sample-rate=1.0 \ --health-checks=global-health-check \ --global-health-checks \ --global
使用
gcloud compute backend-services add-backend
命令将后端添加到后端服务。gcloud compute backend-services add-backend gl4-gilb-backend-service \ --balancing-mode=CONNECTION \ --max-connections=50 \ --instance-group=gl4-ilb-migb \ --instance-group-zone=ZONE_A \ --global
gcloud compute backend-services add-backend gl4-gilb-backend-service \ --balancing-mode=CONNECTION \ --max-connections=50 \ --instance-group=gl4-ilb-migb \ --instance-group-zone=ZONE_B \ --global
创建目标代理。
使用
gcloud compute target-tcp-proxies create
命令创建目标代理。gcloud compute target-tcp-proxies create gilb-tcp-proxy \ --backend-service=gl4-gilb-backend-service \ --global
创建两条转发规则,一条规则使用
REGION_B
中的 VIP (10.1.2.99),另一条规则使用REGION_A
中的 VIP (10.1.3.99)。如需了解详情,请参阅预留静态内部 IPv4 地址。对于自定义网络,必须在转发规则中引用子网。请注意,这是虚拟机子网,而非代理子网。
将
gcloud compute forwarding-rules create
命令与正确的标志结合使用。gcloud compute forwarding-rules create gil4forwarding-rule-a \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=NETWORK \ --subnet=SUBNET_A \ --subnet-region=REGION_A \ --address=10.1.2.99 \ --ports=80 \ --target-tcp-proxy=gilb-tcp-proxy \ --global
gcloud compute forwarding-rules create gil4forwarding-rule-b \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=NETWORK \ --subnet=SUBNET_B \ --subnet-region=REGION_B \ --address=10.1.3.99 \ --ports=80 \ --target-tcp-proxy=gilb-tcp-proxy \ --global
API
向 healthChecks.insert
方法发出 POST
请求来创建健康检查,并将 PROJECT_ID
替换为您的项目 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/healthChecks { "name": "global-health-check", "type": "TCP", "httpHealthCheck": { "portSpecification": "USE_SERVING_PORT" } }
向 backendServices.insert
方法发出 POST
请求来创建全球后端服务,并将 PROJECT_ID
替换为您的项目 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices { "name": "gl4-gilb-backend-service", "backends": [ { "group": "projects/PROJECT_ID/zones/ZONE_A/instanceGroups/gl4-ilb-migb", "balancingMode": "CONNECTION" }, { "group": "projects/PROJECT_ID/zones/ZONE_B/instanceGroups/gl4-ilb-migb", "balancingMode": "CONNECTION" } ], "healthChecks": [ "projects/PROJECT_ID/regions/global/healthChecks/global-health-check" ], "loadBalancingScheme": "INTERNAL_MANAGED" }
向 targetTcpProxies.insert
方法发出 POST
请求来创建目标 TCP 代理,并将 PROJECT_ID
替换为您的项目 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetTcpProxy { "name": "l4-ilb-proxy", }
向 forwardingRules.insert
方法发出 POST
请求来创建转发规则,并将 PROJECT_ID
替换为您的项目 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules { "name": "gil4forwarding-rule-a", "IPAddress": "10.1.2.99", "IPProtocol": "TCP", "portRange": "80-80", "target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy", "loadBalancingScheme": "INTERNAL_MANAGED", "subnetwork": "projects/PROJECT_ID/regions/REGION_A/subnetworks/SUBNET_A", "network": "projects/PROJECT_ID/global/networks/NETWORK", "networkTier": "PREMIUM" }
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules { "name": "gil4forwarding-rule-b", "IPAddress": "10.1.3.99", "IPProtocol": "TCP", "portRange": "80-80", "target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy", "loadBalancingScheme": "INTERNAL_MANAGED", "subnetwork": "projects/PROJECT_ID/regions/REGION_B/subnetworks/SUBNET_B", "network": "projects/PROJECT_ID/global/networks/NETWORK", "networkTier": "PREMIUM" }
向 globalForwardingRules.insert
方法发出 POST
请求来创建转发规则,并将 PROJECT_ID
替换为您的项目 ID。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules { "name": "gil4forwarding-rule-a", "IPAddress": "10.1.2.99", "IPProtocol": "TCP", "portRange": "80-80", "target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy", "loadBalancingScheme": "INTERNAL_MANAGED", "subnetwork": "projects/PROJECT_ID/regions/REGION_A/subnetworks/SUBNET_A", "network": "projects/PROJECT_ID/global/networks/NETWORK", "networkTier": "PREMIUM" }
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules { "name": "gil4forwarding-rule-b", "IPAddress": "10.1.3.99", "IPProtocol": "TCP", "portRange": "80-80", "target": "projects/PROJECT_ID/global/targetTcpProxies/l4-ilb-proxy", "loadBalancingScheme": "INTERNAL_MANAGED", "subnetwork": "projects/PROJECT_ID/regions/REGION_B/subnetworks/SUBNET_B", "network": "projects/PROJECT_ID/global/networks/NETWORK", "networkTier": "PREMIUM" }
测试负载均衡器
创建虚拟机实例以测试连接性
在
REGION_B
和REGION_A
区域中创建客户端虚拟机:gcloud compute instances create l4-ilb-client-a \ --image-family=debian-10 \ --image-project=debian-cloud \ --network=NETWORK \ --subnet=SUBNET_A \ --zone=ZONE_A \ --tags=allow-ssh
gcloud compute instances create l4-ilb-client-b \ --image-family=debian-10 \ --image-project=debian-cloud \ --network=NETWORK \ --subnet=SUBNET_B \ --zone=ZONE_B \ --tags=allow-ssh
使用 SSH 连接到每个客户端实例。
gcloud compute ssh l4-ilb-client-a --zone=ZONE_A
gcloud compute ssh l4-ilb-client-b --zone=ZONE_B
验证 IP 地址是否传送其主机名
验证客户端虚拟机是否可以访问以下两个 IP 地址。该命令应该会成功,并返回传送请求的后端虚拟机的名称:
curl 10.1.2.99
curl 10.1.3.99
测试故障切换
当
REGION_B
中的后端健康状况不佳或无法访问时,验证故障切换到REGION_A
区域的后端。如需模拟故障切换,请从REGION_B
中移除所有后端:gcloud compute backend-services remove-backend gl4-gilb-backend-service \ --instance-group=gl4-ilb-migb \ --instance-group-zone=ZONE_B \ --global
使用 SSH 连接到
REGION_B
中的客户端虚拟机。gcloud compute ssh l4-ilb-client-b \ --zone=ZONE_B
向
REGION_B
区域中的负载均衡 IP 地址发送请求。命令输出会显示来自REGION_A
中的后端虚拟机的响应:{ 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.3.99:443)" done echo "***" echo "*** Results of load-balancing to 10.1.3.99: " echo "***" echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c echo }
其他配置选项
本部分对配置示例进行了扩展,以提供一些额外的替代配置选项。所有任务均为可选任务。您可以按任意顺序执行这些任务。
用于保留客户端连接信息的 PROXY 协议
内部代理网络负载均衡器会终止来自客户端的 TCP 连接并创建与虚拟机实例的新连接。默认情况下,系统不会保留原始客户端 IP 地址和端口信息。
要保留原始连接信息并将其发送到您的实例,请启用 PROXY 协议(版本 1)。此协议将包含来源 IP 地址、目标 IP 地址和端口号的附加标头作为请求的一部分发送给实例。
请确保内部代理网络负载均衡器的后端实例运行的是支持 ProXY 协议标头的 HTTP 或 HTTPS 服务器。如果 HTTP 或 HTTPS 服务器未配置为支持 PROXY 协议标头,则后端实例将返回空响应。例如,PROXY 协议不适用于 Apache HTTP Server 软件。您可以使用其他 Web 服务器软件,例如 Nginx。
如果您为用户流量设置了 PROXY 协议,则还必须为健康检查设置此协议。如果您检查健康状况并在同一端口上传送内容,请将健康检查的 --proxy-header
设置为与您的负载均衡器设置相匹配。
PROXY 协议标头通常是一行用户可读的文本,格式如下:
PROXY TCP4 <client IP> <load balancing IP> <source port> <dest port>\r\n
以下是 PROXY 协议的示例:
PROXY TCP4 192.0.2.1 198.51.100.1 15221 110\r\n
在上面的示例中,客户端 IP 为 192.0.2.1
,负载均衡 IP 为 198.51.100.1
,客户端端口为 15221
,目标端口为 110
。
在客户端 IP 未知的情况下,负载均衡器将使用以下格式生成 PROXY 协议标头:
PROXY UNKNOWN\r\n
更新目标 TCP 代理的 PROXY 协议标头
此页面上的负载均衡器设置示例介绍了如何在创建内部代理网络负载均衡器时启用 PROXY 协议标头。按照以下步骤更改现有目标 TCP 代理的 PROXY 协议标头。
控制台
在 Google Cloud 控制台中,转到负载均衡页面。
点击您的负载均衡器对应的
修改。点击前端配置。
将代理协议字段的值更改为开启。
点击更新以保存更改。
gcloud
在以下命令中,修改 --proxy-header
字段并将其设置为 NONE
或 PROXY_V1
,具体取决于您的要求。
gcloud compute target-ssl-proxies update int-tcp-target-proxy \ --proxy-header=[NONE | PROXY_V1]
在多个内部转发规则中使用同一 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
启用会话亲和性
示例配置创建的后端服务没有会话亲和性。
以下流程介绍了如何为示例负载均衡器更新后端服务,以便后端服务使用客户端 IP 地址亲和性或生成的 Cookie 亲和性。
启用客户端 IP 亲和性后,负载均衡器会根据使用客户端 IP 地址和负载均衡器 IP 地址(内部转发规则的内部 IP 地址)创建的哈希,将特定客户端的请求定向到同一后端虚拟机。
控制台
如需启用客户端 IP 地址会话亲和性,请执行以下操作:
- 在 Google Cloud 控制台中,进入负载均衡页面。
进入“负载均衡” - 点击后端。
- 点击您为此示例创建的后端服务的名称,然后点击修改。
- 在后端服务详情页面上,点击高级配置。
- 在会话亲和性下,从菜单中选择客户端 IP。
- 点击更新。
gcloud
使用以下 gcloud 命令更新 BACKEND_SERVICE
后端服务,并指定客户端 IP 会话亲和性:
gcloud compute backend-services update BACKEND_SERVICE \ --global \ --session-affinity=CLIENT_IP
启用连接排空
您可以在后端服务上启用连接排空,以确保在终止、手动移除或由自动扩缩程序移除正在处理流量的实例时,对用户造成的干扰最小。如需详细了解连接排空,请参阅启用连接排空文档。