Google Cloud 全球外部代理网络负载均衡器可让您为世界各地的所有用户使用同一个 IP 地址。全球外部代理网络负载均衡器会自动将流量路由到离用户最近的后端实例。
本页面介绍了如何设置具有目标 TCP 代理和虚拟机实例组后端的全球外部代理网络负载均衡器。在开始之前,请参阅外部代理网络负载均衡器概览,详细了解这些负载均衡器的工作原理。
设置概览
此示例演示了如何为存在于两个区域(区域 A 和区域 B)中的服务设置外部代理网络负载均衡器。在本示例中,服务是一组配置为在端口 110
做出响应的 Apache 服务器。许多浏览器都不允许使用端口 110
,因此我们在测试部分使用 curl
。
在此示例中,您可以配置以下内容:
- 分布在两个区域的四个实例
- 包含实例的实例组
- 用于验证实例健康状况的健康检查
- 后端服务,用于监控实例并防止实例超出配置的使用量
- 目标 TCP 代理
- 外部静态 IPv4 地址和用于将用户流量发送到代理的转发规则
- 外部静态 IPv6 地址和用于将用户流量发送到代理的转发规则
- 允许流量从负载均衡器和健康检查器访问实例的防火墙规则
配置负载均衡器后,请测试该配置。
权限
若要按照本指南中的说明进行操作,您必须能够创建实例以及修改项目中的网络。因此,您必须具有项目的 Owner 或 Editor 角色,或者必须拥有以下所有 Compute Engine IAM 角色:
任务 | 所需角色 |
---|---|
创建网络、子网和负载均衡器组件 | Network Admin |
添加和移除防火墙规则 | Security Admin |
创建实例 | Compute Instance Admin |
如需了解详情,请参阅以下指南:
配置网络和子网
如需创建示例网络和子网,请按照以下步骤操作。
控制台
如需同时支持 IPv4 和 IPv6 流量,请按照以下步骤操作:
在 Google Cloud 控制台中,转到 VPC 网络页面。
点击创建 VPC 网络。
输入网络的名称。
可选:如果您要在此网络中的子网上配置内部 IPv6 地址范围,请完成以下步骤:
- 对于 VPC 网络 ULA 内部 IPv6 范围,选择已启用。
对于分配内部 IPv6 范围,选择自动或手动。
如果您选择手动,请在
fd20::/20
范围内输入/48
范围。如果此范围正在使用中,系统会提示您提供其他范围。
在子网创建模式字段中,选择自定义。
在新子网部分中,配置以下字段:
- 在名称字段中,提供子网的名称。
- 在区域字段中,选择一个区域。
- 对于 IP 栈类型,请选择 IPv4 和 IPv6(双栈)。
在 IP 地址范围字段中,输入 IP 地址范围。这是子网的主要 IPv4 范围。
虽然您可以为子网配置 IPv4 地址范围,但您不能为子网选择 IPv6 地址范围。Google 提供固定大小 (
/64
) 的 IPv6 CIDR 地址块。对于 IPv6 访问权限类型,选择外部。
点击完成。
如需在其他区域中添加子网,请点击添加子网,然后重复上述步骤。
点击创建。
如需仅支持 IPv4 流量,请按照以下步骤操作:
在 Google Cloud 控制台中,转到 VPC 网络页面。
点击创建 VPC 网络。
在名称字段中,输入网络的名称。
在子网创建模式字段中,选择自定义。
在新子网部分中,配置以下字段:
- 在名称字段中,提供子网的名称。
- 在区域字段中,选择一个区域。
- 在 IP 栈类型字段中,选择 IPv4(单栈)。
- 在 IP 地址范围字段中,输入子网的主要 IPv4 范围。
点击完成。
如需在其他区域中添加子网,请点击添加子网,然后重复上述步骤。
点击创建。
gcloud
创建自定义模式 VPC 网络:
gcloud compute networks update NETWORK \ [ --enable-ula-internal-ipv6 [ --internal-ipv6-range=ULA_IPV6_RANGE ]] \ --switch-to-custom-subnet-mode
在该网络中,为后端创建子网。
对于 IPv4 和 IPv6 流量,请使用以下命令更新子网:
gcloud compute networks subnets update SUBNET \ --stack-type=IPV4_IPv6 \ --ipv6-access-type=EXTERNAL \ --network=NETWORK \ --region=REGION_A
gcloud compute networks subnets update SUBNET_B \ --stack-type=IPV4_IPv6 \ --ipv6-access-type=EXTERNAL \ --network=NETWORK \ --region=REGION_B
对于仅限 IPv4 流量,请使用以下命令:
gcloud compute networks subnets update SUBNET \ --network=NETWORK \ --stack-type=IPV4_ONLY \ --range=10.1.2.0/24 \ --region=REGION_A
gcloud compute networks subnets update SUBNET_B \ --stack-type=IPV4_ONLY \ --ipv6-access-type=EXTERNAL \ --network=NETWORK \ --region=REGION_B
请替换以下内容:
NETWORK
:VPC 网络的名称ULA_IPV6_RANGE
:Google 用于内部 IPv6 子网范围的fd20::/20
范围内的/48
前缀。如果您不使用--internal-ipv6-range
标志,则 Google 会为该网络选择/48
前缀SUBNET
:子网的名称
REGION_A
或REGION_B
:区域的名称
配置实例组后端
本部分说明如何创建基本的实例组、如何将实例添加到实例组,以及如何将这些实例添加到具有健康检查功能的后端服务。生产系统通常会使用基于实例模板的代管实例组,但此配置对初始测试更为快捷。
配置实例
如需进行测试,请在四个实例(分别位于两个实例组中,每个实例组中有两个实例)上安装 Apache。通常,外部代理网络负载均衡器不用于处理 HTTP 流量,但 Apache 软件通常用于测试。
在此示例中,创建的实例具有 tcp-lb
标记。防火墙规则稍后会使用此标记。
控制台
创建实例
在 Google Cloud 控制台中,前往虚拟机实例页面。
点击创建实例。
将名称设置为
vm-a1
。将区域设置为
REGION_A
。将可用区设置为
ZONE_A
。点击高级选项。
点击网络并配置以下字段:
- 在网络标记字段中,输入
tcp-lb
和allow-health-check-ipv6
。
如需同时支持 IPv4 和 IPv6 流量,请按照以下步骤操作:
- 在网络接口部分中,点击
- 网络:
NETWORK
- 子网:
SUBNET
- IP 栈类型:IPv4 和 IPv6(双栈)
修改,然后进行以下更改:
- 网络:
- 点击完成。
- 在网络标记字段中,输入
点击管理。将以下脚本输入启动脚本字段。
sudo apt-get update sudo apt-get install apache2 -y sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf sudo service apache2 restart echo '<!doctype html><html><body><h1>vm-a1</h1></body></html>' | sudo tee /var/www/html/index.html
点击创建。
使用相同的设置创建
vm-a2
,但需在启动脚本字段中添加以下脚本:sudo apt-get update sudo apt-get install apache2 -y sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf sudo service apache2 restart echo '<!doctype html><html><body><h1>vm-a2</h1></body></html>' | sudo tee /var/www/html/index.html
使用相同设置创建
vm-b1
,但需将区域设置为REGION_B
,并将可用区设置为ZONE_B
。在启动脚本字段中输入以下脚本:sudo apt-get update sudo apt-get install apache2 -y sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf sudo service apache2 restart echo '<!doctype html><html><body><h1>vm-b1</h1></body></html>' | sudo tee /var/www/html/index.html
使用相同设置创建
vm-b2
,但需将区域设置为REGION_B
,并将可用区设置为ZONE_B
。在启动脚本字段中输入以下脚本:sudo apt-get update sudo apt-get install apache2 -y sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf sudo service apache2 restart echo '<!doctype html><html><body><h1>vm-b2</h1></body></html>' | sudo tee /var/www/html/index.html
gcloud
在
ZONE_A
可用区中创建vm-a1
gcloud compute instances create vm-a1 \ --image-family debian-12 \ --image-project debian-cloud \ --tags tcp-lb \ --zone ZONE_A \ --metadata startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf sudo service apache2 restart echo '<!doctype html><html><body><h1>vm-a1</h1></body></html>' | tee /var/www/html/index.html EOF"
在
ZONE_A
可用区中创建vm-a2
gcloud compute instances create vm-a2 \ --image-family debian-12 \ --image-project debian-cloud \ --tags tcp-lb \ --zone ZONE_A \ --metadata startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf sudo service apache2 restart echo '<!doctype html><html><body><h1>vm-a2</h1></body></html>' | tee /var/www/html/index.html EOF"
在
ZONE_B
可用区中创建vm-b1
gcloud compute instances create vm-b1 \ --image-family debian-12 \ --image-project debian-cloud \ --tags tcp-lb \ --zone ZONE_B \ --metadata startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf sudo service apache2 restart echo '<!doctype html><html><body><h1>vm-b1</h1></body></html>' | tee /var/www/html/index.html EOF"
在
ZONE_B
可用区中创建vm-b2
gcloud compute instances create vm-b2 \ --image-family debian-12 \ --image-project debian-cloud \ --tags tcp-lb \ --zone ZONE_B \ --metadata startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf sudo service apache2 restart echo '<!doctype html><html><body><h1>vm-b2</h1></body></html>' | tee /var/www/html/index.html EOF"
创建实例组
在本部分中,您将在每个可用区中创建一个实例组并添加实例。
控制台
在 Google Cloud 控制台中,转到实例组页面。
点击创建实例组。
点击新建非代管式实例组。
将名称设置为
instance-group-a
。将可用区设置为
ZONE_A
。在端口映射下,点击添加端口。负载均衡器通过一个指定的端口将流量发送到实例组。创建一个已命名端口来将传入流量映射到特定的端口号。
- 将端口名称设置为
tcp110
。 - 将端口号设置为
110
。
- 将端口名称设置为
在虚拟机实例下,选择
vm-a1
和vm-a2
。其他设置保持不变。
点击创建。
重复执行上述步骤,但设置以下值:
- 名称:
instance-group-b
- 区域:
REGION_B
- 可用区:
ZONE_B
- 端口名称:
tcp110
- 端口号:
110
- 实例:vm-b1 和 vm-b2。
- 名称:
gcloud
创建
instance-group-a
实例组。gcloud compute instance-groups unmanaged create instance-group-a \ --zone ZONE_A
为实例组创建已命名的端口。
gcloud compute instance-groups set-named-ports instance-group-a \ --named-ports tcp110:110 \ --zone ZONE_A
将
vm-a1
和vm-a2
添加到instance-group-a
。gcloud compute instance-groups unmanaged add-instances instance-group-a \ --instances vm-a1,vm-a2 \ --zone ZONE_A
创建
us-ig2
实例组。gcloud compute instance-groups unmanaged create instance-group-b \ --zone ZONE_B
为实例组创建已命名的端口。
gcloud compute instance-groups set-named-ports instance-group-b \ --named-ports tcp110:110 \ --zone ZONE_B
将
vm-b1
和vm-b2
添加到实例组 bgcloud compute instance-groups unmanaged add-instances instance-group-b \ --instances vm-b1,vm-b2 \ --zone ZONE_B
现在,每个区域都有一个实例组。每个实例组都有两个虚拟机实例。
为外部代理网络负载均衡器创建防火墙规则
将防火墙配置为允许流量从负载均衡器和健康状况检查程序发送到实例。在这种情况下,我们将打开 TCP 端口 110。健康检查将使用同一端口。由于负载均衡器与实例之间的流量使用 IPv4,因此只需要打开 IPv4 范围。
控制台
在 Google Cloud 控制台中,转到防火墙页面。
点击创建防火墙规则。
在名称字段中,输入
allow-tcp-lb-and-health
。请选择一个网络。
在目标下,选择指定的目标标记。
将目标标记设置为
tcp-lb
。将来源过滤条件设置为 IPv4 范围。
将来源 IPv4 范围设置为
130.211.0.0/22
、35.191.0.0/16
。在协议和端口下,将指定的协议和端口设置为
tcp:110
。点击创建。
gcloud
gcloud compute firewall-rules create allow-tcp-lb-and-health \ --source-ranges 130.211.0.0/22,35.191.0.0/16 \ --target-tags tcp-lb \ --allow tcp:110
创建 IPv6 健康检查防火墙规则
确保您有一个适用于负载均衡实例且允许来自 Google Cloud 健康检查系统 (2600:2d00:1:b029::/64
) 的流量的入站流量规则。此示例使用目标标记 allow-health-check-ipv6
来标识应用该规则的虚拟机实例。
如果不使用此防火墙规则,则默认拒绝入站流量规则会阻止传入后端实例的 IPv6 流量。
控制台
在 Google Cloud 控制台中,转到防火墙页面。
如需允许 IPv6 子网流量,请再次点击创建防火墙规则,然后输入以下信息:
- 名称:
fw-allow-lb-access-ipv6
- 选择网络。
- 优先级:
1000
- 流量方向:入站
- 目标:指定的目标标记
- 目标标记:
allow-health-check-ipv6
- 来源过滤条件:IPv6 范围
- 来源 IPv6 范围:
2600:2d00:1:b029::/64
和2600:2d00:1:1::/64
- 协议和端口:允许全部
- 名称:
点击创建。
gcloud
创建 fw-allow-lb-access-ipv6
防火墙规则以允许与子网通信:
gcloud compute firewall-rules create fw-allow-lb-access-ipv6 \ --network=NETWORK \ --action=allow \ --direction=ingress \ --target-tags=allow-health-check-ipv6 \ --source-ranges=2600:2d00:1:b029::/64,2600:2d00:1:1::/64 \ --rules=all
配置负载均衡器
控制台
开始配置
在 Google Cloud 控制台中,转到负载均衡页面。
- 点击创建负载均衡器。
- 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步。
- 对于代理或直通,选择代理负载均衡器,然后点击下一步。
- 在公共或内部字段中,选择公共(外部),然后点击下一步。
- 在全球或单个区域部署字段中,选择最适合全球性工作负载,然后点击下一步。
- 对于负载均衡器生成,选择全球外部代理网络负载均衡器,然后点击下一步。
- 点击配置。
基本配置
将名称设置为 my-tcp-lb
。
后端配置
- 点击后端配置。
- 在后端类型下,选择实例组。
- 在协议下,选择 TCP。
- 在 IP 地址选择政策列表中,选择首选 IPv6。
- 配置第一个后端:
- 在新后端下,选择实例组
instance-group-a
。 - 保留其余的默认值。
- 在新后端下,选择实例组
- 配置第二个后端:
- 在 IP 栈类型字段中,选择
IPv4 and IPv6 (dual-stack)
。 - 点击添加后端。
- 选择实例组
instance-group-b
。 - 在端口号下,删除
80
并添加110
。
如需同时支持 IPv4 和 IPv6 流量,请执行以下操作:
- 在 IP 栈类型字段中,选择
- 配置健康检查:
- 在健康检查中,选择创建健康检查。
- 将健康检查的名称设置为
my-tcp-health-check
。 - 在协议下,选择 TCP。
- 将端口设置为
110
。 - 保留其余的默认值。
- 点击保存并继续。
- 在 Google Cloud 控制台中,验证后端配置旁边是否有对勾标记。如果没有对勾标记,请仔细检查您是否完成了所有步骤。
前端配置
- 点击前端配置。
- 添加第一条转发规则:
- 输入
my-tcp-lb-forwarding-rule
作为名称。 - 在协议下,选择 TCP。
- 在 IP 地址下,选择创建 IP 地址:
- 输入
tcp-lb-static-ip
作为名称。 - 点击保留。
- 输入
- 将端口设置为
110
。 - 在此示例中,请勿启用代理协议,因为它不适用于 Apache HTTP Server 软件。如需了解详情,请参阅代理协议。
- 点击完成。
- 输入
在 Google Cloud 控制台中,验证前端配置旁边是否有对勾标记。如果没有对勾标记,请仔细检查您是否完成了上述所有步骤。
检查并最终确定
- 点击检查并最终确定。
- 查看负载均衡器配置设置。
- 可选:点击等效代码以查看将用于创建负载均衡器的 REST API 请求。
- 点击创建。
gcloud
- 创建健康检查。
gcloud compute health-checks create tcp my-tcp-health-check --port 110
- 创建后端服务。
gcloud beta compute backend-services create my-tcp-lb \ --load-balancing-scheme EXTERNAL_MANAGED \ --global-health-checks \ --global \ --protocol TCP \ --ip-address-selection-policy=PREFER_IPV6 \ --health-checks my-tcp-health-check \ --timeout 5m \ --port-name tcp110
或者,您可以使用
--protocol SSL
配置从负载平衡器到实例之间的加密通信。 将实例组添加到后端服务。
gcloud beta compute backend-services add-backend my-tcp-lb \ --global \ --instance-group instance-group-a \ --instance-group-zone ZONE_A \ --balancing-mode UTILIZATION \ --max-utilization 0.8
gcloud beta compute backend-services add-backend my-tcp-lb \ --global \ --instance-group instance-group-b \ --instance-group-zone ZONE_B \ --balancing-mode UTILIZATION \ --max-utilization 0.8
- 配置目标 TCP 代理。如果您要开启代理标头,请将其设置为
PROXY_V1
,而不是NONE
。gcloud beta compute target-tcp-proxies create my-tcp-lb-target-proxy \ --backend-service my-tcp-lb \ --proxy-header NONE
- 预留全局静态 IPv4 和 IPv6 地址。
您的客户可以使用这些 IP 地址来访问已进行负载平衡的服务。
gcloud compute addresses create tcp-lb-static-ipv4 \ --ip-version=IPV4 \ --global
gcloud compute addresses create tcp-lb-static-ipv6 \ --ip-version=IPV6 \ --global
- 为两个地址配置全局转发规则。
gcloud beta compute forwarding-rules create my-tcp-lb-ipv4-forwarding-rule \ --load-balancing-scheme EXTERNAL_MANAGED \ --global \ --target-tcp-proxy my-tcp-lb-target-proxy \ --address tcp-lb-static-ipv4 \ --ports 110
测试负载均衡器
获取负载均衡器的 IP 地址。
要获取 IPv4 地址,请运行以下命令:
gcloud compute addresses describe tcp-lb-static-ipv4
要获取 IPv6 地址,请运行以下命令:
gcloud compute addresses describe tcp-lb-static-ipv6
通过运行以下命令将流量发送到负载均衡器。将
LB_IP_ADDRESS
替换为您的负载均衡器的 IPv4 或 IPv6 地址。curl -m1 LB_IP_ADDRESS:110
比方说,如果分配的 IPv6 地址为
[2001:db8:1:1:1:1:1:1/96]:110
,则该命令应如下所示:curl -m1 http://[2001:db8:1:1:1:1:1:1]:110
如果您无法访问负载均衡器,请尝试排查设置问题下所述的步骤。
其他配置选项
本部分对配置示例进行了扩展,以提供一些额外的替代配置选项。所有任务均为可选任务。您可以按任意顺序执行这些任务。
用于保留客户端连接信息的 PROXY 协议
代理网络负载均衡器会终结来自客户端的 TCP 连接,并创建与实例的新连接。默认情况下,系统不会保留原始客户端 IP 地址和端口信息。
如需保留原始连接信息并将其发送到实例,请启用 PROXY 协议版本 1。此协议将包含来源 IP 地址、目标 IP 地址和端口号的附加标头作为请求的一部分发送给实例。
请确保代理网络负载均衡器的后端实例运行的是支持 PROXY 协议标头的服务器。如果服务器未配置为支持 PROXY 协议标头,则后端实例将返回空响应。
如果您为用户流量设置了 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
更新目标代理的 PROXY 协议标头
此页面上的负载均衡器设置示例介绍了如何在创建代理网络负载均衡器时启用 PROXY 协议标头。请按照以下步骤更改现有目标代理的 PROXY 协议标头。
控制台
在 Google Cloud 控制台中,转到负载均衡页面。
- 点击负载均衡器对应的 修改。
- 点击前端配置。
- 将代理协议字段的值更改为开启。
- 点击更新以保存更改。
gcloud
在以下命令中,修改 --proxy-header
字段并将其设置为 NONE
或 PROXY_V1
,具体取决于您的要求。
gcloud compute target-tcp-proxies update TARGET_PROXY_NAME \ --proxy-header=[NONE | PROXY_V1]
配置会话亲和性
示例配置创建的后端服务没有会话亲和性。
以下流程介绍了如何为示例负载均衡器更新后端服务,以便后端服务使用客户端 IP 亲和性或生成的 Cookie 亲和性。
启用客户端 IP 亲和性后,负载均衡器会根据使用客户端 IP 地址和负载均衡器 IP 地址(外部转发规则的外部 IP 地址)创建的哈希,将特定客户端的请求定向到同一后端虚拟机。
控制台
如需启用客户端 IP 地址会话亲和性,请执行以下操作:
在 Google Cloud 控制台中,转到负载均衡页面。
点击后端。
点击 my-tcp-lb(您为此示例创建的后端服务的名称),然后点击修改。
在后端服务详情页面上,点击高级配置。
在会话亲和性下,从菜单中选择客户端 IP。
点击更新。
gcloud
使用以下 Google Cloud CLI 命令更新 my-tcp-lb
后端服务,并指定客户端 IP 会话亲和性:
gcloud compute backend-services update my-tcp-lb \ --global \ --session-affinity=CLIENT_IP
API
如需设置客户端 IP 会话亲和性,请向 backendServices/patch
方法发出 PATCH
请求。
PATCH https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/us-west1/backendServices/my-tcp-lb
{
"sessionAffinity": "CLIENT_IP"
}
启用连接排空
您可以在后端服务上启用连接排空,以确保在终止、手动移除或由自动扩缩器移除正在处理流量的实例时,对用户造成的干扰最小。如需详细了解连接排空,请参阅启用连接排空文档。