本文档展示了在共享 VPC 环境中设置内部应用负载均衡器的两个示例配置:
- 第一个示例是在一个服务项目中创建所有负载均衡器组件和后端。
- 第二个示例是在一个服务项目中创建负载均衡器的前端组件和网址映射,而在其他服务项目中创建负载均衡器的后端服务和后端。这种类型的部署(其中网址映射引用其他项目中的后端服务)称为跨项目服务引用。
这两个示例都需要相同的前期配置来授予权限并设置共享 VPC,然后才能开始创建负载均衡器。
这些不是内部应用负载均衡器唯一支持的共享 VPC 配置。如需了解其他有效的共享 VPC 架构,请参阅共享 VPC 架构。
如果您不想使用共享 VPC 网络,请参阅设置内部应用负载均衡器。
须知事项
- 阅读共享 VPC 概览。
- 阅读内部应用负载均衡器概览,包括共享 VPC 架构部分。
所需权限
在共享 VPC 网络上设置负载均衡器需要管理员进行一些初始设置和预配。完成初始设置后,服务项目所有者可执行以下操作之一:
- 在服务项目中部署负载均衡器的所有组件及其后端。
- 在可由其他服务或宿主项目中的网址映射引用的服务项目中部署负载均衡器的后端组件(后端服务和后端)。
本部分汇总了按照本指南在共享 VPC 网络上设置负载均衡器所需的权限。
设置共享 VPC
以下任务需要以下角色:
- 执行一次性管理任务,例如设置共享 VPC 和启用宿主项目。
- 执行管理任务:每次您想要添加新的服务项目时都必须重复执行这些管理任务。这包括关联服务项目、预配和配置网络资源以及向服务项目管理员授予访问权限。
这些任务必须在共享 VPC 宿主项目中执行。我们建议 Shared VPC Admin 也成为共享 VPC 宿主项目的所有者。这将自动授予 Network Admin 和 Security Admin 角色。
任务 | 所需角色 |
---|---|
设置共享 VPC,启用宿主项目并向服务项目管理员授予访问权限 | Shared VPC Admin |
在共享 VPC 宿主项目中创建子网并向服务项目管理员授予访问权限 | Network Admin |
添加和移除防火墙规则 | Security Admin |
预配子网后,宿主项目所有者必须将宿主项目中的 Network User 角色授予需要使用这些资源的任何人(通常是服务项目管理员、开发者或服务账号)。
任务 | 所需角色 |
---|---|
使用属于宿主项目的 VPC 网络和子网 | Network User |
可以在项目级层或针对单个子网授予此角色。我们建议您针对单个子网授予此角色。如果针对项目授予此角色,则将向您授予权限来访问宿主项目的 VPC 网络中的所有当前子网和未来子网。
部署负载均衡器和后端
服务项目管理员需要服务项目中的以下角色才能创建负载均衡资源和后端。这些权限会自动授予给服务项目所有者或编辑者。
任务 | 所需角色 |
---|---|
创建负载均衡器组件 | Network Admin |
创建实例 | Instance Admin |
创建和修改 SSL 证书 | Security Admin |
引用跨项目后端服务
如果您的负载均衡器需要引用其他服务项目中的后端服务(也称为跨项目服务引用),则负载均衡器管理员将需要在其中创建后端服务的服务项目中的以下角色。
任务 | 所需角色 |
---|---|
使用其他项目中的服务的权限 | Load Balancer Services User |
可以在项目级层或针对个别后端服务授予此角色。如需了解如何授予此角色,请参阅本页面上的跨项目服务引用示例。
如需详细了解 IAM,请参阅以下指南:
前提条件
在此部分,您需要执行以下步骤:
您无需在每次创建新负载均衡器时都执行本部分中的步骤。但是,在继续创建负载均衡器之前,您必须确保可以访问此处所述的资源。
在宿主项目中配置网络和子网
您需要一个包含两个子网的共享 VPC 网络:一个用于负载均衡器的前端和后端,另一个用于负载均衡器的代理。本示例使用以下网络、区域和子网:
网络。网络名为
lb-network
。用于负载均衡器的前端和后端的子网。
us-west1
区域中名为lb-frontend-and-backend-subnet
的子网使用10.1.2.0/24
作为其主要 IP 地址范围。代理子网。
us-west1
区域中名为proxy-only-subnet
的子网使用10.129.0.0/23
作为其主要 IP 地址范围。
为负载均衡器的前端和后端配置子网
您无需在每次创建新负载均衡器时都执行此步骤。您只需确保服务项目可以访问共享 VPC 网络中的子网(以及代理专用子网)。本部分中的所有步骤都必须在宿主项目中执行。
控制台
- 在 Google Cloud 控制台中,转到 VPC 网络页面。
- 点击创建 VPC 网络。
- 对于名称,输入
lb-network
。 在子网部分中执行以下操作:
- 将子网创建模式设置为自定义。
在新子网部分中,输入以下信息:
- 名称:
lb-frontend-and-backend-subnet
区域:
us-west1
IP 地址范围:
10.1.2.0/24
- 名称:
点击完成。
点击创建。
gcloud
使用
gcloud compute networks create
命令创建 VPC 网络:gcloud compute networks create lb-network --subnet-mode=custom
在
us-west1
地区的lb-network
网络中创建子网:gcloud compute networks subnets create lb-frontend-and-backend-subnet \ --network=lb-network \ --range=10.1.2.0/24 \ --region=us-west1
Terraform
创建 VPC 网络:
在
us-west1
区域中创建子网:
配置代理专用子网
代理专用子网用于 lb-network
VPC 网络中 us-west1
区域内所有基于 Envoy 的区域负载均衡器。在每个网络中,每个区域只能有一个代理专用子网处于活跃状态。
如果此网络中的 us-west1
区域已预留代理专用子网,请勿执行此步骤。
本部分中的所有步骤都必须在宿主项目中执行。
控制台
- 在 Google Cloud 控制台 中,转到 VPC 网络页面。
- 点击共享 VPC 网络的名称:
lb-network
。 - 点击添加子网。
- 对于名称,输入
proxy-only-subnet
。 - 对于区域,请选择
us-west1
。 - 将用途设置为区域级代管式代理。
- 对于 IP 地址范围,输入
10.129.0.0/23
。 - 点击添加。
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
Terraform
创建代理专用子网:
向服务项目管理员授予对后端子网的访问权限
服务项目管理员需要lb-frontend-and-backend-subnet
子网的访问权限,以便他们可以预配负载均衡器的后端。
共享 VPC 管理员必须向服务项目管理员(或者部署使用该子网的资源和后端的开发者)授予后端子网的访问权限。如需查看相关说明,请参阅有权访问部分子网的服务项目管理员。
在宿主项目中配置防火墙规则
此示例使用以下防火墙规则:fw-allow-health-check
。适用于负载均衡实例的入站规则,该规则允许来自 Google Cloud 健康检查系统(130.211.0.0/22
和35.191.0.0/16
)的所有 TCP 流量。此示例使用目标标记load-balanced-backend
来标识它应该应用到的实例。
fw-allow-proxies
。适用于负载均衡实例的入站流量规则,该规则允许从负载均衡器的代管式代理发送到端口80
、443
和8080
的 TCP 流量。此示例使用目标标记load-balanced-backend
来标识它应该应用到的实例。
fw-allow-ssh
。适用于负载均衡实例的入站流量规则,该规则允许从任何地址到 TCP 端口22
的传入 SSH 连接。您可以为此规则选择限制性更高的来源 IP 范围。例如,您可以仅指定要从中启动 SSH 会话的系统的 IP 范围。此示例使用目标标记allow-ssh
来标识该防火墙规则应该应用于的虚拟机 (VM)。
本部分中的所有步骤都必须在宿主项目中执行。
控制台
在 Google Cloud 控制台中,转到防火墙页面。
- 点击创建防火墙规则以创建允许 Google Cloud 健康检查的规则:
- 名称:
fw-allow-health-check
- 网络:
lb-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
访问这些虚拟机。 - 点击创建。
- 点击创建防火墙规则以创建允许 Google Cloud 健康检查的规则:
- 名称:
fw-allow-proxies
- 网络:
lb-network
- 流量方向:入站
- 匹配时执行的操作:允许
- 目标:指定的目标标记
- 目标标记:
load-balanced-backend
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:
10.129.0.0/23
- 协议和端口:
- 选择指定的协议和端口。
- 勾选 TCP,然后输入
80, 443, 8080
作为端口号。
- 点击创建。
- 点击创建防火墙规则以创建允许 Google Cloud 健康检查的规则:
- 名称:
fw-allow-ssh
- 网络:
lb-network
- 流量方向:入站
- 匹配时执行的操作:允许
- 目标:指定的目标标记
- 目标标记:
allow-ssh
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:
0.0.0.0/0
- 协议和端口:
- 选择指定的协议和端口。
- 勾选 TCP,然后输入
22
作为端口号。
- 点击创建。
gcloud
创建
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
创建
fw-allow-proxies
防火墙规则以允许来自 Envoy 代理专用子网的流量到达您的后端。gcloud compute firewall-rules create fw-allow-proxies \ --network=lb-network \ --action=allow \ --direction=ingress \ --source-ranges=10.129.0.0/23 \ --target-tags=load-balanced-backend \ --rules=tcp:80,tcp:443,tcp:8080
创建
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
Terraform
创建防火墙规则以允许 Google Cloud 健康检查。
创建防火墙规则以允许来自 Envoy 代理专用子网的流量到达您的后端。
创建防火墙规则,允许通过 SSH 连接到网络标记为
allow-ssh
的虚拟机。
在宿主项目中设置共享 VPC
此步骤涉及启用共享 VPC 宿主项目、共享宿主项目的子网,并将服务项目关联到宿主项目,以便服务项目可以使用共享 VPC 网络。如需在宿主项目中设置共享 VPC,请参阅以下页面:
这些说明的其余部分假定您已设置共享 VPC。这包括为您的组织设置 IAM 政策,以及指定宿主项目和服务项目。
在设置共享 VPC 并启用宿主项目和服务项目之前,请勿继续操作。
在服务项目中配置负载均衡器
此示例会创建一个内部应用负载均衡器,其中所有负载均衡组件(转发规则、目标代理、网址映射和后端服务)和后端都在服务项目中创建。
内部应用负载均衡器的网络资源(例如代理专用子网和后端实例的子网)是在宿主项目中创建的。后端实例的防火墙规则也是在宿主项目中创建的。
本部分介绍如何设置负载均衡器和后端。这些步骤应由服务项目管理员(或在服务项目中操作的开发者)执行,无需宿主项目管理员参与。本部分中的步骤与设置内部应用负载均衡器的标准步骤大致类似。
此页面上的示例明确设置内部应用负载均衡器转发规则的预留内部 IP 地址,而不是允许分配临时内部 IP 地址。我们建议的最佳实践是,为转发规则预留 IP 地址。
创建代管式实例组后端
本部分介绍如何创建模板和代管式实例组。这个代管式实例组提供运行示例内部应用负载均衡器的后端服务器的虚拟机实例。来自客户端的流量在经过负载均衡处理后传送到这些后端服务器。出于演示目的,后端会传送其自己的主机名。
控制台
创建实例模板。在 Google Cloud 控制台中,转到实例模板页面。
- 点击创建实例模板。
- 对于名称,输入
l7-ilb-backend-template
。 - 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 10 (buster)。本文中的说明使用仅 Debian 支持的命令,例如
apt-get
。如果您需要更改启动磁盘,请点击更改。- 在操作系统部分,选择 Debian。
- 在版本部分,选择一个可用的 Debian 映像,例如 Debian GNU/Linux 10 (buster)。
- 点击选择。
- 点击高级选项,然后点击网络。
- 输入以下网络标记:
allow-ssh
,load-balanced-backend
。 - 在网络接口部分,选择与我共享的网络(通过宿主项目:HOST_PROJECT_ID)。
- 从
lb-network
网络中选择lb-frontend-and-backend-subnet
子网。 - 点击管理。对于管理,将以下脚本插入到启动脚本字段中。
#! /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 - 点击创建。
创建代管式实例组。在 Google Cloud 控制台中,转到实例组页面。
- 点击创建实例组。
- 选择新的代管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 MIG。
- 对于名称,输入
l7-ilb-backend-example
。 - 对于位置,选择单个可用区。
- 对于区域,请选择
us-west1
。 - 对于可用区,请选择
us-west1-a
。 - 对于实例模板,请选择
l7-ilb-backend-template
。 指定要在组中创建的实例数。
对于此示例,在自动扩缩部分指定以下选项:
- 对于自动扩缩模式,请选择
Off:do not autoscale
。 - 对于实例数上限,请输入
2
。
(可选)在界面的自动扩缩部分中,您可以将实例组配置为根据实例 CPU 使用情况自动添加或移除实例。
- 对于自动扩缩模式,请选择
点击创建。
gcloud
本指南中的 gcloud
说明假定您使用的是 Cloud Shell 或安装了 bash 的其他环境。
使用
gcloud compute instance-templates create
命令创建含有 HTTP 服务器的虚拟机实例模板。gcloud compute instance-templates create l7-ilb-backend-template \ --region=us-west1 \ --network=projects/HOST_PROJECT_ID/global/networks/lb-network \ --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-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' \ --project=SERVICE_PROJECT_ID
使用
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 \ --project=SERVICE_PROJECT_ID
Terraform
创建虚拟机实例模板。
创建托管式实例组。
对于 HTTP:
对于 HTTPS:
配置负载均衡器
本部分介绍如何创建内部应用负载均衡器资源:
- HTTP 健康检查
- 将代管实例组用作后端的后端服务
- 网址映射
- SSL 证书(仅 HTTPS 必须提供)
- 目标代理
- 转发规则
代理可用性
根据使用同一共享 VPC 网络的服务项目数量,较之每个 Google Cloud 项目托管自己的网络所在的网络部署模型,您可能会更快地达到配额或限制。
例如,有时 Google Cloud 区域没有足够的代理容量来容纳新的内部应用负载均衡器。如果发生这种情况,Google Cloud 控制台会在您创建负载均衡器时提供一条代理可用性警告消息。如需解决此问题,您可以执行以下任一操作:
- 等待容量问题的解决。
请联系您的 Google Cloud 销售团队来提高这些限额。
控制台
将上下文切换到服务项目
- 在 Google Cloud 控制台中,转到信息中心页面。
- 点击页面顶部的请选择:列表。在出现的请选择:窗口中,选择您想要在其中创建负载均衡器的服务项目。
开始配置
在 Google Cloud 控制台中,转到负载均衡页面。
- 点击创建负载均衡器。
- 在负载均衡器的类型字段中,选择应用负载均衡器 (HTTP/HTTPS),然后点击下一步。
- 在公共或内部字段中,选择内部,然后点击下一步。
- 在跨区域或单区域部署字段中,选择最适合区域级工作负载,然后点击下一步。
- 点击配置。
基本配置
- 对于负载均衡器的名称,请输入
l7-ilb-shared-vpc
。 - 对于区域,请选择
us-west1
。 对于网络,选择 lb-network(来自项目:HOST_PROJECT_ID)。
如果您看到共享 VPC 网络中需要代理专用子网警告,请确认宿主项目管理员已在
lb-network
共享 VPC 网络中的us-west1
区域创建proxy-only-subnet
。即使您无权查看此页面上的代理专用子网,负载均衡器创建也会成功。不关闭窗口继续操作。
配置后端
- 点击后端配置。
- 在创建或选择后端服务菜单中,选择创建后端服务。
- 将后端服务的名称设置为
l7-ilb-backend-service
。 - 将后端类型设置为实例组。
- 在新后端部分:
- 将实例组设置为
l7-ilb-backend-example
。 - 将端口号设置为
80
。 - 将均衡模式设置为利用率。
- 点击完成。
- 将实例组设置为
- 在健康检查部分,使用以下参数选择创建健康检查:
- 名称:
l7-ilb-basic-check
- 协议:
HTTP
- 端口:
80
- 名称:
- 点击保存并继续。
- 点击创建。
配置路由规则
- 点击路由规则。确保
l7-ilb-backend-service
是任何不匹配的主机和任何不匹配的路径的唯一后端服务。
如需了解流量管理,请参阅设置流量管理。
配置前端
对于 HTTP:
- 点击前端配置。
- 将名称设置为
l7-ilb-forwarding-rule
。 - 将协议设置为
HTTP
。 - 将子网设置为
lb-frontend-and-backend-subnet
。 请勿为前端选择代理专用子网,即使它是列表中的选项也是如此。 - 将端口设置为
80
。 - 点击 IP 地址菜单,然后点击创建 IP 地址。
- 在预留静态内部 IP 地址面板中,提供以下详细信息:
- 对于名称,请输入
ip-address-shared-vpc
。 - 对于静态 IP 地址,点击让我选择。对于自定义 IP 地址,输入
10.1.2.99
。 - (可选)如果要与不同前端共享此 IP 地址,请将用途设置为共享。
- 对于名称,请输入
- 点击完成。
对于 HTTPS:
如果您在客户端和负载均衡器之间使用 HTTPS,则需要一个或多个 SSL 证书资源来配置代理。如需了解如何创建 SSL 证书资源,请参阅 SSL 证书。内部应用负载均衡器目前不支持由 Google 管理的证书。
- 点击前端配置。
- 在名称字段中,输入
l7-ilb-forwarding-rule
。 - 在协议字段中,选择
HTTPS (includes HTTP/2)
。 - 将子网设置为
lb-frontend-and-backend-subnet
。 请勿为前端选择代理专用子网,即使它是列表中的选项也是如此。 - 确保将端口设置为
443
,以允许 HTTPS 流量。 - 点击 IP 地址菜单,然后点击创建 IP 地址。
- 在预留静态内部 IP 地址面板中,提供以下详细信息:
- 对于名称,请输入
ip-address-shared-vpc
。 - 对于静态 IP 地址,点击让我选择。对于自定义 IP 地址,输入
10.1.2.99
。 - (可选)如果要与不同前端共享此 IP 地址,请将用途设置为共享。
- 对于名称,请输入
- 点击证书列表。
- 如果您已经拥有要用作主要 SSL 证书的自行管理的 SSL 证书资源,请从菜单中选择该证书。
- 否则,请选择创建新证书。
- 填写名称
l7-ilb-cert
。 - 在相应字段中上传您的 PEM 格式的文件:
- 公钥证书
- 证书链
- 私钥
- 点击创建。
- 填写名称
- 如需添加除了主要 SSL 证书资源之外的其他证书资源,请执行以下操作:
- 点击添加证书。
- 从证书列表中选择一个证书,或点击创建新证书并按照上述说明操作。
- 点击完成。
检查并最终确定配置
- 点击创建。
gcloud
使用
gcloud compute health-checks create http
命令定义 HTTP 健康检查。gcloud compute health-checks create http l7-ilb-basic-check \ --region=us-west1 \ --use-serving-port \ --project=SERVICE_PROJECT_ID
使用
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 \ --project=SERVICE_PROJECT_ID
使用
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 \ --project=SERVICE_PROJECT_ID
使用
gcloud compute url-maps create
命令创建网址映射。gcloud compute url-maps create l7-ilb-map \ --default-service=l7-ilb-backend-service \ --region=us-west1 \ --project=SERVICE_PROJECT_ID
创建目标代理。
对于 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 \ --project=SERVICE_PROJECT_ID
对于 HTTPS:
如需了解如何创建 SSL 证书资源,请参阅 SSL 证书。内部应用负载均衡器目前不支持由 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 \ --project=SERVICE_PROJECT_ID
创建转发规则。
对于自定义网络,必须在转发规则中引用子网。
对于转发规则的 IP 地址,请使用
lb-frontend-and-backend-subnet
。如果您尝试使用代理专用子网,则无法创建转发规则。对于 HTTP:
使用带有正确标志的
gcloud compute forwarding-rules create
命令。gcloud compute forwarding-rules create l7-ilb-forwarding-rule \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=projects/HOST_PROJECT_ID/global/networks/lb-network \ --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \ --address=IP_ADDRESS_NAME \ --ports=80 \ --region=us-west1 \ --target-http-proxy=l7-ilb-proxy \ --target-http-proxy-region=us-west1 \ --project=SERVICE_PROJECT_ID
对于 HTTPS:
使用带有正确标志的
gcloud compute forwarding-rules create
命令。gcloud compute forwarding-rules create l7-ilb-forwarding-rule \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=projects/HOST_PROJECT_ID/global/networks/lb-network \ --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \ --address=IP_ADDRESS_NAME \ --ports=443 \ --region=us-west1 \ --target-https-proxy=l7-ilb-proxy \ --target-https-proxy-region=us-west1 \ --project=SERVICE_PROJECT_ID
Terraform
定义 HTTP 健康检查。
对于 HTTP:
对于 HTTPS:
定义后端服务。
创建网址映射。
创建目标代理。
对于 HTTP:
对于 HTTPS:创建区域 SSL 证书
如需了解如何创建 SSL 证书资源,请参阅 SSL 证书。内部应用负载均衡器目前不支持由 Google 管理的证书。
使用地区 SSL 证书创建目标代理
创建转发规则。
对于自定义网络,必须在转发规则中引用子网。
对于 HTTP:
对于 HTTPS:
测试负载均衡器
如需测试负载均衡器,请先创建一个示例客户端虚拟机。然后与虚拟机建立 SSH 会话,并将来自此虚拟机的流量发送到负载均衡器。
创建测试虚拟机实例
客户端可位于宿主项目或任何连接的服务项目中。在此示例中,您将通过在服务项目中部署客户端虚拟机来测试负载均衡器是否正常运行。客户端必须使用同一共享 VPC 网络,而且与负载均衡器位于同一个区域。
控制台
在 Google Cloud 控制台中,转到虚拟机实例页面。
点击创建实例。
将名称设置为
client-vm
。将可用区设置为 us-west1-a。
点击高级选项,然后点击网络。
输入以下网络标记:
allow-ssh
,load-balanced-backend
。在网络接口部分,选择与我共享的网络(通过宿主项目:HOST_PROJECT_ID)。
从
lb-network
网络中选择lb-frontend-and-backend-subnet
子网。点击创建。
gcloud
创建测试虚拟机实例。
gcloud compute instances create client-vm \ --image-family=debian-10 \ --image-project=debian-cloud \ --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \ --zone=us-west1-a \ --tags=allow-ssh \ --project=SERVICE_PROJECT_ID
Terraform
创建测试虚拟机实例。
将流量发送到负载均衡器
使用 SSH 连接到您刚刚创建的实例,通过测试确定可以通过内部应用负载均衡器的转发规则 IP 地址访问后端的 HTTP(S) 服务,并且流量正在后端实例之间进行负载均衡。
通过 SSH 连接到客户端实例。
gcloud compute ssh client-vm \ --zone=us-west1-a
验证 IP 地址提供其主机名。将 LB_IP_ADDRESS 替换为负载均衡器的 IP 地址。
curl LB_IP_ADDRESS
对于 HTTPS 测试,请将
curl
替换为以下内容:curl -k -s 'https://LB_IP_ADDRESS:443'
-k
标志会导致 curl 跳过证书验证。
配置具有跨项目后端服务的负载均衡器
本页面上的上一个示例展示了如何设置共享 VPC 部署,其中所有负载均衡器组件及其后端都在服务项目中创建。
借助内部应用负载均衡器,您还可以配置共享 VPC 部署,其中,一个宿主项目或服务项目中的网址映射可引用位于共享 VPC 环境中的多个服务项目的后端服务(和后端)。这称为跨项目服务引用。
您可以参考本部分中的步骤来配置此处列出的任何受支持组合:
- 宿主项目中的转发规则、目标代理和网址映射,以及服务项目中的后端服务
- 服务项目中的转发规则、目标代理和网址映射,以及另一个服务项目中的后端服务
跨项目服务引用可用于实例组、无服务器 NEG 或任何其他受支持的后端类型。如果您使用的是无服务器 NEG,则需要在您打算创建负载均衡器的前端的 VPC 网络中创建虚拟机。如需查看示例,请参阅“使用 Cloud Run 设置内部应用负载均衡器”中的在特定子网中创建虚拟机实例。
设置要求
此示例在两个不同的服务项目中配置示例负载均衡器及其前端和后端。
如果尚未执行此操作,您必须完成设置共享 VPC 的所有必要步骤,并配置此示例所需的网络、子网和防火墙规则。如需了解相关说明,请参阅以下内容:
在服务项目 B 中创建后端和后端服务
本部分中的所有步骤都必须在服务项目 B 中执行。
控制台
创建实例模板。在 Google Cloud 控制台中,转到实例模板页面。
- 点击创建实例模板。
- 输入实例模板的名称:
cross-ref-backend-template
。 - 确保启动磁盘已设置为 Debian 映像,例如 Debian GNU/Linux 10 (buster)。本文中的说明使用仅 Debian 支持的命令,例如
apt-get
。如果您需要更改启动磁盘,请点击更改。- 在操作系统部分,选择 Debian。
- 在版本部分,选择一个可用的 Debian 映像,例如 Debian GNU/Linux 10 (buster)。
- 点击选择。
- 点击高级选项,然后点击网络。
- 输入以下网络标记:
allow-ssh
,load-balanced-backend
。 - 在网络接口部分,选择与我共享的网络(通过宿主项目:HOST_PROJECT_ID)。
- 从
lb-network
网络中选择lb-frontend-and-backend-subnet
子网。 - 点击管理。对于管理,将以下脚本插入到启动脚本字段中。
#! /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 - 点击创建。
创建代管式实例组。在 Google Cloud 控制台中,转到实例组页面。
- 点击创建实例组。
- 选择新的代管式实例组(无状态)。如需了解详情,请参阅无状态或有状态 MIG。
- 输入实例组的名称:
cross-ref-ig-backend
。 - 对于位置,选择单个可用区。
- 对于区域,请选择
us-west1
。 - 对于可用区,请选择
us-west1-a
。 - 对于实例模板,请选择 cross-ref-backend-template。
指定要在组中创建的实例数。
对于此示例,在自动扩缩部分指定以下选项:
- 对于自动扩缩模式,请选择
Off:do not autoscale
。 - 对于实例数上限,请输入
2
。
(可选)在界面的自动扩缩部分中,您可以将实例组配置为根据实例 CPU 使用情况自动添加或移除实例。
- 对于自动扩缩模式,请选择
点击创建。
创建区域后端服务。在执行此步骤的过程中,我们还将创建健康检查,并将后端添加到后端服务。在 Google Cloud 控制台中,进入后端页面。
- 点击创建区域级后端服务。
- 输入后端服务的名称:
cross-ref-backend-service
。 - 对于区域,选择 us-west1。
- 对于负载均衡器类型,选择区域内部应用负载均衡器 (INTERNAL_MANAGED)。
- 将后端类型设置为实例组。
- 在后端部分中,将网络设置为 lb-network。
- 点击添加后端,然后设置以下字段:
- 将实例组设置为 cross-ref-ig-backend。
- 输入端口号:
80
。 - 将平衡模式设置为利用率。
- 点击完成。
- 在健康检查部分,使用以下参数选择创建健康检查:
- 名称:
cross-ref-http-health-check
- 协议:
HTTP
- 端口:
80
- 点击保存。
- 名称:
- 点击继续。
可选:在添加权限部分,输入其他项目中的 Load Balancer Admin 的 IAM 主账号(通常是电子邮件地址),以便他们能够为自己项目中的负载均衡器使用此后端服务。如果没有添加此权限,则无法进行跨项目服务引用。
如果您无权为此项目中的后端服务设置访问权限控制政策,您现在还是可以创建后端服务,之后可由一个授权用户来执行此步骤(如向 Load Balancer Admin 授予使用后端服务的权限部分所述)。本部分还介绍了如何授予对此项目中全部后端服务的访问权限,这样就避免了每次创建新的后端服务时都需要单独授予访问权限这一繁琐步骤。
点击创建。
gcloud
使用
gcloud compute instance-templates create
命令创建含有 HTTP 服务器的虚拟机实例模板。gcloud compute instance-templates create BACKEND_IG_TEMPLATE \ --region=us-west1 \ --network=projects/HOST_PROJECT_ID/global/networks/lb-network \ --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-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' \ --project=SERVICE_PROJECT_B_ID
请替换以下内容:
BACKEND_IG_TEMPLATE
:实例组模板的名称。SERVICE_PROJECT_B_ID
:在其中创建了负载均衡器的后端和后端服务的服务项目 B 的项目 ID。HOST_PROJECT_ID
:共享 VPC 宿主项目的项目 ID。
使用
gcloud compute instance-groups managed create
命令在该可用区中创建一个代管式实例组。gcloud compute instance-groups managed create BACKEND_MIG \ --zone=us-west1-a \ --size=2 \ --template=BACKEND_IG_TEMPLATE \ --project=SERVICE_PROJECT_B_ID
请替换以下内容:
BACKEND_MIG
:后端实例组的名称。
使用
gcloud compute health-checks create http
命令定义 HTTP 健康检查。gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \ --region=us-west1 \ --use-serving-port \ --project=SERVICE_PROJECT_B_ID
请替换以下内容:
HTTP_HEALTH_CHECK_NAME
:HTTP 健康检查的名称。
使用
gcloud compute backend-services create
命令定义后端服务。gcloud compute backend-services create BACKEND_SERVICE_NAME \ --load-balancing-scheme=INTERNAL_MANAGED \ --protocol=HTTP \ --health-checks=HTTP_HEALTH_CHECK_NAME \ --health-checks-region=us-west1 \ --region=us-west1 \ --project=SERVICE_PROJECT_B_ID
请替换以下内容:
BACKEND_SERVICE_NAME
:在服务项目 B 中创建的后端服务的名称。
使用
gcloud compute backend-services add-backend
命令将后端添加到后端服务。gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --balancing-mode=UTILIZATION \ --instance-group=BACKEND_MIG \ --instance-group-zone=us-west1-a \ --region=us-west1 \ --project=SERVICE_PROJECT_B_ID
Terraform
创建一个实例模板。
创建托管式实例组。
对于 HTTP
对于 HTTPS
为后端创建健康检查。
对于 HTTP
对于 HTTPS
创建区域后端服务。
在服务项目 A 中创建负载均衡器前端和网址映射
本部分中的所有步骤都必须在服务项目 A 中执行。
控制台
开始配置
在 Google Cloud 控制台中,转到负载均衡页面。
- 点击创建负载均衡器。
- 在负载均衡器的类型字段中,选择应用负载均衡器 (HTTP/HTTPS),然后点击下一步。
- 在公共或内部字段中,选择内部,然后点击下一步。
- 在跨区域或单区域部署字段中,选择最适合区域级工作负载,然后点击下一步。
- 点击配置。
基本配置
- 输入负载均衡器的名称。
- 对于区域,请选择
us-west1
。 对于网络,选择 lb-network(来自项目:HOST_PROJECT_NAME)。
如果您看到共享 VPC 网络中需要代理专用子网警告,请确认宿主项目管理员已在
lb-network
共享 VPC 网络中的us-west1
区域创建proxy-only-subnet
。即使您无权查看此页面上的代理专用子网,负载均衡器创建也会成功。不关闭窗口继续操作。
配置后端
- 点击后端配置。
- 点击跨项目后端服务。
- 对于项目 ID,输入服务项目 B 的项目 ID。
- 对于后端服务名称,输入您要使用的服务项目 B 中的后端服务的名称。在此示例中为
cross-ref-backend-service
。 - 点击添加后端服务。
配置路由规则
- 点击路由规则。确保 cross-ref-backend-service 是任何不匹配的主机和任何不匹配的路径的唯一后端服务。
如需了解流量管理,请参阅设置流量管理。
配置前端
为使跨项目服务引用正常工作,前端必须使用用于创建后端服务的共享 VPC 宿主项目中的同一网络 (lb-network
)。
对于 HTTP:
- 点击前端配置。
- 输入转发规则的名称:
cross-ref-http-forwarding-rule
。 - 将协议设置为
HTTP
。 - 将子网设置为
lb-frontend-and-backend-subnet
。 请勿为前端选择代理专用子网,即使它是列表中的选项也是如此。 - 将端口设置为
80
。 - 点击 IP 地址菜单,然后点击创建 IP 地址。
- 在预留静态内部 IP 地址面板中,提供以下详细信息:
- 对于名称,请输入
cross-ref-ip-address
。 - 对于静态 IP 地址,点击让我选择。对于自定义 IP 地址,输入
10.1.2.98
。 - (可选)如果要与不同前端共享此 IP 地址,请将用途设置为共享。
- 对于名称,请输入
- 点击完成。
对于 HTTPS:
如果您在客户端和负载均衡器之间使用 HTTPS,则需要一个或多个 SSL 证书资源来配置代理。如需了解如何创建 SSL 证书资源,请参阅 SSL 证书。内部应用负载均衡器目前不支持由 Google 管理的证书。
- 点击前端配置。
- 输入转发规则的名称:
cross-ref-https-forwarding-rule
。 - 在协议字段中,选择
HTTPS (includes HTTP/2)
。 - 将子网设置为
lb-frontend-and-backend-subnet
。 请勿为前端选择代理专用子网,即使它是列表中的选项也是如此。 - 确保将端口设置为
443
,以允许 HTTPS 流量。 - 点击 IP 地址菜单,然后点击创建 IP 地址。
- 在预留静态内部 IP 地址面板中,提供以下详细信息:
- 对于名称,请输入
cross-ref-ip-address
。 - 对于静态 IP 地址,点击让我选择。对于自定义 IP 地址,输入
10.1.2.98
。 - (可选)如果要与不同前端共享此 IP 地址,请将用途设置为共享。
- 对于名称,请输入
- 点击证书列表。
- 如果您已经拥有要用作主要 SSL 证书的自行管理的 SSL 证书资源,请从菜单中选择该证书。
- 否则,请选择创建新证书。
- 输入 SSL 证书的名称。
- 在相应字段中上传您的 PEM 格式的文件:
- 公钥证书
- 证书链
- 私钥
- 点击创建。
- 如需添加除了主要 SSL 证书资源之外的其他证书资源,请执行以下操作:
- 点击添加证书。
- 从证书列表中选择一个证书,或点击创建新证书并按照上述说明操作。
- 点击完成。
检查并最终确定配置
- 点击创建。
测试负载均衡器
创建负载均衡器后,使用测试负载均衡器中所述的步骤来测试负载均衡器。
gcloud
创建网址映射,并将默认服务设置为在服务项目 B 中创建的后端服务。
gcloud compute url-maps create URL_MAP_NAME \ --default-service=projects/SERVICE_PROJECT_B_ID/regions/us-west1/backendServices/BACKEND_SERVICE_NAME \ --region=us-west1 \ --project=SERVICE_PROJECT_A_ID
请替换以下内容:
URL_MAP_NAME
:网址映射的名称。BACKEND_SERVICE_NAME
:在服务项目 B 中创建的后端服务的名称。SERVICE_PROJECT_B_ID
:在其中创建了负载均衡器的后端和后端服务的服务项目 B 的项目 ID。SERVICE_PROJECT_A_ID
:在其中创建了负载均衡器前端的服务项目 A 的项目 ID。
如果您没有服务项目 B 中后端服务的
compute.backendServices.use
权限,网址映射创建会失败。创建目标代理。
对于 HTTP:
gcloud compute target-http-proxies create HTTP_TARGET_PROXY_NAME \ --url-map=URL_MAP_NAME \ --url-map-region=us-west1 \ --region=us-west1 \ --project=SERVICE_PROJECT_A_ID
请替换以下内容:
HTTP_TARGET_PROXY_NAME
:目标 HTTP 代理的名称。
对于 HTTPS:
使用
gcloud compute ssl-certificates create
命令创建区域 SSL 证书。gcloud compute ssl-certificates create SSL_CERTIFICATE_NAME \ --certificate=PATH_TO_CERTIFICATE \ --private-key=PATH_TO_PRIVATE_KEY \ --region=us-west1 \ --project=SERVICE_PROJECT_A_ID
请替换以下内容:
SSL_CERTIFICATE_NAME
:SSL 证书资源的名称。PATH_TO_CERTIFICATE
:PEM 格式的本地 SSL 证书文件的路径。PATH_TO_PRIVATE_KEY
:PEM 格式的本地 SSL 证书私钥的路径。
使用区域 SSL 证书通过
gcloud compute target-https-proxies create
命令创建目标代理。gcloud compute target-https-proxies create HTTPS_TARGET_PROXY_NAME \ --url-map=URL_MAP_NAME \ --region=us-west1 \ --ssl-certificates=SSL_CERTIFICATE_NAME \ --project=SERVICE_PROJECT_A_ID
请替换以下内容:
HTTPS_TARGET_PROXY_NAME
:目标 HTTPS 代理的名称。
创建转发规则。 为使跨项目服务引用正常工作,转发规则必须使用用于创建后端服务的共享 VPC 宿主项目中的同一网络 (
lb-network
)。对于 HTTP:
gcloud compute forwarding-rules create HTTP_FORWARDING_RULE_NAME \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=projects/HOST_PROJECT_ID/global/networks/lb-network \ --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \ --address=IP_ADDRESS_CROSS_REF \ --ports=80 \ --region=us-west1 \ --target-http-proxy=HTTP_TARGET_PROXY_NAME \ --target-http-proxy-region=us-west1 \ --project=SERVICE_PROJECT_A_ID
请替换以下内容:
HTTP_FORWARDING_RULE_NAME
:用于处理 HTTP 流量的转发规则的名称。
对于 HTTPS:
gcloud compute forwarding-rules create HTTPS_FORWARDING_RULE_NAME \ --load-balancing-scheme=INTERNAL_MANAGED \ --network=projects/HOST_PROJECT_ID/global/networks/lb-network \ --subnet=projects/HOST_PROJECT_ID/regions/us-west1/subnetworks/lb-frontend-and-backend-subnet \ --address=IP_ADDRESS_CROSS_REF \ --ports=443 \ --region=us-west1 \ --target-https-proxy=HTTPS_TARGET_PROXY_NAME \ --target-https-proxy-region=us-west1 \ --project=SERVICE_PROJECT_A_ID
请替换以下内容:
HTTPS_FORWARDING_RULE_NAME
:用于处理 HTTPS 流量的转发规则的名称。
如需测试负载均衡器,请使用测试负载均衡器中所述的步骤。
Terraform
创建网址映射。
创建目标代理。
对于 HTTP
对于 HTTPS
创建区域性 SSL 证书
使用地区 SSL 证书创建目标代理
创建转发规则。
对于 HTTP
对于 HTTPS
如需测试负载均衡器,请使用测试负载均衡器中所述的步骤。
向负载均衡器管理员授予使用后端服务的权限
如果您希望负载均衡器引用其他服务项目中的后端服务,则 Load Balancer Admin 必须具有 compute.backendServices.use
权限。如需授予此权限,您可以使用名为 Compute Load Balancer Services User (roles/compute.loadBalancerServiceUser
) 的预定义 IAM 角色。此角色必须由服务项目管理员授予,可以在项目级层或个别后端服务级层应用。
如果您在创建后端服务时已在后端服务级层授予了所需的权限,则不需要执行此步骤。您可以跳过此部分,也可以继续阅读此部分以了解如何授予对项目中所有后端服务的访问权限,这样您就无需在每次创建新的后端服务时都授予访问权限。
在此示例中,服务项目 B 中的 Service Project Admin 必须运行以下任一命令,以向服务项目 A 中的 Load Balancer Admin 授予 compute.backendServices.use
权限。可以在项目级层(针对项目中的所有后端服务)授予该权限,也可以针对个别后端服务授予该权限。
控制台
项目级权限
请按照以下步骤授予对项目中所有后端服务的权限。
您需要拥有 compute.regionBackendServices.setIamPolicy
和 resourcemanager.projects.setIamPolicy
权限才能完成此步骤。
在 Google Cloud 控制台中,前往共享负载均衡服务页面。
在所有后端服务权限(项目级权限)部分,选择您的项目。
如果权限面板不可见,请点击显示权限面板。项目级权限面板会在右侧打开。
点击
添加主账号。在新的主账号部分,输入主账号的电子邮件地址或其他标识符。
在角色部分,从下拉列表中选择 Compute Load Balancer Services User 角色。
可选:为角色添加条件。
点击保存。
针对个别后端服务的资源级权限
请按照以下步骤授予对项目中个别后端服务的权限。
您需要拥有 compute.regionBackendServices.setIamPolicy
权限才能完成此步骤。
gcloud
项目级权限
请按照以下步骤授予对项目中所有后端服务的权限。
您需要拥有 compute.regionBackendServices.setIamPolicy
和 resourcemanager.projects.setIamPolicy
权限才能完成此步骤。
gcloud projects add-iam-policy-binding SERVICE_PROJECT_B_ID \ --member="user:LOAD_BALANCER_ADMIN" \ --role="roles/compute.loadBalancerServiceUser"
针对个别后端服务的资源级权限
在后端服务级层,服务项目管理员可以使用以下任一命令来授予 Compute Load Balancer Services User 角色 (roles/compute.loadBalancerServiceUser
)。
您需要拥有 compute.regionBackendServices.setIamPolicy
权限才能完成此步骤。
gcloud projects add-iam-policy-binding SERVICE_PROJECT_B_ID \ --member="user:LOAD_BALANCER_ADMIN" \ --role="roles/compute.loadBalancerServiceUser" \ --condition='expression=resource.name=="projects/SERVICE_PROJECT_B_ID/regions/us-west1/backend-services/BACKEND_SERVICE_NAME",title=Shared VPC condition'
或
gcloud compute backend-services add-iam-policy-binding BACKEND_SERVICE_NAME \ --member="user:LOAD_BALANCER_ADMIN" \ --role="roles/compute.loadBalancerServiceUser" \ --project=SERVICE_PROJECT_B_ID \ --region=us-west1
如需使用这些命令,请将 LOAD_BALANCER_ADMIN
替换为用户的主账号,例如 test-user@gmail.com
。
通过使用条件并指定条件特性,您还可以配置 IAM 权限,使其仅应用于部分区域后端服务。
后续步骤
- 您可以使用组织政策限制条件来限制共享 VPC 功能(例如跨项目服务引用)在项目中的使用方式。如需了解详情,请参阅 Cloud Load Balancing 的组织政策限制条件。
- 如需管理内部应用负载均衡器所需的代理专用子网资源,请参阅内部应用负载均衡器的代理专用子网。
- 如需查看如何排查内部应用负载均衡器的问题,请参阅排查内部应用负载均衡器问题。
- 清理负载均衡器设置。