本指南演示了如何创建符合以下条件的 Google Cloud HTTPS 负载平衡器:
- 根据请求网址路径选择后端服务(基于内容的负载平衡)。
- 将请求路由到靠近客户端的后端(跨区域负载平衡)。
在开始之前,请确保您已熟悉 HTTP(S) 负载平衡概念。
如需查看简化示例,请参阅设置简单的外部 HTTP 负载平衡器或设置简单的外部 HTTPS 负载平衡器。如需查看高级路由示例(例如 HTTP 重写和重定向),请参阅为外部 HTTP(S) 负载平衡器设置流量管理。
概览
本指南介绍如何创建负载平衡器,该负载平衡器根据请求网址中的路径引导流量并平衡多个区域的流量。您将在美国(us-central1-b 地区)和欧盟(eu-west1-b 地区)这两个区域总共创建八个 Compute Engine 实例,然后创建一个负载平衡器,用于将流量路由到这些实例。
按照说明完成操作后,您的负载平衡器配置如下:
- 包含以
/video
开头的网址路径的流量会路由到一个后端服务。 - 包含与上述格式不匹配的网址路径的流量会路由到另一个后端服务。
在本方法指南文档中,您将创建如下图所示的配置:
图中事件顺序如下:
- 客户端访问
https://www.example.com/video/concert
网址,并向转发规则中定义的外部 IP 地址发送内容请求。请求可以使用 IPv4 或 IPv6;这两种协议有相应的转发规则。 - 转发规则将请求定向到目标 HTTPS 代理。
- 目标代理使用网址映射中指定的规则来确定用于接收请求的后端服务。包含
/video
的请求(例如https://www.example.com/video/concert
)会发送到video-backend-service
。其他任何网址路径都会发送到默认服务web-backend-service
。 - 负载平衡器根据后端服务的实例组加载情况以及与客户端的邻近程度,确定哪个实例组应该处理请求,并将请求定向到该组中的某个实例。
- 该实例提供每个用户请求的内容。
video
实例提供视频内容,而www
实例则提供其他所有内容。
在此示例中,负载平衡器会接受来自客户端的 HTTPS 请求,并作为代理将这些请求以 HTTP 格式发送到后端。您还可以将负载平衡器配置为接受 HTTP 请求,以及在将请求代理到后端时使用 HTTPS。
准备工作
本指南中的说明需要用到项目。 如果您还没有项目,请立即设置一个。 这些说明将指导您创建自定义模式虚拟私有云 (VPC) 网络。 您还必须设置自定义防火墙规则,以允许流量到达实例。
如果您希望通过命令行进行操作,请安装 gcloud
命令行工具。如需了解该工具的概念信息和安装信息,请参阅 gcloud 概览。
权限
要完成本指南中的步骤,您必须拥有在项目中创建 Compute Engine 实例的权限。您必须拥有项目的 Owner 或 Editor 角色,或者必须拥有以下 Compute Engine IAM 角色:
任务 | 所需角色 |
---|---|
创建实例 | Instance Admin |
添加和移除防火墙规则 | Security Admin |
创建负载平衡器组件 | Network Admin |
创建项目(可选) | Project Creator |
如需了解详情,请参阅以下指南:
设置
可选:创建新项目
建议拥有 resourcemanager.projects.create
权限的用户先创建一个新项目,然后再按照本方法指南的其余说明操作。这样可以简化本指南末尾的清理工作。
配置网络和子网
在此示例中,请使用以下 VPC 网络、区域和子网:
网络:网络为自定义模式 VPC 网络,名为
lb-network
。两个不同区域中的子网:
us-subnet
使用10.1.10.0/24
作为其主要 IP 地址范围,并且位于us-central1
区域eu-subnet
使用10.1.11.0/24
作为其主要 IP 地址范围,并且位于europe-west1
区域
如需创建示例网络和子网,请按照以下步骤操作:
控制台
- 转到 Google Cloud Console 中的“VPC 网络”页面。
转到“VPC 网络”页面 - 点击创建 VPC 网络。
- 输入
lb-network
作为名称。 - 在子网部分,创建第一个子网:
- 将子网创建模式设置为自定义。
- 在新子网部分中,输入以下信息:
- 名称:
us-subnet
- 区域:
us-central1
- IP 地址范围:
10.1.10.0/24
- 点击完成。
- 名称:
- 仍然在子网部分,点击添加子网并创建第二个子网:
- 在新子网部分中,输入以下信息:
- 名称:
eu-subnet
- 区域:
europe-west1
- IP 地址范围:
10.1.11.0/24
- 点击完成。
- 名称:
- 在新子网部分中,输入以下信息:
- 点击创建。
gcloud
创建自定义 VPC 网络:
gcloud compute networks create lb-network --subnet-mode=custom
创建
us-subnet
:gcloud compute networks subnets create us-subnet \ --network=lb-network \ --range=10.1.10.0/24 \ --region=us-central1
创建
eu-subnet
:gcloud compute networks subnets create eu-subnet \ --network=lb-network \ --range=10.1.11.0/24 \ --region=europe-west1
配置防火墙规则
默认的拒绝入站流量规则会阻止传入后端实例的流量,包括来自负载平衡器和 Google Cloud 运行状况检查系统的流量。您必须创建新的防火墙规则以替换默认的规则并允许流量到达您的实例。
在此示例中,您将创建以下防火墙规则:
fw-allow-ssh
:适用于负载平衡实例的入站规则,该规则允许从任何地址到 TCP 端口 22 的传入 SSH 连接。您可以为此规则选择限制性更高的源 IP 地址范围;例如,您可以仅指定要从中启动 SSH 会话的系统的 IP 地址范围。此示例使用目标标记allow-ssh
来标识应该应用该规则的后端虚拟机。fw-allow-health-check-and-proxy
:入站流量规则,它适用于负载平衡实例,允许来自负载平衡器和 Google Cloud 运行状况检查系统(130.211.0.0/22
和35.191.0.0/16
)的流量。此示例使用目标标记allow-hc-and-proxy
来标识应该应用该规则的后端虚拟机。
控制台
- 转到 Google Cloud Console 中的“防火墙”页面。
转到“防火墙”页面 - 点击创建防火墙规则,创建第一条防火墙规则:
- 输入
fw-allow-ssh
作为名称。 - 在网络下,选择
lb-network
。 - 在目标下,选择指定的目标标记。
- 使用
allow-ssh
填充目标标记字段。 - 将来源过滤条件设置为
IP ranges
。 - 将来源 IP 地址范围设置为
0.0.0.0/0
。 - 在协议和端口下,选择指定的协议和端口。
- 选中 tcp 旁边的复选框,然后输入端口号
22
。 - 点击创建。
- 输入
- 点击创建防火墙规则,创建第二条防火墙规则:
- 输入
fw-allow-health-check-and-proxy
作为名称。 - 在网络下,选择
lb-network
。 - 在目标下,选择指定的目标标记。
- 使用
allow-hc-and-proxy
填充目标标记字段。 - 将来源过滤条件设置为
IP ranges
。 - 将来源 IP 地址范围设置为
130.211.0.0/22
和35.191.0.0/16
。 - 在协议和端口下,选择指定的协议和端口。
- 选中 tcp 旁边的复选框,然后输入端口号
80,443
。 - 点击创建。
- 输入
gcloud
创建
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
创建
fw-allow-health-check-and-proxy
规则,以允许负载平衡器和 Google Cloud 运行状况检查与 TCP 端口80
和443
上的后端实例进行通信:gcloud compute firewall-rules create fw-allow-health-check-and-proxy \ --network=lb-network \ --action=allow \ --direction=ingress \ --target-tags=allow-hc-and-proxy \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --rules=tcp:80,tcp:443
创建实例
在此示例中,您将创建 8 个虚拟机实例 (VM):4 个用于提供视频内容,4 个用于提供其他所有内容。您使用启动脚本安装 Apache Web 服务器软件,并为每个实例分别提供唯一主页。注意,您可以在虚拟机上使用任何 Web 服务器;为方便起见,本例中安装了 Apache。
控制台
创建后端虚拟机
- 转到 Google Cloud Console 中的“虚拟机实例”页面。
转到“虚拟机实例”页面 - 使用以下名称、区域和子网组合重复以下步骤,创建 8 个虚拟机。
- 名称:
www-us-01
,区域:us-central1
,子网:us-subnet
- 名称:
www-us-02
,区域:us-central1
,子网:us-subnet
- 名称:
video-us-01
,区域:us-central1
,子网:us-subnet
- 名称:
video-us-02
,区域:us-central1
,子网:us-subnet
- 名称:
www-eu-01
,区域:europe-west1
,子网:eu-subnet
- 名称:
www-eu-02
,区域:europe-west1
,子网:eu-subnet
- 名称:
video-eu-01
,区域:europe-west1
,子网:eu-subnet
- 名称:
video-eu-02
,区域:europe-west1
,子网:eu-subnet
- 名称:
- 点击创建实例。
- 按照第 2 步中的说明设置名称和区域。您可以选择该区域中的任何地区;此示例使用
us-central1
中的us-central1-b
和europe-west1
中的europe-west1-b
。 - 在启动磁盘部分,确保所选映像为 Debian GNU/Linux 9 Stretch。如有必要,请点击变更以更改映像。
点击管理、安全、磁盘、网络、单独租用并进行以下更改:
- 点击网络并添加以下网络标记:
allow-ssh
和allow-hc-and-proxy
- 点击网络接口下的“修改”按钮 (
- 网络:
lb-network
- 子网:按照第 2 步中的说明选择子网。
- 主要内部 IP:临时(自动)
- 外部 IP:临时
) 并进行以下变更,然后点击完成:
- 网络:
点击管理。在启动脚本字段中,复制并粘贴以下脚本内容。所有八个虚拟机的脚本内容均相同:
#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ # See https://cloud.google.com/compute/docs/storing-retrieving-metadata#querying http://169.254.169.254/computeMetadata/v1/instance/name)" filter="{print \$NF}" vm_zone="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/zone \ | awk -F/ "${filter}")" echo "Page on $vm_hostname in $vm_zone" | \ tee /var/www/html/index.html echo "AliasMatch /video(.*)$ /var/www/html/index.html" | \ tee /etc/apache2/conf-enabled/video.conf systemctl restart apache2
- 点击网络并添加以下网络标记:
点击创建。
创建实例组
- 转到 Google Cloud Console 中的“实例组”页面。
转到“实例组”页面 - 使用以下组合重复执行以下步骤,以创建四个非托管式实例组,每个实例组包含两个虚拟机。
- 实例组:
ig-www-us
,区域:us-central1
,地区:us-central1-b
,子网:us-subnet
,虚拟机:www-us-01
和www-us-02
- 实例组:
ig-video-us
,区域:us-central1
,地区:us-central1-b
,子网:us-subnet
,虚拟机:video-us-01
和video-us-02
- 实例组:
ig-www-eu
,区域:europe-west1
,地区:europe-west1-b
,子网:eu-subnet
,虚拟机:www-eu-01
和www-eu-02
- 实例组:
ig-video-eu
,区域:europe-west1
,地区:europe-west1-b
,子网:eu-subnet
,虚拟机:video-eu-01
和video-eu-02
- 实例组:
- 点击创建实例组,然后选择新建非托管式实例组。
- 按照第 2 步中的说明设置名称。
- 在位置部分,选择第 2 步中指定的区域和地区。
- 对于网络,请输入
lb-network
。 - 对于子网,请输入第 2 步中说明的子网。
- 在虚拟机实例部分中,添加第 2 步中说明的虚拟机。
- 点击创建。
gcloud
使用以下名称、地区和子网组合重复运行以下命令,创建 8 个虚拟机。请相应地替换 vm-name、zone 和 subnet:
- 名称:
www-us-01
,地区:us-central1-b
,子网:us-subnet
- 名称:
www-us-02
,地区:us-central1-b
,子网:us-subnet
- 名称:
video-us-01
,地区:us-central1-b
,子网:us-subnet
- 名称:
video-us-02
,地区:us-central1-b
,子网:us-subnet
- 名称:
www-eu-01
,地区:europe-west1-b
,子网:eu-subnet
- 名称:
www-eu-02
,地区:europe-west1-b
,子网:eu-subnet
- 名称:
video-eu-01
,地区:europe-west1-b
,子网:eu-subnet
- 名称:
video-eu-02
,地区:europe-west1-b
,子网:eu-subnet
gcloud compute instances create vm-name \ --zone=zone \ --image-family=debian-9 \ --image-project=debian-cloud \ --tags=allow-ssh,allow-hc-and-proxy \ --subnet=subnet \ --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)" filter="{print \$NF}" vm_zone="$(curl -H "Metadata-Flavor:Google" \ http://169.254.169.254/computeMetadata/v1/instance/zone \ | awk -F/ "${filter}")" echo "Page on $vm_hostname in $vm_zone" | \ tee /var/www/html/index.html echo "AliasMatch /video(.*)$ /var/www/html/index.html" | \ tee /etc/apache2/conf-enabled/video.conf systemctl restart apache2'
- 名称:
使用以下名称和地区组合重复运行以下命令,以创建四个非托管式实例组。请相应地替换 instance-group-name 和 zone:
- 实例组:
ig-www-us
,地区:us-central1-b
- 实例组:
ig-video-us
,地区:us-central1-b
- 实例组:
ig-www-eu
,地区:europe-west1-b
- 实例组:
ig-video-eu
,地区:europe-west1-b
gcloud compute instance-groups unmanaged create instance-group-name \ --zone=zone
- 实例组:
重复运行以下命令四次,并根据以下组合向每个实例组添加两个虚拟机。请相应地替换 instance-group-name、zone 和 instances:
- 实例组:
ig-www-us
,地区:us-central1-b
,实例:www-us-01
、www-us-02
- 实例组:
ig-video-us
,地区:us-central1-b
,实例:video-us-01
、video-us-02
- 实例组:
ig-www-eu
,地区:europe-west1-b
,实例:www-eu-01
、www-eu-02
- 实例组:
ig-video-eu
,地区:europe-west1-b
,实例:video-eu-01
、video-eu-02
gcloud compute instance-groups unmanaged add-instances instance-group-name \ --zone=zone \ --instances=instances
以下示例展示了向第一个实例组添加两个实例的命令:
gcloud compute instance-groups unmanaged add-instances ig-www-us \ --zone=us-central1-b \ --instances=www-us-01,www-us-02
- 实例组:
保留外部 IP 地址
现在您的实例已启动并正在运行,请设置负载平衡所需的服务。在本部分中,您将创建两个全局静态外部 IP 地址,您的客户将使用这些地址访问负载平衡器。
控制台
- 转到 Google Cloud Console 中的“外部 IP 地址”页面。
转到“外部 IP 地址”页面 - 点击预留静态地址以预留 IPv4 地址。
- 指定名称
lb-ipv4-1
。 - 将网络层级设置为优质。
- 将 IP 版本设置为 IPv4。
- 将类型设置为全局。
- 点击保留。
- 再次点击预留静态地址以预留 IPv6 地址。
- 指定名称
lb-ipv6-1
。 - 将网络层级设置为优质。
- 将 IP 版本设置为 IPv6。
确保将类型设置为全局。
在此示例中,负载平衡器使用优质层级网络。 使用标准层级网络的负载平衡器将使用区域 IP 地址。标准层级无法使用 IPv6 地址。
点击保留。
gcloud
预留 IPv4 地址:
gcloud compute addresses create lb-ipv4-1 \ --ip-version=IPV4 \ --global
预留 IPv6 地址:
gcloud compute addresses create lb-ipv6-1 \ --ip-version=IPV6 \ --global
配置负载平衡资源
负载平衡器功能包含多个连接的资源。 在本部分中,您将设置并连接这些资源。这些资源如下:
- 命名端口 - 负载平衡器使用这些端口将流量导向您的实例组。
- 运行状况检查 - 用于轮询您的实例,以查看其运行状况是否良好。负载平衡器仅向运行状况良好的实例发送流量。
- 后端服务 - 用于跟踪容量、会话粘性和运行状况检查状态。后端服务根据容量和实例运行状况将请求定向到后端虚拟机或端点。
- 网址映射 - 负载平衡器根据请求网址的主机和路径,使用该映射将请求定向到特定的后端服务。
- SSL 证书资源。 SSL 证书资源包含 SSL 证书信息,负载平衡器在 HTTPS 客户端连接到 TLS 时使用这些信息终止 TLS。您可以使用多个 SSL 证书,这些证书可以是 Google 管理的 SSL 证书或自行管理的 SSL 证书的任意组合。您必须为所使用的每个证书创建一个 SSL 证书资源。
- 目标 HTTPS 代理 - 负载平衡器使用该代理将您的网址映射和 SSL 证书与您的全局转发规则相关联。
两条全局转发规则(IPv4 和 IPv6 各一条)- 用于保留全局外部 IP 地址资源。全局转发规则将传入的请求转发到目标代理。
控制台
为您的负载平衡器命名
- 转到 Google Cloud Console 中的“负载平衡”页面。
转到“负载平衡”页面 - 在 HTTP(S) 负载平衡下,点击开始配置。
- 在面向互联网或仅限内部下,选择从互联网到我的虚拟机。
- 点击继续。
- 对于负载平衡器的名称,请输入
web-map
。 - 不关闭窗口继续操作。
为 www
实例配置后端服务和运行状况检查
负载平衡器需要两个后端服务,还需要进行运行状况检查,才能为这两个服务提供相关服务。在此示例中,负载平衡器终止来自客户端的 HTTPS 请求,并使用 HTTP 与后端进行通信。为此,您需要为后端协议和运行状况检查指定 HTTP。
为 www
实例配置后端服务
- 点击后端配置。
- 在创建或选择后端服务下拉菜单中,将鼠标指针悬停在后端服务上,然后选择创建后端服务。
- 将后端服务的名称设置为
web-backend-service
。 - 确保将后端类型设置为实例组。
- 在协议下拉菜单中,选择 HTTP。
- 在已命名的端口字段中,输入
http
。 - 在后端下,将实例组设置为
ig-www-us
。 - 对于负载平衡器和实例之间的流量,请将端口号设置为
80
。 - 保留其余字段的默认值。
- 点击新后端窗口底部的完成。
- 点击添加后端 (Add backend) 并重复相关步骤,但是要选择实例组
ig-www-eu
。 - 不关闭窗口继续操作。
为 www
实例配置运行状况检查
- 在运行状况检查下的后端配置窗口中,选择创建运行状况检查或另创建一项运行状况检查。
- 如需创建 HTTP 运行状况检查,请设置以下运行状况检查参数:
- 名称:
http-basic-check-www
- 协议:
HTTP
- 端口:
80
- 名称:
- 点击保存并继续。
- 点击创建。
为 video
实例配置后端和运行状况检查
- 重复上述步骤,但将第二个后端服务命名为
video-backend-service
,并为其分配ig-video-us
和ig-video-eu
实例组。 - 按照相同的步骤创建运行状况检查,但将运行状况检查命名为
http-basic-check-video
。运行状况检查名称不得重复。
配置主机和路径规则
主机和路径规则用于配置负载平衡器的网址映射资源。
- 在屏幕左侧列中,点击主机和路径规则。
- 第一行的右侧列中有
web-backend-service
,并且该行已填充主机和路径的默认规则Any unmatched (default)
。 - 确保右侧列中有第二行且该行带有
video-backend-service
。如果该行不存在,请点击添加主机和路径规则,然后从右侧列的下拉菜单中选择video-backend-service
。按照如下所示填充其他列:- 将主机设置为
*
。 - 在路径字段中:
- 输入
/video
,然后按 Tab 键。 - 输入
/video/*
,然后按 Tab 键。
- 输入
- 将主机设置为
配置前端
前端配置部分用于为负载平衡器配置若干资源,包括转发规则和 SSL 证书。此外,它还可以用于选择在客户端和负载平衡器之间使用的协议。
在此示例中,您将在客户端和负载平衡器之间使用 HTTPS,因此您需要一个或多个 SSL 证书资源来配置代理。 请参阅 SSL 证书,了解如何创建 SSL 证书资源。我们建议您使用 Google 管理的证书。
- 在新建 HTTP(S) 负载平衡器页面的左侧面板中,点击前端配置。
- 在名称字段中,输入
https-content-rule
。 - 在协议字段中,选择
HTTPS
。 - 不关闭窗口继续操作。
配置 IPv4 转发规则
- 将 IP 版本设置为
IPv4
。 - 在 IP 地址中,选择您之前创建的
lb-ipv4-1
。 - 确保将端口设置为
443
,以允许 HTTPS 流量。 - 点击证书下拉列表。
- 如果您已经拥有要用作主要 SSL 证书的自行管理的 SSL 证书资源,请从下拉菜单中选择该证书。
- 否则,请选择创建新证书。
- 填写名称
www-ssl-cert
。 - 选择上传我的证书或创建 Google 托管的证书。如需创建 Google 管理的证书,您必须拥具有一个网域。如果您没有网域,可以上传自己的证书以进行测试。
- 如果您选择了上传我的证书,请完成以下步骤。
- 在公钥证书字段中,执行以下操作之一:
- 点击上传按钮,然后选择您的 PEM 格式的证书文件。
- 复制并粘贴 PEM 格式证书的内容。内容必须以
-----BEGIN CERTIFICATE-----
开头,并以-----END CERTIFICATE-----
结尾。
- 对于证书链字段,请执行以下操作之一:
- 点击上传按钮,然后选择 CA 的证书文件。 此文件应包含中间 CA 证书和根 CA 证书。
- 复制并粘贴证书链的内容。链中的每个证书必须采用 PEM 格式,从
-----BEGIN CERTIFICATE-----
开头,并以-----END CERTIFICATE-----
结尾。Google Cloud 不会为您验证证书链 - 您必须自行负责验证。 - 如果您省略证书链,您的证书应由广受信任的 CA 签名,客户端将自动信任由此类 CA 签名的证书。
- 对于私钥证书字段,请执行以下操作之一:
- 点击上传按钮,然后选择您的私钥。您的私钥必须采用 PEM 格式,且不受密码保护。
- 复制并粘贴 PEM 格式的私钥内容。RSA 私钥必须以
-----BEGIN RSA PRIVATE KEY-----
开头,并以-----END RSA PRIVATE KEY-----
结尾。ECDSA 私钥必须以-----BEGIN EC PRIVATE KEY-----
开头,并以-----END EC PRIVATE KEY-----
结尾。
- 点击创建。
- 在公钥证书字段中,执行以下操作之一:
- 如果您选择了创建 Google 托管的证书,请输入网域。
- 要添加除了主要 SSL 证书资源之外的其他证书资源,请执行以下操作:
- 点击添加证书。
- 从证书列表中选择一个证书,或点击创建新证书并按照上述说明操作。
- 点击完成。
- 不关闭窗口继续操作。
配置 IPv6 转发规则
- 点击添加前端 IP 和端口。
- 输入
https-content-ipv6-rule
作为名称。 - 如果要在客户端和负载平衡器之间使用 HTTPS,请在协议字段中选择
HTTPS
。如果要在客户端和负载平衡器之间使用 HTTP,请选择HTTP
。 - 将 IP 版本设置为
IPv6
。 - 在 IP 中,选择您之前创建的
lb-ipv6-1
。 - 必须使用默认端口
443
。 - 如果您已经拥有要使用的 SSL 证书资源,请从证书下拉菜单中选择该证书。如果没有,请选择创建新证书。
- 填写名称
www-ssl-cert
。 - 在相应的字段中上传您的公钥证书(.crt 文件)、证书链(.csr 文件)、私钥(.key 文件)。
- 点击创建。
- 填写名称
- 如需添加除了主要 SSL 证书资源之外的其他证书资源,请执行以下操作:
- 点击添加证书。
- 从证书列表中选择一个证书,或点击创建新证书并按照上述说明操作。
- 点击完成。
审核并最终完成
- 在新建 HTTP(S) 负载平衡器页面的左侧面板中,点击检查并最终确定。
- 比较您的设置与您打算创建的内容。
- 如果看起来都正确,请点击创建以创建您的外部 HTTP(S) 负载平衡器。
gcloud
对于每个实例组,定义一个 HTTP 服务并将端口名称映射到相关端口上。配置完成后,负载平衡服务会将流量转发到已命名的端口。
gcloud compute instance-groups unmanaged set-named-ports ig-video-us \ --named-ports http:80 \ --zone us-central1-b
gcloud compute instance-groups unmanaged set-named-ports ig-www-us \ --named-ports http:80 \ --zone us-central1-b
gcloud compute instance-groups unmanaged set-named-ports ig-video-eu \ --named-ports http:80 \ --zone europe-west1-b
gcloud compute instance-groups unmanaged set-named-ports ig-www-eu \ --named-ports http:80 \ --zone europe-west1-b
创建运行状况检查。 如果您在负载平衡器和后端之间使用 HTTP,请使用
gcloud
命令来处理 HTTP。gcloud compute health-checks create http http-basic-check \ --port 80
为每个内容提供方创建一个后端服务。将
--protocol
字段设置为HTTP
,因为我们使用 HTTP 来转到实例。对于运行状况检查,请使用我们前面创建的http-basic-check
运行状况检查。gcloud compute backend-services create video-backend-service \ --protocol HTTP \ --health-checks http-basic-check \ --global
gcloud compute backend-services create web-backend-service \ --protocol HTTP \ --health-checks http-basic-check \ --global
将您的实例组作为后端添加到后端服务。后端定义其包含的实例组的容量(最大后端利用率或每秒最多查询次数)。在此示例中,请将
balancing-mode
设置为UTILIZATION
,将max-utilization
设置为0.8
,将capacity-scaler
设置为1
。如果您希望排空后端服务,请将capacity-scaler
设置为0
。添加
ig-video-us
实例组:gcloud compute backend-services add-backend video-backend-service \ --balancing-mode=UTILIZATION \ --max-utilization=0.8 \ --capacity-scaler=1 \ --instance-group=ig-video-us \ --instance-group-zone=us-central1-b \ --global
添加
ig-video-eu
实例组:gcloud compute backend-services add-backend video-backend-service \ --balancing-mode=UTILIZATION \ --max-utilization=0.8 \ --capacity-scaler=1 \ --instance-group=ig-video-eu \ --instance-group-zone=europe-west1-b \ --global
添加
ig-www-us
实例组:gcloud compute backend-services add-backend web-backend-service \ --balancing-mode=UTILIZATION \ --max-utilization=0.8 \ --capacity-scaler=1 \ --instance-group=ig-www-us \ --instance-group-zone=us-central1-b \ --global
添加
ig-www-eu
实例组:gcloud compute backend-services add-backend web-backend-service \ --balancing-mode=UTILIZATION \ --max-utilization=0.8 \ --capacity-scaler=1 \ --instance-group=ig-www-eu \ --instance-group-zone=europe-west1-b \ --global
创建网址映射将传入请求路由到相应的后端服务。在此示例中,通过
--path-rules
标志定义的请求路径映射会根据发送到您网站的每个请求中的网址路径拆分流量。与--path-rules
列表中条目不匹配的流量将发送到--default-service flag
中的条目。创建网址映射:
gcloud compute url-maps create web-map \ --default-service web-backend-service
将路径匹配程序添加到您的网址映射并定义您的请求路径映射:
gcloud compute url-maps add-path-matcher web-map \ --default-service web-backend-service \ --path-matcher-name pathmap \ --path-rules="/video=video-backend-service,/video/*=video-backend-service"
创建要在 HTTPS 代理中使用的 SSL 证书资源。如需创建 Google 管理的证书,您必须拥具有一个网域。如果您没有网域,则可以使用自签名 SSL 证书进行测试。如需了解详情,请参阅 SSL 证书类型。
如果您要使用多个 SSL 证书,则必须为每个证书创建一个 SSL 证书资源。
如需创建自行管理的 SSL 证书资源,请运行以下命令:
gcloud compute ssl-certificates create www-ssl-cert \ --certificate [CRT_FILE_PATH] \ --private-key [KEY_FILE_PATH]
如需创建 Google 管理的 SSL 证书资源,请运行以下命令:
gcloud beta compute ssl-certificates create www-ssl-cert \ --domains [DOMAIN]
创建一个目标 HTTPS 代理将请求路由到您的网址映射。该代理属于负载平衡器,保存用于 HTTPS 负载平衡的 SSL 证书,因此您还需要在此步骤中加载证书。
gcloud compute target-https-proxies create https-lb-proxy \ --url-map web-map --ssl-certificates www-ssl-cert
创建两个全局转发规则(分别用于您创建的两个 IP 地址),将传入请求路由到代理。
gcloud compute forwarding-rules create https-content-rule \ --address=lb-ipv4-1\ --global \ --target-https-proxy=https-lb-proxy \ --ports=443
gcloud compute forwarding-rules create https-content-ipv6-rule \ --address=lb-ipv6-1 \ --global \ --target-https-proxy=https-lb-proxy \ --ports=443
创建全局转发规则后,您的配置可能需要花费几分钟时间才能传播到全球范围。
将流量发送到您的实例
现在您已经配置了负载平衡服务,您可以开始将流量发送到转发规则并会发现流量进入不同的实例。
控制台和网络浏览器
- 转到 Google Cloud Console 中的“负载平衡”页面。
转到“负载平衡”页面 - 点击
web-map
,展开您刚创建的负载平衡器。 在后端部分中,确认实例运行状况良好。运行状况良好列应会填充相应信息,指示每个实例组(共 4 个)中的两个实例运行状况均良好。否则,请先尝试重新加载页面。Cloud Console 可能需要一些时间才能指示实例运行状况良好。如果后端在几分钟后看起来运行状况不佳,请检查防火墙配置以及分配给后端实例的网络标记集。
记录负载平衡器的 IPv4 和 IPv6 地址:
- 转到 Google Cloud Console 中的“外部 IP 地址”页面。
转到“外部 IP 地址”页面 - 在名称下,找到名为
lb-ipv4-1
和lb-ipv6-1
的地址,然后记录外部地址列中的关联值。
- 转到 Google Cloud Console 中的“外部 IP 地址”页面。
如果您使用的是 Google 管理的证书,请执行下列操作:
创建以下 DNS 记录:
- CAA 记录。如需了解详情,请参阅指定允许为 Google 管理的证书签名的 CA。
- A 记录。如需了解详情,请参阅创建更新 DNS A 记录以指向负载平衡器的 IP 地址。
- AAAA 记录。其类似于 A 记录,但用于负载平衡器的 IPv6 地址。
请确认证书资源的状态为“有效”。如需了解详情,请参阅 Google 管理的 SSL 证书资源状态。
转到以下其中一项,以使用网络浏览器测试负载平衡器:
https://<var>ip-address</var>
,其中 ip-address 是负载平衡器的 IPv4 地址。如果浏览器显示证书警告,您必须明确指示浏览器信任该证书。出现此警告的原因是证书通常配置了网域(而非 IP 地址)。https://<var>fqdn</var>
,其中 fqdn 是您为其配置了 DNS 以指向负载平衡器 IP 地址的完全限定域名 (FQDN)。如果您使用的是自行管理的自签名 SSL 证书或自行管理且由自定义证书授权机构 (CA) 签名的 SSL 证书,则浏览器会显示证书警告,除非您明确将其配置为信任该证书或其 CA。如需详细了解自行管理的证书,请参阅创建私钥和证书。
您的浏览器应该会打开一个页面,其中会显示提供该页面的实例的名称及其地区(例如,
Page on www-us-02 in us-central1-b
)。在浏览器中,转到以下任一位置:
https://<var>ip-address</var>/video
,其中 ip-address 是负载平衡器的 IPv4 地址。https://<var>fqdn</var>/video
,其中 fqdn 是您为其配置了 DNS 以指向负载平衡器 IP 地址的 FQDN。
您的浏览器应会呈现一个页面,其中的内容显示提供该页面的视频实例的名称及其地区(例如
Page on video-us-02 in us-central1-b
)。
gcloud 和使用 curl
记录负载平衡器的 IPv4 和 IPv6 地址:
gcloud compute addresses describe lb-ipv4-1 \ --format="get(address)" \ --global
gcloud compute addresses describe lb-ipv4-1 \ --format="get(address)" \ --global
如果您使用的是 Google 管理的证书,请执行下列操作:
创建以下 DNS 记录:
- CAA 记录。如需了解详情,请参阅指定允许为 Google 管理的证书签名的 CA。
- A 记录。如需了解详情,请参阅创建更新 DNS A 记录以指向负载平衡器的 IP 地址。
- AAAA 记录。其类似于 A 记录,但用于负载平衡器的 IPv6 地址。
请确认证书资源的状态为“有效”。如需了解详情,请参阅 Google 管理的 SSL 证书资源状态。
gcloud beta compute ssl-certificates list
使用
curl
命令测试以下网址的响应。请将 ip-address 替换为负载平衡器的 IPv4 地址。curl -k https://ip-address
curl -k https://ip-address/video/
使用
curl
命令测试以下网址的响应。请将 ip-address 替换为负载平衡器的 IPv6 地址。对于 IPv6,您必须使用方括号 ([]
) 将地址括起来并使用-g
标志停用全球传播功能(例如curl -g -6 "https://[2001:DB8::]/"
)curl -k -g -6 https://[ip-address]
curl -k -g -6 https://[ip-address]/video/
测试跨区域功能
要模拟位于其他地理位置的用户,您可以连接到其他区域中的某个虚拟机实例,然后从该实例运行 curl
命令以查看请求转到该区域中最接近它的一个实例。
如果您连接到 www-us-01
,则运行 curl
命令会显示请求将转到 us-central1
中的实例。输出将如下所示:Page on www-us-02 in us-central1-b
。
如果您连接到 www-eu-01
,则运行 curl
命令会显示请求将转到 europe-west1
中的实例。输出将如下所示:Page on www-eu-02 in europe-west1-b
您可以从位于世界各地的客户端系统执行测试。如果某个区域中的后端运行状况不佳或达到容量上限,则 HTTPS 负载平衡器会自动将流量发送到最接近的下一个区域。
其他配置选项
本部分对配置示例进行了详细讲解,提供了一些其他替代配置选项。所有任务均为可选任务。您可以按任意顺序执行这些任务。
启用会话亲和性
这些过程演示了如何为每个后端服务配置不同类型的会话亲和性:
web-backend-service
的客户端 IP 地址会话亲和性video-backend-service
的 HTTP Cookie 会话亲和性
启用客户端 IP 亲和性后,负载平衡器会根据从客户端的 IP 地址创建的哈希,将特定客户端的请求定向到同一后端虚拟机。
启用生成的 Cookie 亲和性时,负载平衡器会针对第一个请求发出一个 Cookie。对于具有相同 Cookie 的每个后续请求,负载平衡器会将请求定向到同一个后端虚拟机或端点。对于外部 HTTP(S) 负载平衡器,Cookie 名为 GCLB
。
控制台
要为 web-backend-service
启用客户端 IP 会话亲和性,请执行以下操作:
- 转到 Google Cloud Console 中的“负载平衡”页面。
转到“负载平衡”页面 - 点击后端。
- 点击 web-backend-service(您为此示例创建的其中一个后端服务的名称),然后点击修改。
- 在后端服务详情页面上,点击高级配置。
- 在会话亲和性下,从菜单中选择客户端 IP。
- 点击保存。
要为 video-backend-service
启用生成的 Cookie 会话亲和性,请执行以下操作:
- 转到 Google Cloud Console 中的“负载平衡”页面。
转到“负载平衡”页面 - 点击后端。
- 点击 video-backend-service(您为此示例创建的其中一个后端服务的名称),然后点击修改。
- 在后端服务详情页面上,点击高级配置。
- 在会话亲和性下,从菜单中选择生成的 Cookie。
- 点击更新。
gcloud
使用以下 gcloud 命令更新 web-backend-service
后端服务,指定客户端 IP 会话亲和性:
gcloud compute backend-services update web-backend-service \ --session-affinity=CLIENT_IP \ --global
使用以下 gcloud 命令更新 video-backend-service
后端服务,指定生成的 Cookie 会话亲和性:
gcloud compute backend-services update video-backend-service \ --session-affinity=GENERATED_COOKIE \ --global
API
要设置客户端 IP 会话亲和性,请向 backendServices/patch
方法发出 PATCH
请求。
PATCH https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/web-backend-service
{
"sessionAffinity": "CLIENT_IP"
}
要设置生成的 Cookie 会话亲和性,请向 backendServices/patch
方法发出 PATCH
请求。
PATCH https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/video-backend-service
{
"sessionAffinity": "GENERATED_COOKIE"
}
从后端虚拟机中移除外部 IP 地址
Google Cloud HTTP(S) 负载平衡使用后端的内部 IP 地址和特殊的负载平衡器路由与后端进行通信。后端实例不需要使用外部 IP 地址与负载平衡器进行通信。您可以通过从后端实例中移除外部 IP 地址来提高安全性。
要从后端实例移除外部 IP 地址,请按照这些指示操作。
如果您需要使用 SSH 连接到没有外部 IP 地址的后端实例,请参阅连接到没有外部 IP 地址的实例。
清理
完成本 HTTP(S) 负载平衡教程后,您可以删除自己创建的 Cloud Load Balancing 资源,这样您以后就不必继续为这些资源付费了。如果这些资源是在自己的项目中创建的,则您可以删除整个项目。否则,您可以逐个删除这些资源。
删除项目
控制台
- 转到 Google Cloud Console 中的“项目”页面。
转到“项目”页面 - 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中输入 project-id,然后点击关闭以删除项目。
gcloud
运行以下命令,将 project_id 替换为您的项目 ID:
gcloud projects delete project-id
逐个删除资源
控制台
删除负载平衡器
- 转到 Google Cloud Console 中的“负载平衡”页面。
转到“负载平衡”页面 - 选中
web-map
旁边的复选框。 - 点击页面顶部的删除按钮。
- 选中其他所有资源(包括后端服务、运行状况检查和 SSL 证书)旁边的复选框。
- 点击删除负载平衡器和所选的资源。
删除实例组
- 转到 Google Cloud Console 中的“实例组”页面。
转到“实例组”页面 - 选中顶部名称旁边的复选框,以选择所有实例组。
- 点击删除。
- 在确认窗口中,点击删除。
释放外部 IP 地址
- 转到 Google Cloud Console 中的“外部 IP 地址”页面。
转到“外部 IP 地址”页面 - 选中
lb-ipv4-1
和lb-ipv6-1
旁边的复选框。 - 点击释放静态地址。
- 在确认窗口中,点击删除。
删除防火墙规则
- 转到 Google Cloud Console 中的“防火墙”页面。
转到“防火墙”页面 - 选中
fw-allow-health-check-and-proxy
和fw-allow-ssh
旁边的复选框。 - 点击删除。
- 在确认窗口中,点击删除。
删除虚拟机实例
- 转到 Google Cloud Console 中的“虚拟机实例”页面。
转到“虚拟机实例”页面 - 选中顶部名称旁边的复选框,以选择所有实例。
- 点击删除。
- 在确认窗口中,点击删除。
删除 VPC 网络
- 转到 Google Cloud Console 中的“VPC 网络”页面。
转到“VPC 网络”页面 - 点击
lb-network
。 - 在网络详细信息页面上,点击删除 VPC 网络。
- 在确认窗口中,点击删除。
gcloud
删除负载平衡器
如需删除负载平衡器,您需要删除它的每个组件。
删除转发规则:
gcloud compute forwarding-rules delete https-content-rule \ --global
gcloud compute forwarding-rules delete https-content-ipv6-rule \ --global
删除全局外部 IP 地址:
gcloud compute addresses delete lb-ipv4-1 \ --global
gcloud compute addresses delete lb-ipv6-1 \ --global
删除目标代理:
gcloud compute target-https-proxies delete https-lb-proxy
删除 SSL 证书:
gcloud compute ssl-certificates delete www-ssl-cert
删除网址映射:
gcloud compute url-maps delete web-map
删除后端服务:
gcloud compute backend-services delete web-backend-service \ --global
gcloud compute backend-services delete video-backend-service \ --global
删除运行状况检查:
gcloud compute health-checks delete http-basic-check
您已删除所有负载平衡器资源。
删除实例组
使用以下名称和地区组合重复运行以下命令,以删除四个非托管式实例组。请相应地替换 instance-group-name 和 zone:
- 名称:
ig-www-us
,地区:us-central1-b
- 名称:
ig-video-us
,地区:us-central1-b
- 名称:
ig-www-eu
,地区:europe-west1-b
- 名称:
ig-video-eu
,地区:europe-west1-b
gcloud compute instance-groups unmanaged delete instance-group-name \ --zone=zone
删除虚拟机实例
使用以下名称和地区组合重复运行以下命令,以删除八个虚拟机。请相应地替换 vm-name 和 zone。
- 名称:
www-us-01
,地区:us-central1-b
- 名称:
www-us-02
,地区:us-central1-b
- 名称:
video-us-01
,地区:us-central1-b
- 名称:
video-us-02
,地区:us-central1-b
- 名称:
www-eu-01
,地区:europe-west1-b
- 名称:
www-eu-02
,地区:europe-west1-b
- 名称:
video-eu-01
,地区:europe-west1-b
- 名称:
video-eu-02
,地区:europe-west1-b
gcloud compute instances delete vm-name \ --zone=zone
删除防火墙规则
删除两条防火墙规则:
gcloud compute firewall-rules delete fw-allow-health-check-and-proxy
gcloud compute firewall-rules delete fw-allow-ssh
删除 VPC 网络
删除
us-subnet
:gcloud compute networks subnets delete us-subnet \ --region=us-central1
删除
eu-subnet
:gcloud compute networks subnets delete eu-subnet \ --region=europe-west1
删除 VPC 网络:
gcloud compute networks delete lb-network
您已删除在此项目中设置的所有资源。