本文档介绍如何设置具有目标 SSL 代理和虚拟机实例后端的传统代理网络负载均衡器。在开始之前,请先阅读外部代理网络负载均衡器概览,了解这些负载均衡器的工作原理。
设置概览
此示例演示了如何为存在于两个区域(区域 A 和区域 B)中的服务设置外部代理网络负载均衡器。您将配置以下内容:
- 分布在两个区域中的四个实例
- 用于保存实例的实例组
- 包括以下内容的后端组件:
- 健康检查 - 用于监控实例的健康状况
- 后端服务 - 监控实例组并防止它们超出配置的使用量
- 后端 - 用于容纳实例组
- 包括以下内容的前端组件:
- 允许流量从负载均衡器和健康检查器传输到实例的防火墙规则。
- (可选)SSL 政策,用于控制 SSL 代理负载均衡器与客户端协商的 SSL 功能。
之后,您将测试自己的配置。
权限
若要按照本指南中的说明进行操作,您必须能够创建实例以及修改项目中的网络。因此,您必须具有项目的 Owner 或 Editor 角色,或者必须拥有以下所有 Compute Engine IAM 角色:
任务 | 所需角色 |
---|---|
创建网络、子网和负载均衡器组件 | Network Admin |
添加和移除防火墙规则 | Security Admin |
创建实例 | Compute Instance Admin |
如需了解详情,请参阅以下指南:
配置网络和子网
如需创建示例网络和子网,请按照以下步骤操作。
控制台
在 Google Cloud 控制台中,进入 VPC 网络页面。
点击创建 VPC 网络。
输入网络的名称。
为子网创建模式选择自定义。
在新子网部分,为子网指定以下配置参数:
- 在名称字段中,提供子网的名称。
- 在区域字段中,输入区域名称。
- 在 IP 栈类型字段中,选择 IPv4(单栈)。
- 在 IP 地址范围字段中,输入 IP 地址范围。这是子网的主要 IPv4 地址范围。
点击完成。
如需在其他区域中添加子网,请点击添加子网,然后重复上述步骤。
点击创建。
gcloud
gcloud compute networks subnets update SUBNET \ --network=NETWORK \ --stack-type=IPV4_ONLY \ --range=10.1.2.0/24 \ --region=REGION_A
替换以下内容:
NETWORK
:VPC 网络的名称SUBNET
:子网的名称REGION_A
:区域的名称
配置实例和实例组
本部分介绍了如何创建实例和实例组并将实例添加到实例组中。 生产系统通常会使用基于实例模板的托管实例组,但这种设置对于初始测试来说会更快。
创建实例
使用防火墙规则稍后将用到的 ssl-lb
标记创建这些实例。
控制台
创建实例
在 Google Cloud 控制台中,前往虚拟机实例页面。
点击创建实例。
将名称设置为
vm-a1
。将可用区设置为 ZONE_A。
点击高级选项。
点击网络并配置以下字段:
- 在网络标记字段中,输入
ssl-lb
和allow-health-check-ipv6
。
- 在网络标记字段中,输入
在网络接口部分中,点击修改并进行以下更改:
- 选择网络。
选择子网。
点击完成。
点击管理。将以下脚本输入启动脚本字段。
sudo apt-get update sudo apt-get install apache2 -y sudo a2ensite default-ssl sudo a2enmod ssl 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 a2ensite default-ssl sudo a2enmod ssl sudo service apache2 restart echo '<!doctype html><html><body><h1>vm-a2</h1></body></html>' | sudo tee /var/www/html/index.html
使用相同的设置创建
vm-b1
,但需要将可用区设置为ZONE_B
,并将启动脚本设置为以下内容:sudo apt-get update sudo apt-get install apache2 -y sudo a2ensite default-ssl sudo a2enmod ssl sudo service apache2 restart echo '<!doctype html><html><body><h1>vm-b1</h1></body></html>' | sudo tee /var/www/html/index.html
使用相同的设置创建
vm-b2
,但需要将可用区设置为ZONE_B
,并将启动脚本设置为以下内容:sudo apt-get update sudo apt-get install apache2 -y sudo a2ensite default-ssl sudo a2enmod ssl 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 ssl-lb \ --zone ZONE_A \ --metadata startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo a2ensite default-ssl sudo a2enmod ssl sudo service apache2 restart echo '<!doctype html><html><body><h1>vm-a1</h1></body></html>' | sudo 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=ssl-lb \ --zone=ZONE_A \ --metadata=startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo a2ensite default-ssl sudo a2enmod ssl sudo service apache2 restart echo '<!doctype html><html><body><h1>vm-a2</h1></body></html>' | sudo 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=ssl-lb \ --zone=ZONE_B \ --metadata=startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo a2ensite default-ssl sudo a2enmod ssl sudo service apache2 restart echo '<!doctype html><html><body><h1>vm-b1</h1></body></html>' | sudo 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=ssl-lb \ --zone=ZONE_B \ --metadata=startup-script="#! /bin/bash sudo apt-get update sudo apt-get install apache2 -y sudo a2ensite default-ssl sudo a2enmod ssl sudo service apache2 restart echo '<!doctype html><html><body><h1>vm-b2</h1></body></html>' | sudo tee /var/www/html/index.html EOF"
为每个地区创建实例组并添加实例
控制台
在 Google Cloud 控制台中,转到实例组页面。
点击创建实例组。
将名称设置为
instance-group-a
。将可用区设置为
ZONE_A
。在端口映射下,点击添加端口。负载均衡器通过一个指定的端口将流量发送到实例组。创建一个已命名端口来将传入流量映射到特定的端口号。
- 输入端口名称
ssl-lb
和端口号443
。
- 输入端口名称
在实例定义下,点击选择现有实例。
在虚拟机实例中,选择
vm-a1
和vm-a2
。其他设置保持不变。
点击创建。
重复上述步骤,但设置以下内容:
- 名称:
instance-group-b
- 可用区:
ZONE_B
- 端口名称
ssl-lb
和端口号443
- 实例: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=ssl-lb:443 \ --zone=ZONE_A
将
vm-a1
和vm-a2
添加到 instance-group-agcloud compute instance-groups unmanaged add-instances instance-group-a \ --instances=vm-a1,vm-a2 \ --zone=ZONE_A
创建
instance-group-b
实例组。gcloud compute instance-groups unmanaged create instance-group-b --zone ZONE_B
为实例组设置一个命名端口。
gcloud compute instance-groups set-named-ports instance-group-b \ --named-ports=ssl-lb:443 \ --zone=ZONE_B
将
vm-b1
和vm-b2
添加到 instance-group-bgcloud compute instance-groups unmanaged add-instances instance-group-b \ --instances=vm-b1,vm-b2 \ --zone=ZONE_B
您现在具有两个地区,每个地区中具有一个实例组,而每个实例组具有两个实例。
为 SSL 负载均衡器创建防火墙规则
将防火墙配置为允许来自负载均衡器和健康检查程序的流量发送到实例。
控制台
在 Google Cloud 控制台中,转到防火墙页面。
点击创建防火墙规则。
在名称字段中,输入
allow-ssl-lb-and-health
。选择网络。
在目标下,选择指定的目标标记。
将目标标记设置为
ssl-lb
。将来源过滤条件设置为 IPv4 范围。
将来源 IPv4 范围设置为
130.211.0.0/22
和35.191.0.0/16
。在协议和端口下,将指定的协议和端口设置为
tcp:443
。点击创建。
gcloud
gcloud compute firewall-rules create allow-ssl-lb-and-health \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --target-tags=ssl-lb \ --allow=tcp:443
如果您要使用 Google 管理的证书,请确认证书资源的状态为“有效”。如需了解详情,请参阅 Google 管理的 SSL 证书资源状态。
gcloud compute ssl-certificates list
配置负载均衡器
控制台
开始配置
在 Google Cloud 控制台中,转到负载均衡页面。
- 点击创建负载均衡器。
- 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步。
- 对于代理或直通,选择代理负载均衡器,然后点击下一步。
- 在公共或内部字段中,选择公共(外部),然后点击下一步。
- 在全球或单个区域部署字段中,选择最适合全球性工作负载,然后点击下一步。
- 对于负载均衡器生成,选择传统代理网络负载均衡器,然后点击下一步。
- 点击配置。
基本配置
将名称设置为 my-ssl-lb
。
后端配置
- 点击后端配置。
- 在后端类型下,选择实例组。
- 将协议设置为 SSL。
- 对于已命名端口,输入
ssl-lb
。 - 接受超时的默认值。
- 将后端类型设置为实例组。
- 配置第一个后端:
- 在新后端下,选择实例组
instance-group-a
。 - 将端口号设置为
443
。 - 保留其余的默认值。
- 在新后端下,选择实例组
- 配置第二个后端:
- 点击添加后端。
- 选择实例组
instance-group-b
。 - 将端口号设置为
443
。 - 点击完成。
- 配置健康检查:
- 在健康检查中,选择创建健康检查。
- 将健康检查的名称设置为
my-ssl-health-check
。 - 在协议下,选择 SSL。
- 保留其余的默认值。
- 点击保存并继续。
- 在 Google Cloud 控制台中,验证后端配置旁边是否有对勾标记。如果没有对勾标记,请仔细检查您是否完成了所有步骤。
前端配置
- 点击前端配置。
- 输入
my-ssl-lb-forwarding-rule
作为名称。 - 在协议下,选择 SSL。
- 在 IP 地址下,选择创建 IP 地址:
- 输入
ssl-lb-static-ipv4
作为名称。 - 点击预留。
- 输入
- 在证书下,选择创建新证书。
- 输入
my-ssl-cert
作为名称。 - 如果您选择上传我的证书,请完成以下步骤:
- 粘贴您的证书,或点击上传以找到您的证书文件。
- 粘贴您的私钥,或点击上传以找到您的私钥文件。
- 如果您选择创建 Google 管理的证书,请输入网域。
- 要输入其他网域,请点击添加网域。
- 点击创建。
- 如需添加除了主要 SSL 证书资源之外的其他证书资源,请点击其他证书。然后从证书菜单中选择另一个证书,或点击创建新证书并按照上述说明操作。
- (可选)如需创建 SSL 政策,请执行以下操作:
- 在 SSL 政策下,选择创建政策。
- 输入
my-ssl-policy
作为名称。 - 对于最低的 TLS 版本,请选择 TLS 1.0。
- 对于配置文件,请选择新型。系统会显示已启用的功能和已停用的功能。
- 点击保存。
- 可选:开启代理协议。
- 点击完成。
- 点击添加前端 IP 和端口。
- 输入
my-ssl-lb-ipv6-forwarding-rule
作为名称。 - 将 IP 版本设置为
IPv6
。 - 在 IP 地址下,点击创建 IP 地址。
- 输入
ssl-lb-static-ipv6
作为名称。 - 点击预留。
- 输入
- 在证书下,选择
my-ssl-cert
。 - 如需添加除了主要 SSL 证书资源之外的其他证书资源,请从证书列表中选择一个证书,或点击创建新证书。
- 可选:使用 SSL 政策或开启代理协议。
- 点击完成。
- 在 Google Cloud 控制台中,验证前端配置旁边是否有绿色对勾标记。如果没有对勾标记,请仔细检查您是否完成了上述所有步骤。
- 点击完成。
- 添加第一条转发规则:
- 添加第二条转发规则:
检查并最终确定
- 点击检查并最终确定。
- 查看负载均衡器配置设置。
- 可选:点击等效代码以查看将用于创建负载均衡器的 REST API 请求。
- 点击创建。
gcloud
- 创建健康检查。
gcloud compute health-checks create ssl my-ssl-health-check --port=443
- 创建后端服务。
gcloud compute backend-services create my-ssl-lb \ --load-balancing-scheme EXTERNAL \ --global-health-checks \ --protocol=SSL \ --port-name=ssl-lb \ --health-checks=my-ssl-health-check \ --timeout=5m \ --global
或者,您可以使用
--protocol=TCP
配置从负载均衡器到实例的未加密通信。 - 将实例组添加到后端服务。
gcloud compute backend-services add-backend my-ssl-lb \ --instance-group=instance-group-a \ --instance-group-zone=ZONE_A \ --balancing-mode=UTILIZATION \ --max-utilization=0.8 \ --global
gcloud compute backend-services add-backend my-ssl-lb \ --instance-group=instance-group-b \ --instance-group-zone=ZONE_B \ --balancing-mode=UTILIZATION \ --max-utilization=0.8 \ --global
- 配置 SSL 证书资源。
如果您要使用自行管理的证书,则必须至少已有一个可上传的 SSL 证书。如果您没有相应证书,请参阅 SSL 证书概览。如果您使用多个 SSL 证书,则必须一次创建一个证书。
如果您要使用自行管理的 SSL 证书,并且没有私钥和签名证书,则可以创建并使用自签名证书进行测试。
如需创建自行管理的 SSL 证书资源,请运行以下命令:
gcloud compute ssl-certificates create my-ssl-cert \ --certificate=CRT_FILE_PATH \ --private-key=KEY_FILE_PATH
如需创建 Google 管理的 SSL 证书资源,请运行以下命令:
gcloud compute ssl-certificates create www-ssl-cert \ --domains=DOMAIN_1,DOMAIN_2
- 配置目标 SSL 代理。
外部代理网络负载均衡器支持创建具有 1 到 15 个 SSL 证书的目标 SSL 代理。在运行此命令之前,您必须为每个证书创建一个 SSL 证书资源。
如果您要开启代理标头,请将其设置为
PROXY_V1
,而不是none
。您可以视情况选择将某项 SSL 政策附加到目标代理。首先,请创建政策。gcloud compute ssl-policies create my-ssl-policy \ --profile=MODERN \ --min-tls-version=1.0
然后将该政策附加到目标代理。
gcloud compute target-ssl-proxies create my-ssl-lb-target-proxy \ --backend-service=my-ssl-lb \ --ssl-certificates=[SSL_CERT_1][,[SSL_CERT_2],...] \ --ssl-policy=my-ssl-policy \ --proxy-header=NONE
- 预留全局静态 IP 地址。
您的客户会使用这些 IP 地址来访问已进行负载均衡的服务。
gcloud compute addresses create ssl-lb-static-ipv4 \ --ip-version=IPV4 \ --global
gcloud compute addresses create ssl-lb-static-ipv6 \ --ip-version=IPV6 \ --global
- 配置全局转发规则。
创建与目标代理相关联的全局转发规则。 将 LB_STATIC_IP 和 LB_STATIC_IPV6 替换为您在预留全球静态 IP 地址中生成的 IP 地址。
gcloud compute forwarding-rules create my-ssl-lb-forwarding-rule \ --load-balancing-scheme EXTERNAL \ --global \ --target-ssl-proxy=my-ssl-lb-target-proxy \ --address=LB_STATIC_IP \ --ports=443
gcloud compute forwarding-rules create my-ssl-lb-ipv6-forwarding-rule \ --load-balancing-scheme EXTERNAL \ --global \ --target-ssl-proxy=my-ssl-lb-target-proxy \ --address=LB_STATIC_IPV6 \ --ports=443
将您的网域连接到负载均衡器
创建负载均衡器后,请记好与负载均衡器关联的 IP 地址,例如 30.90.80.100
。如需将您的网域指向负载均衡器,请使用您的网域注册服务创建 A
记录。如果您向 SSL 证书添加了多个网域,则必须为每个网域添加一条 A
记录,所有网域均指向负载均衡器的 IP 地址。例如,如需为 www.example.com
和 example.com
创建 A
记录,请使用以下命令:
NAME TYPE DATA www A 30.90.80.100 @ A 30.90.80.100
如果您使用 Cloud DNS 作为 DNS 提供商,请参阅添加、修改和删除记录。
测试负载均衡器
在网络浏览器中,使用 HTTPS 连接到您的静态 IP 地址。在此测试设置中,实例使用的是自签名证书。因此,在您第一次访问页面时,您会在浏览器中看到一条警告。点击该警告即可查看实际页面。将 IP_ADDRESS 替换为您之前创建的 IPv4 或 IPv6 地址。
https://IP_ADDRESS
您应该会看到离您最近的地区中的一台主机。重新加载此页面,直到您看到该区域中的其他实例。如需查看其他地区中的实例,请停止离您最近的区域中的实例。
或者,您也可以在本地机器的命令行中使用 curl
。
如果您在 SSL 代理上使用自签名证书,则还必须指定 -k
。即使您拥有自签名证书或根本没有证书,都可选择 curl -k
选项来使 curl 发挥作用。如果您拥有一个普通证书,则可以移除该参数。您只能将 -k
参数用于测试您自己的网站。在正常情况下,有效证书是一项重要的安全措施,因此不应忽略证书警告。
将 IP_ADDRESS 替换为您之前创建的 IPv4 或 IPv6 地址。
curl -k https://IP_ADDRESS
如果您无法访问负载均衡器,请尝试排查设置问题下所述的步骤。
其他配置选项
本部分对配置示例进行了扩展,以提供一些额外的替代配置选项。所有任务均为可选任务。您可以按任意顺序执行这些任务。
用于保留客户端连接信息的 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-ssl-proxies update TARGET_PROXY_NAME \ --proxy-header=[NONE | PROXY_V1]
配置会话亲和性
以下过程介绍了如何更新示例 SSL 代理负载均衡器的后端服务,以使后端服务使用客户端 IP 亲和性。
启用客户端 IP 亲和性后,负载均衡器会根据使用客户端 IP 地址和负载均衡器 IP 地址(外部转发规则的外部 IP 地址)创建的哈希,将特定客户端的请求定向到同一后端虚拟机。
控制台
如需启用客户端 IP 地址会话亲和性,请执行以下操作:
在 Google Cloud 控制台中,转到负载均衡页面。
点击后端。
点击 my-ssl-lb(您为此示例创建的后端服务的名称),然后点击修改。
在后端服务详情页面上,点击高级配置。
在会话亲和性下,从菜单中选择客户端 IP。
点击更新。
gcloud
使用以下命令更新 my-ssl-lb
后端服务,并指定客户端 IP 会话亲和性:
gcloud compute backend-services update my-ssl-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-ssl-lb
{
"sessionAffinity": "CLIENT_IP"
}
启用连接排空
您可以在后端服务上启用连接排空,以确保在终止、手动移除或由自动扩缩器移除正在处理流量的实例时,对用户造成的干扰最小。如需详细了解连接排空,请参阅启用连接排空文档。
后续步骤
- 如需了解外部代理网络负载均衡器的监控工作原理,请参阅外部代理网络负载均衡器日志记录和监控。
- 如需了解 SSL 政策的工作原理,请参阅 SSL 政策概览。
- 如需了解如何配置 SSL 政策,请参阅使用 SSL 政策。