本指南通过一个示例介绍了 Google Cloud 内部直通式网络负载均衡器的基础知识。在按照本指南中的说明进行操作之前,请先熟悉以下内容:
如需在 Google Cloud 控制台中直接遵循有关此任务的分步指导,请点击操作演示:
权限
为按照本指南进行操作,您需要创建实例并修改项目中的网络。您应该具有项目的 Owner 或 Editor 角色,或者应该具有以下 Compute Engine IAM 角色:
任务 | 所需角色 |
---|---|
创建网络、子网和负载均衡器组件 | Network Admin |
添加和移除防火墙规则 | Security Admin |
创建实例 | Compute Instance Admin |
如需了解详情,请参阅以下指南:
设置具有单栈子网的负载均衡器
本指南介绍如何配置和测试内部直通式网络负载均衡器。此部分中的步骤介绍了如何配置以下内容:
- 使用名为
lb-network
的自定义模式 VPC 网络的示例。 - 单栈子网(
stack-type
设置为IPv4
),IPv4 流量需要该子网。在自定义模式 VPC 网络上创建单栈子网时,您可以为子网选择 IPv4 子网范围。 - 允许后端虚拟机的传入连接的防火墙规则。
- 后端实例组,在本示例中,位于以下区域和子网中:
- 地区:
us-west1
- 子网:
lb-subnet
,其主要 IPv4 地址范围为10.1.2.0/24
。
- 地区:
- 四个后端虚拟机:可用区
us-west1-a
中非代管式实例组中的两个虚拟机,以及可用区us-west1-c
中非代管式实例组中的两个虚拟机。为了演示全球访问权限,此示例会在其他区域和子网中再创建一个测试客户端虚拟机:- 地区:
europe-west1
- 子网:
europe-subnet
(其主要 IP 地址范围为10.3.4.0/24
)
- 地区:
- 一个用于测试连接的客户端虚拟机。
- 以下内部直通网络负载均衡器组件:
- 后端服务健康检查。
us-west1
区域中的内部后端服务,用于管理两个可用区实例组的连接分布。- 负载均衡器前端的内部转发规则和内部 IP 地址。
此示例的架构如下所示:
配置网络、区域和子网
如需创建示例网络和子网,请按照以下步骤操作。
控制台
在 Google Cloud 控制台中,进入 VPC 网络页面。
点击创建 VPC 网络。
对于名称,输入
lb-network
。在子网部分中,执行以下操作:
- 将子网创建模式设置为自定义。
- 在新子网部分中,输入以下信息:
- 名称:
lb-subnet
- 区域:
us-west1
- IP 栈类型:IPv4(单栈)
- IP 地址范围:
10.1.2.0/24
- 名称:
- 点击完成。
- 点击添加子网,然后输入以下信息:
- 名称:
europe-subnet
- 区域:
europe-west1
- IP 栈类型:IPv4(单栈)
- IP 地址范围:
10.3.4.0/24
- 名称:
- 点击完成。
点击创建。
gcloud
创建自定义 VPC 网络:
gcloud compute networks create lb-network --subnet-mode=custom
在
lb-network
网络中,为us-west1
区域中的后端创建子网。gcloud compute networks subnets create lb-subnet \ --network=lb-network \ --range=10.1.2.0/24 \ --region=us-west1
在
lb-network
网络中,创建另一个子网以测试europe-west1
区域中的全球访问权限:gcloud compute networks subnets create europe-subnet \ --network=lb-network \ --range=10.3.4.0/24 \ --region=europe-west1
API
向 networks.insert
方法发出 POST
请求。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks { "routingConfig": { "routingMode": "REGIONAL" }, "name": "lb-network", "autoCreateSubnetworks": false }
向 subnetworks.insert
方法发出两个 POST
请求:
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks { "name": "lb-subnet", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "ipCidrRange": "10.1.2.0/24", "privateIpGoogleAccess": false }
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/europe-west1/subnetworks { "name": "europe-subnet", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "ipCidrRange": "10.3.4.0/24", "privateIpGoogleAccess": false }
配置防火墙规则
此示例使用以下防火墙规则:
fw-allow-lb-access
:入站流量规则,它适用于 VPC 网络中的所有目标,允许来自10.1.2.0/24
和10.3.4.0/24
范围内来源的流量。此规则允许来自位于两个子网中任一子网的任何客户端的传入流量。稍后,您可以配置和测试全球访问权限。fw-allow-ssh
:入站流量规则,它适用于负载均衡实例,允许从任何地址到 TCP 端口 22 的传入 SSH 连接。您可以为此规则选择限制性更高的来源 IP 范围;例如,您可以仅指定要从中启动 SSH 会话的系统的 IP 范围。此示例使用目标标记allow-ssh
来标识应该应用这项规则的虚拟机。fw-allow-health-check
:入站流量规则,它适用于负载均衡实例,允许来自 Google Cloud 健康检查系统(130.211.0.0/22
和35.191.0.0/16
)的流量。此示例使用目标标记allow-health-check
来标识应该应用该规则的实例。
如果不使用上述防火墙规则,则默认拒绝入站规则会阻止传入后端实例的流量。
控制台
在 Google Cloud 控制台中,转到防火墙页面。
如需允许子网流量,请点击创建防火墙规则并输入以下信息:
- 名称:
fw-allow-lb-access
- 网络:
lb-network
- 优先级:
1000
- 流量方向:入站
- 匹配时执行的操作:允许
- 目标:All instances in the network
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:
10.1.2.0/24
- 协议和端口:允许全部
- 名称:
点击创建。
如需允许传入的 SSH 连接,请再次点击创建防火墙规则,然后输入以下信息:
- 名称:
fw-allow-ssh
- 网络:
lb-network
- 优先级:
1000
- 流量方向:入站
- 匹配时执行的操作:允许
- 目标:指定的目标标记
- 目标标记:
allow-ssh
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:
0.0.0.0/0
- 协议和端口:选择指定的协议和端口,选中 TCP 复选框,然后在端口中输入
22
。
- 名称:
点击创建。
如需允许 Google Cloud 健康检查,请第三次点击创建防火墙规则,然后输入以下信息:
- 名称:
fw-allow-health-check
- 网络:
lb-network
- 优先级:
1000
- 流量方向:入站
- 匹配时执行的操作:允许
- 目标:指定的目标标记
- 目标标记:
allow-health-check
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:
130.211.0.0/22
和35.191.0.0/16
- 协议和端口:允许全部
- 名称:
点击创建。
gcloud
创建
fw-allow-lb-access
防火墙规则以允许在子网内进行通信:gcloud compute firewall-rules create fw-allow-lb-access \ --network=lb-network \ --action=allow \ --direction=ingress \ --source-ranges=10.1.2.0/24,10.3.4.0/24 \ --rules=tcp,udp,icmp
创建
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
规则以允许 Google Cloud 健康检查。gcloud compute firewall-rules create fw-allow-health-check \ --network=lb-network \ --action=allow \ --direction=ingress \ --target-tags=allow-health-check \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --rules=tcp,udp,icmp
API
向 firewalls.insert
方法发出 POST
请求,以创建 fw-allow-lb-access
防火墙规则。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls { "name": "fw-allow-lb-access", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "priority": 1000, "sourceRanges": [ "10.1.2.0/24", "10.3.4.0/24" ], "allowed": [ { "IPProtocol": "tcp" }, { "IPProtocol": "udp" }, { "IPProtocol": "icmp" } ], "direction": "INGRESS", "logConfig": { "enable": false }, "disabled": false }
向 firewalls.insert
方法发出 POST
请求,以创建 fw-allow-ssh
防火墙规则。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls { "name": "fw-allow-ssh", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "priority": 1000, "sourceRanges": [ "0.0.0.0/0" ], "targetTags": [ "allow-ssh" ], "allowed": [ { "IPProtocol": "tcp", "ports": [ "22" ] } ], "direction": "INGRESS", "logConfig": { "enable": false }, "disabled": false }
向 firewalls.insert
方法发出 POST
请求,以创建 fw-allow-health-check
防火墙规则。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls { "name": "fw-allow-health-check", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "priority": 1000, "sourceRanges": [ "130.211.0.0/22", "35.191.0.0/16" ], "targetTags": [ "allow-health-check" ], "allowed": [ { "IPProtocol": "tcp" }, { "IPProtocol": "udp" }, { "IPProtocol": "icmp" } ], "direction": "INGRESS", "logConfig": { "enable": false }, "disabled": false }
创建后端虚拟机和实例组
此示例使用了两个非代管实例组,每个实例组都有两个后端(服务器)虚拟机。为了展示内部直通式网络负载均衡器的区域级性质,我们将这两个实例组分别置于 us-west1-a
和 us-west1-c
这两个独立的可用区。
- 实例组
ig-a
包含以下两个虚拟机:vm-a1
vm-a2
- 实例组
ig-c
包含以下两个虚拟机:vm-c1
vm-c2
传入所有四个后端虚拟机的流量都经过负载均衡。
为了支持此示例和其他配置选项,四个虚拟机都运行一个 Apache Web 服务器,该服务器侦听以下 TCP 端口:80、8008、8080、8088、443 和 8443。
每个虚拟机均分配有 lb-subnet
的内部 IP 地址和临时外部(公共)IP 地址。您稍后可以移除外部 IP 地址。
后端虚拟机的外部 IP 地址不是必需的;但由于它们允许后端虚拟机从互联网下载 Apache,并且可以使用 SSH 进行连接,因此对此示例很有用。
默认情况下,Apache 配置为绑定到任何 IP 地址。内部直通网络负载均衡器通过保留目标 IP 地址来传送数据包。确保在后端虚拟机上运行的服务器软件在监听负载均衡器内部转发规则的 IP 地址。如果您配置了多条内部转发规则,请确保您的软件会监听与每条规则关联的内部 IP 地址。由内部直通式网络负载均衡器传送到后端虚拟机的数据包的目标 IP 地址是转发规则的内部 IP 地址。
为便于说明,这些后端虚拟机均运行 Debian GNU/Linux 10。
控制台
创建后端虚拟机
在 Google Cloud 控制台中,前往虚拟机实例页面。
使用以下名称和可用区组合对每个虚拟机重复执行第 3 步到第 8 步。
- 名称:
vm-a1
,可用区:us-west1-a
- 名称:
vm-a2
,可用区:us-west1-a
- 名称:
vm-c1
,可用区:us-west1-c
- 名称:
vm-c2
,可用区:us-west1-c
- 名称:
点击创建实例。
按照第 2 步中的说明设置名称。
对于区域,选择
us-west1
,然后按照第 2 步中的说明选择一个可用区。在启动磁盘部分中,确保为启动磁盘选项选择了 Debian 操作系统和 10 (Buster) 版本。如有必要,请点击更改以更改映像。
点击高级选项。
点击网络并配置以下字段:
- 对于网络标记,请输入
allow-ssh
和allow-health-check
。 - 对于网络接口,请选择以下内容:
- 网络:
lb-network
- 子网:
lb-subnet
- IP 栈类型:IPv4(单栈)
- 主要内部 IPv4 地址:临时(自动)
- 外部 IPv4 地址:临时
- 网络:
- 对于网络标记,请输入
点击管理,然后在启动脚本字段中输入以下脚本。所有四个虚拟机的脚本内容均相同。
#! /bin/bash if [ -f /etc/startup_script_completed ]; then exit 0 fi apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl file_ports="/etc/apache2/ports.conf" file_http_site="/etc/apache2/sites-available/000-default.conf" file_https_site="/etc/apache2/sites-available/default-ssl.conf" http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088" http_vh_prts="*:80 *:8008 *:8080 *:8088" https_listen_prts="Listen 443\nListen 8443" https_vh_prts="*:443 *:8443" 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 prt_conf="$(cat "$file_ports")" prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")" prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")" echo "$prt_conf" | tee "$file_ports" http_site_conf="$(cat "$file_http_site")" http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")" echo "$http_site_conf_2" | tee "$file_http_site" https_site_conf="$(cat "$file_https_site")" https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")" echo "$https_site_conf_2" | tee "$file_https_site" systemctl restart apache2 touch /etc/startup_script_completed
点击创建。
创建实例组
在 Google Cloud 控制台中,转到实例组页面。
使用以下组合重复执行下述步骤,以创建两个非代管式实例组,每个组包含两个虚拟机。
- 实例组名称:
ig-a
,可用区:us-west1-a
,虚拟机:vm-a1
和vm-a2
- 实例组名称:
ig-c
,可用区:us-west1-c
,虚拟机:vm-c1
和vm-c2
- 实例组名称:
点击创建实例组。
点击新建非代管式实例组。
按照第 2 步中的说明设置名称。
在位置部分,为区域选择
us-west1
,然后按照第 2 步中的说明选择可用区。对于网络,请选择
lb-network
。对于子网,选择
lb-subnet
。在虚拟机实例部分中,添加第 2 步中说明的虚拟机。
点击创建。
gcloud
使用
[VM-NAME]
和[ZONE]
的下列四种组合运行以下命令四次,以创建四个虚拟机。所有四个虚拟机的脚本内容均相同。VM-NAME
:vm-a1
,ZONE
:us-west1-a
VM-NAME
:vm-a2
,ZONE
:us-west1-a
VM-NAME
:vm-c1
,ZONE
:us-west1-c
VM-NAME
:vm-c2
,ZONE
:us-west1-c
gcloud compute instances create VM-NAME \ --zone=ZONE \ --image-family=debian-10 \ --image-project=debian-cloud \ --tags=allow-ssh,allow-health-check \ --subnet=lb-subnet \ --metadata=startup-script='#! /bin/bash if [ -f /etc/startup_script_completed ]; then exit 0 fi apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl file_ports="/etc/apache2/ports.conf" file_http_site="/etc/apache2/sites-available/000-default.conf" file_https_site="/etc/apache2/sites-available/default-ssl.conf" http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088" http_vh_prts="*:80 *:8008 *:8080 *:8088" https_listen_prts="Listen 443\nListen 8443" https_vh_prts="*:443 *:8443" 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 prt_conf="$(cat "$file_ports")" prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")" prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")" echo "$prt_conf" | tee "$file_ports" http_site_conf="$(cat "$file_http_site")" http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")" echo "$http_site_conf_2" | tee "$file_http_site" https_site_conf="$(cat "$file_https_site")" https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")" echo "$https_site_conf_2" | tee "$file_https_site" systemctl restart apache2 touch /etc/startup_script_completed'
在每个可用区中创建两个非代管实例组:
gcloud compute instance-groups unmanaged create ig-a \ --zone=us-west1-a gcloud compute instance-groups unmanaged create ig-c \ --zone=us-west1-c
将虚拟机添加到相应的实例组中:
gcloud compute instance-groups unmanaged add-instances ig-a \ --zone=us-west1-a \ --instances=vm-a1,vm-a2 gcloud compute instance-groups unmanaged add-instances ig-c \ --zone=us-west1-c \ --instances=vm-c1,vm-c2
API
对于 4 个虚拟机,请使用以下虚拟机名称和区域:
VM-NAME
:vm-a1
,ZONE
:us-west1-a
VM-NAME
:vm-a2
,ZONE
:us-west1-a
VM-NAME
:vm-c1
,ZONE
:us-west1-c
VM-NAME
:vm-c2
,ZONE
:us-west1-c
您可以通过运行以下 gcloud
命令来获取当前 DEBIAN_IMAGE_NAME
:
gcloud compute images list \ --filter="family=debian-10"
向 instances.insert
方法发出四个 POST
请求,以创建四个后端虚拟机:
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances { "name": "VM-NAME", "tags": { "items": [ "allow-health-check", "allow-ssh" ] }, "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/[ZONE]/machineTypes/e2-standard-2", "canIpForward": false, "networkInterfaces": [ { "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet", "accessConfigs": [ { "type": "ONE_TO_ONE_NAT", "name": "external-nat", "networkTier": "PREMIUM" } ] } ], "disks": [ { "type": "PERSISTENT", "boot": true, "mode": "READ_WRITE", "autoDelete": true, "deviceName": "VM-NAME", "initializeParams": { "sourceImage": "projects/debian-cloud/global/images/debian-image-name", "diskType": "projects/PROJECT_ID/zones/zone/diskTypes/pd-standard", "diskSizeGb": "10" } } ], "metadata": { "items": [ { "key": "startup-script", "value": "#! /bin/bash\napt-get update\napt-get install apache2 -y\na2ensite default-ssl\na2enmod ssl\nfile_ports=\"/etc/apache2/ports.conf\"\nfile_http_site=\"/etc/apache2/sites-available/000-default.conf\"\nfile_https_site=\"/etc/apache2/sites-available/default-ssl.conf\"\nhttp_listen_prts=\"Listen 80\\nListen 8008\\nListen 8080\\nListen 8088\"\nhttp_vh_prts=\"*:80 *:8008 *:8080 *:8088\"\nhttps_listen_prts=\"Listen 443\\nListen 8443\"\nhttps_vh_prts=\"*:443 *:8443\"\nvm_hostname=\"$(curl -H \"Metadata-Flavor:Google\" \\\nhttp://metadata.google.internal/computeMetadata/v1/instance/name)\"\necho \"Page served from: $vm_hostname\" | \\\ntee /var/www/html/index.html\nprt_conf=\"$(cat \"$file_ports\")\"\nprt_conf_2=\"$(echo \"$prt_conf\" | sed \"s|Listen 80|${http_listen_prts}|\")\"\nprt_conf=\"$(echo \"$prt_conf_2\" | sed \"s|Listen 443|${https_listen_prts}|\")\"\necho \"$prt_conf\" | tee \"$file_ports\"\nhttp_site_conf=\"$(cat \"$file_http_site\")\"\nhttp_site_conf_2=\"$(echo \"$http_site_conf\" | sed \"s|*:80|${http_vh_prts}|\")\"\necho \"$http_site_conf_2\" | tee \"$file_http_site\"\nhttps_site_conf=\"$(cat \"$file_https_site\")\"\nhttps_site_conf_2=\"$(echo \"$https_site_conf\" | sed \"s|_default_:443|${https_vh_prts}|\")\"\necho \"$https_site_conf_2\" | tee \"$file_https_site\"\nsystemctl restart apache2" } ] }, "scheduling": { "preemptible": false }, "deletionProtection": false }
向 instanceGroups.insert
方法发出一个 POST
请求,以创建两个实例组。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups { "name": "ig-a", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet" }
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instanceGroups { "name": "ig-c", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet" }
向 instanceGroups.addInstances
方法发出一个 POST
请求,为每个实例组添加实例。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups/ig-a/addInstances { "instances": [ { "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances/vm-a1", "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances/vm-a2" } ] }
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instanceGroups/ig-c/addInstances { "instances": [ { "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instances/vm-c1", "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instances/vm-c2" } ] }
配置负载均衡器组件
以下步骤会配置所有内部直通式网络负载均衡器组件,先配置健康检查和后端服务,然后配置前端组件:
健康检查:在此示例中,您使用检查 HTTP
200
(OK) 响应的 HTTP 健康检查。如需了解详情,请参阅内部直通式网络负载均衡器概览的健康检查部分。后端服务:由于您需要通过内部负载均衡器传递 HTTP 流量,因此需要使用 TCP,而不是 UDP。
转发规则:本示例创建了一条内部转发规则。
内部 IP 地址:在此示例中,您在创建转发规则时指定了内部 IP 地址
10.1.2.99
。
控制台
开始配置
在 Google Cloud 控制台中,转到负载均衡页面。
- 点击创建负载均衡器。
- 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步。
- 对于代理或直通,选择直通式负载均衡器,然后点击下一步。
- 在公共或内部字段中,选择内部,然后点击下一步。
- 点击配置。
基本配置
在创建内部直通网络负载均衡器页面上,输入以下信息:
- 负载均衡器名称:
be-ilb
- 区域:
us-west1
- 网络:
lb-network
配置后端
- 点击后端配置。
- 如需仅处理 IPv4 流量,请在后端的新后端部分,选择 IP 栈类型作为 IPv4(单栈)。
- 在实例组中,选择
ig-c
实例组,然后点击完成。 - 点击添加后端,然后重复此步骤来添加
ig-a
。 从健康检查列表中,选择创建健康检查,输入以下信息,然后点击保存。
- 名称:
hc-http-80
- 协议:
HTTP
- 端口:
80
- 代理协议:
NONE
- 请求路径:
/
请注意,当您使用 Google Cloud 控制台创建负载均衡器时,健康检查是全局性检查。如果要创建区域性健康检查,请使用
gcloud
或 API。- 名称:
请先确认后端配置旁边是否有蓝色对勾标记,然后再继续操作。
配置前端
- 点击前端配置。
- 在新建前端 IP 和端口部分,执行以下操作:
- 对于名称,输入
fr-ilb
。 - 对于子网,选择
lb-subnet
。 - 在内部 IP 用途部分的 IP 地址列表中,选择创建 IP 地址,输入以下信息,然后点击预留。
- 名称:
ip-ilb
- IP 版本:IPv4。
- 静态 IP 地址:让我选择
- 自定义 IP 地址:
10.1.2.99
- 名称:
- 对于端口,选择多个,然后在端口号中输入
80
、8008
、8080
和8088
。 - 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。
- 对于名称,输入
检查配置
- 点击检查并最终确定。
- 查看负载均衡器配置设置。
- 可选:点击等效代码以查看将用于创建负载均衡器的 REST API 请求。
- 点击创建。
gcloud
创建一个新的区域性 HTTP 健康检查,以测试端口 80 上的虚拟机的 HTTP 连接。
gcloud compute health-checks create http hc-http-80 \ --region=us-west1 \ --port=80
为 HTTP 流量创建后端服务:
gcloud compute backend-services create be-ilb \ --load-balancing-scheme=internal \ --protocol=tcp \ --region=us-west1 \ --health-checks=hc-http-80 \ --health-checks-region=us-west1
将两个实例组添加到后端服务:
gcloud compute backend-services add-backend be-ilb \ --region=us-west1 \ --instance-group=ig-a \ --instance-group-zone=us-west1-a gcloud compute backend-services add-backend be-ilb \ --region=us-west1 \ --instance-group=ig-c \ --instance-group-zone=us-west1-c
为后端服务创建转发规则。创建转发规则时,请指定
10.1.2.99
作为子网中的内部 IP 地址。gcloud compute forwarding-rules create fr-ilb \ --region=us-west1 \ --load-balancing-scheme=internal \ --network=lb-network \ --subnet=lb-subnet \ --address=10.1.2.99 \ --ip-protocol=TCP \ --ports=80,8008,8080,8088 \ --backend-service=be-ilb \ --backend-service-region=us-west1
API
向 regionHealthChecks.insert
方法发出 POST
请求,以创建健康检查。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/regionHealthChecks { "name": "hc-http-80", "type": "HTTP", "httpHealthCheck": { "port": 80 } }
向 regionBackendServices.insert
方法发出 POST
请求,以创建区域后端服务。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices { "name": "be-ilb", "backends": [ { "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups/ig-a", "balancingMode": "CONNECTION" }, { "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instanceGroups/ig-c", "balancingMode": "CONNECTION" } ], "healthChecks": [ "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/healthChecks/hc-http-80" ], "loadBalancingScheme": "INTERNAL", "connectionDraining": { "drainingTimeoutSec": 0 } }
向 forwardingRules.insert
方法发出 POST
请求,以创建转发规则。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules { "name": "fr-ilb", "IPAddress": "10.1.2.99", "IPProtocol": "TCP", "ports": [ "80", "8008", "8080", "8088" ], "loadBalancingScheme": "INTERNAL", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb", "networkTier": "PREMIUM" }
测试负载均衡器
这部分中的测试展示了如何验证负载均衡器配置并了解其预期行为。
创建客户端虚拟机
此示例在后端(服务器)虚拟机所在的同一区域创建一个客户端虚拟机 (vm-client
)。该客户端用于验证负载均衡器的配置,并演示测试部分中所述的预期行为。
控制台
在 Google Cloud 控制台中,转到虚拟机实例页面。
点击创建实例。
对于名称,输入
vm-client
。对于区域,请选择
us-west1
。对于可用区,请选择
us-west1-a
。点击高级选项。
点击网络并配置以下字段:
- 对于网络标记,请输入
allow-ssh
。 - 对于网络接口,请选择以下内容:
- 网络:
lb-network
- 子网:
lb-subnet
- 网络:
- 对于网络标记,请输入
点击创建。
gcloud
客户端虚拟机可以位于负载均衡器所在的同一区域的任何可用区中,并且可以使用该区域中的任何子网。在此示例中,客户端位于 us-west1-a
区域,并使用与后端虚拟机相同的子网。
gcloud compute instances create vm-client \ --zone=us-west1-a \ --image-family=debian-10 \ --image-project=debian-cloud \ --tags=allow-ssh \ --subnet=lb-subnet
API
向 instances.insert
方法发出 POST
请求。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances { "name": "vm-client", "tags": { "items": [ "allow-ssh" ] }, "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/machineTypes/e2-standard-2", "canIpForward": false, "networkInterfaces": [ { "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet", "accessConfigs": [ { "type": "ONE_TO_ONE_NAT", "name": "external-nat", "networkTier": "PREMIUM" } ] } ], "disks": [ { "type": "PERSISTENT", "boot": true, "mode": "READ_WRITE", "autoDelete": true, "deviceName": "vm-client", "initializeParams": { "sourceImage": "projects/debian-cloud/global/images/debian-image-name", "diskType": "projects/PROJECT_ID/zones/us-west1-a/diskTypes/pd-standard", "diskSizeGb": "10" } } ], "scheduling": { "preemptible": false }, "deletionProtection": false }
测试来自客户端虚拟机的连接
此测试通过单独的客户端虚拟机连接负载均衡器;也就是说,并非使用负载均衡器的后端虚拟机。预期的行为是流量分布在四个后端虚拟机中,因为没有配置会话亲和性。
连接到客户端虚拟机实例。
gcloud compute ssh vm-client --zone=us-west1-a
使用
curl
连接负载均衡器的 IP 地址,通过这种方式向负载均衡器发送 Web 请求。重复该请求,您可以看到响应来自不同的后端虚拟机。根据每个后端虚拟机上/var/www/html/index.html
的内容,生成响应的虚拟机的名称会显示在 HTML 响应的文本中。例如,预期响应如Page served from: vm-a1
和Page served from: vm-a2
所示。curl http://10.1.2.99
转发规则配置为提供端口
80
、8008
、8080
和8088
。如需向这些端口发送流量,请在 IP 地址后附加英文冒号 (:
) 和端口号,如下所示:curl http://10.1.2.99:8008
如果您为内部转发规则添加服务标签,则可以使用内部 DNS 通过其服务名称连接负载均衡器。
curl http://web-test.fr-ilb.il4.us-west1.lb.PROJECT_ID.internal
对负载均衡器的 IP 地址执行 ping 操作
此测试演示了预期的行为:您无法对负载均衡器的 IP 地址执行 ping 操作。这是因为内部直通式网络负载均衡器采用虚拟网络编程实现,不属于独立设备。
连接到客户端虚拟机实例。
gcloud compute ssh vm-client --zone=us-west1-a
尝试对负载均衡器的 IP 地址执行 ping 操作。请注意,在此示例中,您没有收到响应,并且
ping
命令在 10 秒后超时。timeout 10 ping 10.1.2.99
从负载均衡虚拟机发送请求
此测试表明,当后端虚拟机将数据包发送到负载均衡器的转发规则的 IP 地址时,这些请求会路由回后端虚拟机自身。无论后端虚拟机的健康检查状态如何,情况都是如此。
内部直通式网络负载均衡器是在客机操作系统中使用虚拟网络编程和虚拟机配置实现的。在 Linux 虚拟机上,客机环境会在操作系统的本地路由表中为负载均衡器的 IP 地址创建路由。
由于此本地路由在虚拟机自身内(而非 VPC 网络中的路由),因此 VPC 网络不会处理发送到负载均衡器的 IP 地址的数据包。相反,发送到负载均衡器的 IP 地址的数据包仍会保留在虚拟机的操作系统中。
连接到后端虚拟机,例如
vm-a1
:gcloud compute ssh vm-a1 --zone=us-west1-a
使用
curl
向负载均衡器发出 Web 请求(通过 IP 地址或服务名称)。响应来自发出请求的同一后端虚拟机。重复请求的响应方式相同。从vm-a1
进行测试时的预期响应始终为Page served from: vm-a1
。curl http://10.1.2.99
检查本地路由表,查找与负载均衡器本身的 IP 地址
10.1.2.99
匹配的目标。此路由是内部直通式网络负载均衡器的必要部分,但也说明了由负载均衡器的后端虚拟机发出的请求始终由同一虚拟机响应的原因。ip route show table local | grep 10.1.2.99
当内部直通式网络负载均衡器的后端虚拟机将数据包发送到负载均衡器的转发规则 IP 地址时,数据包将始终路由回发出请求的虚拟机。这是因为内部直通式网络负载均衡器是直通式负载均衡器,并通过在虚拟机的客机操作系统中为负载均衡器的 IP 地址创建本地路由来实现,如本部分所示。如果在特定应用场景中,您实现了负载均衡的后端需要将 TCP 流量发送到负载均衡器的 IP 地址,并且您需要分配流量,就像其来自非负载均衡后端一样,请考虑使用区域级内部代理网络负载均衡器。
如需了解详情,请参阅内部直通式网络负载均衡器作为下一个跃点。
设置具有双栈子网的负载均衡器
本指南介绍如何配置和测试内部直通式网络负载均衡器。此部分中的步骤介绍了如何配置以下内容:
- 本页面中的示例使用名为
lb-network-dual-stack
的自定义模式 VPC 网络。IPv6 流量需要自定义模式子网。 - 双栈子网(
stack-type
设置为IPv4_IPv6
),IPv6 流量需要该子网。在自定义模式 VPC 网络上创建双栈子网时,您可以为子网选择 IPv6 访问类型。在此示例中,我们将子网的ipv6-access-type
参数设置为INTERNAL
。这意味着此子网上的新虚拟机可以分配内部 IPv4 地址和内部 IPv6 地址。如需了解相关说明,请参阅有关添加双栈子网的 VPC 文档。 - 允许后端虚拟机的传入连接的防火墙规则。
- 后端实例组,在本示例中,位于以下区域和子网中:
- 地区:
us-west1
- 子网:
lb-subnet
,其主要 IPv4 地址范围为10.1.2.0/24
。虽然您可以选择在子网上配置哪个 IPv4 地址范围,但系统会自动分配 IPv6 地址范围。Google 提供固定大小 (/64
) 的 IPv6 CIDR 地址块。
- 地区:
- 四个后端双栈虚拟机:可用区
us-west1-a
的非代管式实例组中的两个虚拟机,以及可用区us-west1-c
的非代管式实例组中的两个虚拟机。为了演示全球访问权限,此示例会在其他区域和子网中再创建一个测试客户端虚拟机:- 地区:
europe-west1
- 子网:
europe-subnet
(其主要 IP 地址范围为10.3.4.0/24
)
- 地区:
- 一个用于测试连接的客户端虚拟机。
- 以下内部直通网络负载均衡器组件:
- 后端服务健康检查。
us-west1
区域中的内部后端服务,用于管理两个可用区实例组的连接分布。- 负载均衡器前端的两条内部转发规则。
下图展示了此示例的架构:
配置网络、区域和子网
本页面介绍的内部直通式网络负载均衡器示例是在一个名为 lb-network-dual-stack
的自定义模式 VPC 网络中创建的。
如需配置具有内部 IPv6 范围的子网,请启用 VPC 网络 ULA 内部 IPv6 范围。内部 IPv6 子网范围是从此范围分配的。
控制台
在 Google Cloud 控制台中,进入 VPC 网络页面。
点击创建 VPC 网络。
对于名称,输入
lb-network-dual-stack
。如果您要在此网络中的子网上配置内部 IPv6 地址范围,请完成以下步骤:
- 对于 VPC 网络 ULA 内部 IPv6 范围,选择已启用。
- 对于分配内部 IPv6 范围,选择自动或手动。
对于子网创建模式,选择自定义。
在新子网部分,为子网指定以下配置参数:
- 名称:
lb-subnet
- 区域:
us-west1
- IP 栈类型:IPv4 和 IPv6(双栈)
- IPv4 范围:
10.1.2.0/24
。 - IPv6 访问权限类型:内部
- 名称:
点击完成。
点击添加子网,然后输入以下信息:
- 名称:
europe-subnet
- 区域:
europe-west1
- IP 栈类型:IPv4(单栈)
- IP 地址范围:
10.3.4.0/24
- 名称:
点击完成。
点击创建。
gcloud
如需创建新的自定义模式 VPC 网络,请运行
gcloud compute networks create
命令。如需在此网络中的任何子网上配置内部 IPv6 范围,请使用
--enable-ula-internal-ipv6
标志。此选项会分配 Google Cloud 用于内部 IPv6 子网范围的fd20::/20
范围内的/48
ULA 前缀。如果您要选择分配的/48
IPv6 范围,请使用--internal-ipv6-range
标志指定范围。gcloud compute networks create lb-network-dual-stack \ --subnet-mode=custom \ --enable-ula-internal-ipv6 \ --internal-ipv6-range=ULA_IPV6_RANGE \ --bgp-routing-mode=regional
将
ULA_IPV6_RANGE
替换为 Google 用于内部 IPv6 子网范围的fd20::/20
范围内的/48
前缀。如果您不使用--internal-ipv6-range
标志,则 Google 会为该网络选择/48
前缀,例如fd20:bc7:9a1c::/48
。在
NETWORK
网络中,为us-west1
区域中的后端创建子网,并创建另一个子网以测试europe-west1
区域中的全球访问权限。如需创建子网,请运行
gcloud compute networks subnets create
命令。gcloud compute networks subnets create lb-subnet \ --network=lb-network-dual-stack \ --range=10.1.2.0/24 \ --region=us-west1 \ --stack-type=IPV4_IPV6 \ --ipv6-access-type=INTERNAL
gcloud compute networks subnets create europe-subnet \ --network=lb-network-dual-stack \ --range=10.3.4.0/24 \ --region=europe-west1 \ --stack-type=IPV4_IPV6 \ --ipv6-access-type=INTERNAL
API
创建一个新的自定义模式 VPC 网络。
如需在此网络中的任何子网上配置内部 IPv6 范围,请将 enableUlaInternalIpv6
设置为 true。此选项会分配 Google 用于内部 IPv6 子网范围的 fd20::/20
范围内的 /48
范围。如果您要选择分配的 /48
IPv6 范围,还请使用 internalIpv6Range
字段指定范围。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks { "autoCreateSubnetworks": false, "name": "lb-network-dual-stack", "mtu": MTU, "enableUlaInternalIpv6": true, "internalIpv6Range": "ULA_IPV6_RANGE", "routingConfig": { "routingMode": "DYNAMIC_ROUTING_MODE" } }
请替换以下内容:
PROJECT_ID
:在其中创建 VPC 网络的项目的 ID。MTU
:该网络的最大传输单元。MTU 可以是1460
(默认值)或1500
。在将 MTU 设置为1500
之前,请查看最大传输单元概览。ULA_IPV6_RANGE
:Google 用于内部 IPv6 子网范围的fd20::/20
范围内的/48
前缀。如果您没有为internalIpv6Range
提供值,Google 会为该网络选择/48
前缀。DYNAMIC_ROUTING_MODE
:global
或regional
,用于控制网络中 Cloud Router 路由器的路由通告行为。如需了解详情,请参阅动态路由模式。如需了解详情,请参阅
networks.insert
方法。
向 subnetworks.insert
方法发出两个 POST
请求:
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks { "ipCidrRange": "10.1.2.0/24", "network": "lb-network-dual-stack", "name": "lb-subnet" "stackType": IPV4_IPV6, "ipv6AccessType": Internal }
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/subnetworks { "ipCidrRange": "10.3.4.0/24", "network": "lb-network-dual-stack", "name": "europe-subnet" "stackType": IPV4_IPV6, "ipv6AccessType": Internal }
配置防火墙规则
此示例使用以下防火墙规则:
fw-allow-lb-access
:入站流量规则,它适用于 VPC 网络中的所有目标,允许来自10.1.2.0/24
和10.3.4.0/24
范围内来源的流量。此规则允许来自位于两个子网中任一子网的任何客户端的传入流量。稍后,您可以配置和测试全球访问权限。fw-allow-lb-access-ipv6
:入站流量规则,它适用于 VPC 网络中的所有目标,允许来自子网中配置的 IPv6 范围内来源的流量。此规则允许来自位于两个子网中任一子网的任何客户端的传入 IPv6 流量。稍后,您可以配置和测试全球访问权限。fw-allow-ssh
:入站流量规则,它适用于负载均衡实例,允许从任何地址到 TCP 端口 22 的传入 SSH 连接。您可以为此规则选择限制性更高的来源 IP 地址范围;例如,您可以仅指定要从中启动 SSH 会话的系统的 IP 地址范围。此示例使用目标标记allow-ssh
来标识应该应用这项规则的虚拟机。fw-allow-health-check
:入站流量规则,它适用于负载均衡实例,允许来自 Google Cloud 健康检查系统(130.211.0.0/22
和35.191.0.0/16
)的流量。此示例使用目标标记allow-health-check
来标识应该应用该规则的实例。fw-allow-health-check-ipv6
:入站流量规则,它适用于负载均衡实例,允许来自 Google Cloud 健康检查系统 (2600:2d00:1:b029::/64
) 的流量。此示例使用目标标记allow-health-check-ipv6
来标识应该应用该规则的实例。
如果不使用上述防火墙规则,则默认拒绝入站规则会阻止传入后端实例的流量。
控制台
在 Google Cloud 控制台中,转到防火墙页面。
如需创建允许子网流量的规则,请点击创建防火墙规则,然后输入以下信息:
- 名称:
fw-allow-lb-access
- 网络:
lb-network-dual-stack
- 优先级:
1000
- 流量方向:入站
- 匹配时执行的操作:允许
- 目标:All instances in the network
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:
10.1.2.0/24
和10.3.4.0/24
- 协议和端口:允许全部
- 名称:
点击创建。
如需允许 IPv6 子网流量,请再次点击创建防火墙规则,然后输入以下信息:
- 名称:
fw-allow-lb-access-ipv6
- 网络:
lb-network-dual-stack
- 优先级:
1000
- 流量方向:入站
- 匹配时执行的操作:允许
- 目标:All instances in the network
- 来源过滤条件:IPv6 范围
- 来源 IPv6 范围:在
lb-subnet
中分配的 IPV6_ADDRESS - 协议和端口:允许全部
- 名称:
点击创建。
如需允许传入的 SSH 连接,请再次点击创建防火墙规则,然后输入以下信息:
- 名称:
fw-allow-ssh
- 网络:
lb-network-dual-stack
- 优先级:
1000
- 流量方向:入站
- 匹配时执行的操作:允许
- 目标:指定的目标标记
- 目标标记:
allow-ssh
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:
0.0.0.0/0
- 协议和端口:选择指定的协议和端口,选中 TCP 复选框,然后在端口中输入
22
。
- 名称:
点击创建。
如需允许 Google Cloud IPv6 健康检查,请再次点击创建防火墙规则,然后输入以下信息:
- 名称:
fw-allow-health-check-ipv6
- 网络:
lb-network-dual-stack
- 优先级:
1000
- 流量方向:入站
- 匹配时执行的操作:允许
- 目标:指定的目标标记
- 目标标记:
allow-health-check-ipv6
- 来源过滤条件:IPv6 范围
- 来源 IPv6 范围:
2600:2d00:1:b029::/64
- 协议和端口:允许全部
- 名称:
点击创建。
如需允许 Google Cloud 健康检查,请再次点击创建防火墙规则,然后输入以下信息:
- 名称:
fw-allow-health-check
- 网络:
lb-network-dual-stack
- 优先级:
1000
- 流量方向:入站
- 匹配时执行的操作:允许
- 目标:指定的目标标记
- 目标标记:
allow-health-check
- 来源过滤条件:IPv4 范围
- 来源 IPv4 范围:
130.211.0.0/22
和35.191.0.0/16
- 协议和端口:允许全部
- 名称:
点击创建。
gcloud
创建
fw-allow-lb-access
防火墙规则以允许与子网通信:gcloud compute firewall-rules create fw-allow-lb-access \ --network=lb-network-dual-stack \ --action=allow \ --direction=ingress \ --source-ranges=10.1.2.0/24,10.3.4.0/24 \ --rules=all
创建
fw-allow-lb-access-ipv6
防火墙规则以允许与子网通信:gcloud compute firewall-rules create fw-allow-lb-access-ipv6 \ --network=lb-network-dual-stack \ --action=allow \ --direction=ingress \ --source-ranges=IPV6_ADDRESS \ --rules=all
将
IPV6_ADDRESS
替换为在lb-subnet
中分配的 IPv6 地址。创建
fw-allow-ssh
防火墙规则,允许通过 SSH 连接到网络标记为allow-ssh
的虚拟机。如果省略source-ranges
,Google Cloud 会将规则解释为表示所有来源。gcloud compute firewall-rules create fw-allow-ssh \ --network=lb-network-dual-stack \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --rules=tcp:22
创建
fw-allow-health-check-ipv6
规则以允许 Google Cloud IPv6 健康检查。gcloud compute firewall-rules create fw-allow-health-check-ipv6 \ --network=lb-network-dual-stack \ --action=allow \ --direction=ingress \ --target-tags=allow-health-check-ipv6 \ --source-ranges=2600:2d00:1:b029::/64 \ --rules=tcp,udp
创建
fw-allow-health-check
规则以允许 Google Cloud 健康检查。gcloud compute firewall-rules create fw-allow-health-check \ --network=lb-network-dual-stack \ --action=allow \ --direction=ingress \ --target-tags=allow-health-check \ --source-ranges=130.211.0.0/22,35.191.0.0/16 \ --rules=tcp,udp,icmp
API
向
firewalls.insert
方法发出POST
请求,以创建fw-allow-lb-access
防火墙规则。POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls { "name": "fw-allow-lb-access", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack", "priority": 1000, "sourceRanges": [ "10.1.2.0/24", "10.3.4.0/24" ], "allowed": [ { "IPProtocol": "tcp" }, { "IPProtocol": "udp" }, { "IPProtocol": "icmp" } ], "direction": "INGRESS", "logConfig": { "enable": false }, "disabled": false }
向
firewalls.insert
方法发出POST
请求,以创建fw-allow-lb-access-ipv6
防火墙规则。POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls { "name": "fw-allow-lb-access-ipv6", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack", "priority": 1000, "sourceRanges": [ "IPV6_ADDRESS" ], "allowed": [ { "IPProtocol": "tcp" }, { "IPProtocol": "udp" }, { "IPProtocol": "icmp" } ], "direction": "INGRESS", "logConfig": { "enable": false }, "disabled": false }
将
IPV6_ADDRESS
替换为在lb-subnet
中分配的 IPv6 地址。向
firewalls.insert
方法发出POST
请求,以创建fw-allow-ssh
防火墙规则。POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls { "name": "fw-allow-ssh", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack", "priority": 1000, "sourceRanges": [ "0.0.0.0/0" ], "targetTags": [ "allow-ssh" ], "allowed": [ { "IPProtocol": "tcp", "ports": [ "22" ] } ], "direction": "INGRESS", "logConfig": { "enable": false }, "disabled": false }
向
firewalls.insert
方法发出POST
请求,以创建fw-allow-health-check-ipv6
防火墙规则。POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls { "name": "fw-allow-health-check-ipv6", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack", "priority": 1000, "sourceRanges": [ "2600:2d00:1:b029::/64" ], "targetTags": [ "allow-health-check-ipv6" ], "allowed": [ { "IPProtocol": "tcp" }, { "IPProtocol": "udp" } ], "direction": "INGRESS", "logConfig": { "enable": false }, "disabled": false }
向
firewalls.insert
方法发出POST
请求,以创建fw-allow-health-check
防火墙规则。POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls { "name": "fw-allow-health-check", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack", "priority": 1000, "sourceRanges": [ "130.211.0.0/22", "35.191.0.0/16" ], "targetTags": [ "allow-health-check" ], "allowed": [ { "IPProtocol": "tcp" }, { "IPProtocol": "udp" }, { "IPProtocol": "icmp" } ], "direction": "INGRESS", "logConfig": { "enable": false }, "disabled": false }
创建后端虚拟机和实例组
此示例使用了两个非代管实例组,每个实例组都有两个后端(服务器)虚拟机。为了展示内部直通式网络负载均衡器的区域级性质,我们将这两个实例组分别置于 us-west1-a
和 us-west1-c
这两个独立的可用区。
- 实例组
ig-a
包含以下两个虚拟机:vm-a1
vm-a2
- 实例组
ig-c
包含以下两个虚拟机:vm-c1
vm-c2
传入所有四个后端虚拟机的流量都经过负载均衡。
为了支持此示例和其他配置选项,四个虚拟机都运行一个 Apache Web 服务器,该服务器监听以下 TCP 端口:80
、8008
、8080
、8088
、443
和 8443
。
每个虚拟机均分配有 lb-subnet
的内部 IP 地址和临时外部(公共)IP 地址。您稍后可以移除外部 IP 地址。
后端虚拟机的外部 IP 地址不是必需的;但由于它们允许后端虚拟机从互联网下载 Apache,并且可以使用 SSH 进行连接,因此对此示例很有用。
默认情况下,Apache 配置为绑定到任何 IP 地址。内部直通式网络负载均衡器通过保留目标 IP 地址来传送数据包。
确保在后端虚拟机上运行的服务器软件在监听负载均衡器内部转发规则的 IP 地址。如果您配置了多条内部转发规则,请确保您的软件会监听与每条规则关联的内部 IP 地址。由内部直通式网络负载均衡器传送到后端虚拟机的数据包的目标 IP 地址是转发规则的内部 IP 地址。
确保子网堆栈类型与代管式实例组使用的实例模板的堆栈类型匹配。如果代管式实例组使用双栈实例模板,则子网必须是双栈。
为便于说明,这些后端虚拟机均运行 Debian GNU/Linux 10。
控制台
创建后端虚拟机
在 Google Cloud 控制台中,前往虚拟机实例页面。
使用以下名称和可用区组合对每个虚拟机重复执行第 3 步到第 8 步。
- 名称:
vm-a1
,可用区:us-west1-a
- 名称:
vm-a2
,可用区:us-west1-a
- 名称:
vm-c1
,可用区:us-west1-c
- 名称:
vm-c2
,可用区:us-west1-c
- 名称:
点击创建实例。
按照第 2 步中的说明设置名称。
对于区域,选择
us-west1
,然后按照第 2 步中的说明选择一个可用区。在启动磁盘部分中,确保为启动磁盘选项选择了 Debian 操作系统和 10 (Buster) 版本。如有必要,请点击更改以更改映像。
点击高级选项。
点击网络并配置以下字段:
- 对于网络标记,请输入
allow-ssh
和allow-health-check-ipv6
。 - 对于网络接口,请选择以下内容:
- 网络:
lb-network-dual-stack
- 子网:
lb-subnet
- IP 栈类型:IPv4 和 IPv6(双栈)
- 主要内部 IPv4 地址:临时(自动)
- 外部 IPv4 地址:临时
- 网络:
点击管理,然后在启动脚本字段中输入以下脚本。所有四个虚拟机的脚本内容均相同。
#! /bin/bash if [ -f /etc/startup_script_completed ]; then exit 0 fi apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl file_ports="/etc/apache2/ports.conf" file_http_site="/etc/apache2/sites-available/000-default.conf" file_https_site="/etc/apache2/sites-available/default-ssl.conf" http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088" http_vh_prts="*:80 *:8008 *:8080 *:8088" https_listen_prts="Listen 443\nListen 8443" https_vh_prts="*:443 *:8443" 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 prt_conf="$(cat "$file_ports")" prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")" prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")" echo "$prt_conf" | tee "$file_ports" http_site_conf="$(cat "$file_http_site")" http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")" echo "$http_site_conf_2" | tee "$file_http_site" https_site_conf="$(cat "$file_https_site")" https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")" echo "$https_site_conf_2" | tee "$file_https_site" systemctl restart apache2 touch /etc/startup_script_completed
- 对于网络标记,请输入
点击创建。
创建实例组
在 Google Cloud 控制台中,转到实例组页面。
使用以下组合重复执行下述步骤,以创建两个非代管式实例组,每个组包含两个虚拟机。
- 实例组名称:
ig-a
,可用区:us-west1-a
,虚拟机:vm-a1
和vm-a2
- 实例组名称:
ig-c
,可用区:us-west1-c
,虚拟机:vm-c1
和vm-c2
- 实例组名称:
点击创建实例组。
点击新建非代管式实例组。
按照第 2 步中的说明设置名称。
在位置部分,为区域选择
us-west1
,然后按照第 2 步中的说明选择一个可用区。对于网络,请选择
lb-network-dual-stack
。对于子网,选择
lb-subnet
。在虚拟机实例部分中,添加第 2 步中说明的虚拟机。
点击创建。
gcloud
如需创建四个虚拟机,请使用
[VM-NAME]
和[ZONE]
的下列四种组合运行四次gcloud compute instances create
命令。所有四个虚拟机的脚本内容均相同。VM-NAME
:vm-a1
,ZONE
:us-west1-a
VM-NAME
:vm-a2
,ZONE
:us-west1-a
VM-NAME
:vm-c1
,ZONE
:us-west1-c
VM-NAME
:vm-c2
,ZONE
:us-west1-c
gcloud compute instances create VM-NAME \ --zone=ZONE \ --image-family=debian-10 \ --image-project=debian-cloud \ --tags=allow-ssh,allow-health-check-ipv6 \ --subnet=lb-subnet \ --stack-type=IPV4_IPV6 \ --metadata=startup-script='#! /bin/bash if [ -f /etc/startup_script_completed ]; then exit 0 fi apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl file_ports="/etc/apache2/ports.conf" file_http_site="/etc/apache2/sites-available/000-default.conf" file_https_site="/etc/apache2/sites-available/default-ssl.conf" http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088" http_vh_prts="*:80 *:8008 *:8080 *:8088" https_listen_prts="Listen 443\nListen 8443" https_vh_prts="*:443 *:8443" 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 prt_conf="$(cat "$file_ports")" prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")" prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")" echo "$prt_conf" | tee "$file_ports" http_site_conf="$(cat "$file_http_site")" http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")" echo "$http_site_conf_2" | tee "$file_http_site" https_site_conf="$(cat "$file_https_site")" https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")" echo "$https_site_conf_2" | tee "$file_https_site" systemctl restart apache2 touch /etc/startup_script_completed'
在每个可用区中创建两个非代管实例组:
gcloud compute instance-groups unmanaged create ig-a \ --zone=us-west1-a gcloud compute instance-groups unmanaged create ig-c \ --zone=us-west1-c
将虚拟机添加到相应的实例组中:
gcloud compute instance-groups unmanaged add-instances ig-a \ --zone=us-west1-a \ --instances=vm-a1,vm-a2 gcloud compute instance-groups unmanaged add-instances ig-c \ --zone=us-west1-c \ --instances=vm-c1,vm-c2
API
对于 4 个虚拟机,请使用以下虚拟机名称和区域:
VM-NAME
:vm-a1
,ZONE
:us-west1-a
VM-NAME
:vm-a2
,ZONE
:us-west1-a
VM-NAME
:vm-c1
,ZONE
:us-west1-c
VM-NAME
:vm-c2
,ZONE
:us-west1-c
您可以通过运行以下 gcloud
命令来获取当前 DEBIAN_IMAGE_NAME
:
gcloud compute images list \ --filter="family=debian-10"
向 instances.insert
方法发出四个 POST
请求,以创建四个后端虚拟机:
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances { "name": "VM-NAME", "tags": { "items": [ "allow-health-check-ipv6", "allow-ssh" ] }, "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/[ZONE]/machineTypes/e2-standard-2", "canIpForward": false, "networkInterfaces": [ { "stackType": "IPV4_IPV6", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet", "accessConfigs": [ { "type": "ONE_TO_ONE_NAT", "name": "external-nat", "networkTier": "PREMIUM" } ] } ], "disks": [ { "type": "PERSISTENT", "boot": true, "mode": "READ_WRITE", "autoDelete": true, "deviceName": "VM-NAME", "initializeParams": { "sourceImage": "projects/debian-cloud/global/images/debian-image-name", "diskType": "projects/PROJECT_ID/zones/zone/diskTypes/pd-standard", "diskSizeGb": "10" } } ], "metadata": { "items": [ { "key": "startup-script", "value": "#! /bin/bash\napt-get update\napt-get install apache2 -y\na2ensite default-ssl\na2enmod ssl\nfile_ports=\"/etc/apache2/ports.conf\"\nfile_http_site=\"/etc/apache2/sites-available/000-default.conf\"\nfile_https_site=\"/etc/apache2/sites-available/default-ssl.conf\"\nhttp_listen_prts=\"Listen 80\\nListen 8008\\nListen 8080\\nListen 8088\"\nhttp_vh_prts=\"*:80 *:8008 *:8080 *:8088\"\nhttps_listen_prts=\"Listen 443\\nListen 8443\"\nhttps_vh_prts=\"*:443 *:8443\"\nvm_hostname=\"$(curl -H \"Metadata-Flavor:Google\" \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\necho \"Page served from: $vm_hostname\" | \\\ntee /var/www/html/index.html\nprt_conf=\"$(cat \"$file_ports\")\"\nprt_conf_2=\"$(echo \"$prt_conf\" | sed \"s|Listen 80|${http_listen_prts}|\")\"\nprt_conf=\"$(echo \"$prt_conf_2\" | sed \"s|Listen 443|${https_listen_prts}|\")\"\necho \"$prt_conf\" | tee \"$file_ports\"\nhttp_site_conf=\"$(cat \"$file_http_site\")\"\nhttp_site_conf_2=\"$(echo \"$http_site_conf\" | sed \"s|*:80|${http_vh_prts}|\")\"\necho \"$http_site_conf_2\" | tee \"$file_http_site\"\nhttps_site_conf=\"$(cat \"$file_https_site\")\"\nhttps_site_conf_2=\"$(echo \"$https_site_conf\" | sed \"s|_default_:443|${https_vh_prts}|\")\"\necho \"$https_site_conf_2\" | tee \"$file_https_site\"\nsystemctl restart apache2" } ] }, "scheduling": { "preemptible": false }, "deletionProtection": false }
向 instanceGroups.insert
方法发出一个 POST
请求,以创建两个实例组。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups { "name": "ig-a", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet" }
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instanceGroups { "name": "ig-c", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet" }
向 instanceGroups.addInstances
方法发出一个 POST
请求,为每个实例组添加实例。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups/ig-a/addInstances { "instances": [ { "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances/vm-a1", "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances/vm-a2" } ] }
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instanceGroups/ig-c/addInstances { "instances": [ { "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instances/vm-c1", "instance": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instances/vm-c2" } ] }
配置负载均衡器组件
以下步骤会配置所有内部直通式网络负载均衡器组件,先配置健康检查和后端服务,然后配置前端组件:
健康检查:在此示例中,您使用检查 HTTP
200
(OK) 响应的 HTTP 健康检查。如需了解详情,请参阅内部直通式网络负载均衡器概览的健康检查部分。后端服务:由于您需要通过内部负载均衡器传递 HTTP 流量,因此需要使用 TCP,而不是 UDP。
转发规则:此示例为 IPv4 和 IPv6 流量创建两条内部转发规则。
内部 IP 地址:在此示例中,您在创建 IPv4 转发规则时指定了内部 IP 地址
10.1.2.99
。如需了解详情,请参阅内部 IP 地址。虽然您可以选择配置哪个 IPv4 地址,但系统会自动分配 IPv6 地址。
控制台
开始配置
在 Google Cloud 控制台中,转到负载均衡页面。
- 点击创建负载均衡器。
- 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步。
- 对于代理或直通,选择直通式负载均衡器,然后点击下一步。
- 在公共或内部字段中,选择内部,然后点击下一步。
- 点击配置。
基本配置
在创建内部直通网络负载均衡器页面上,输入以下信息:
- 负载均衡器名称:
be-ilb
- 区域:
us-west1
- 网络:
lb-network-dual-stack
后端配置
- 点击后端配置。
- 在后端的新后端部分,选择 IP 栈类型作为 IPv4 和 IPv6(双栈)。
- 在实例组中,选择
ig-a
实例组,然后点击完成。 - 点击添加后端,然后重复此步骤来添加
ig-c
。 - 从健康检查列表中,选择创建健康检查,输入以下信息,然后点击保存:
- 名称:
hc-http-80
。 - 范围:区域级。
- 协议:
HTTP
。 - 端口:
80
。 - 代理协议:
NONE
。 - 请求路径:
/
。
- 名称:
- 验证后端配置旁边是否显示了蓝色对勾标记。
前端配置
- 点击前端配置。在新建前端 IP 和端口部分,执行以下操作:
- 对于名称,输入
fr-ilb-ipv6
。 - 如需处理 IPv6 流量,请执行以下操作:
- 对于 IP 版本,请选择 IPv6。
- 对于子网,选择
lb-subnet
。 转发规则中的 IPv6 地址范围始终具有临时性。 - 对于端口,选择多个,然后在端口号字段中输入
80
、8008
、8080
、8088
。 - 点击完成。
- 如需处理 IPv4 流量,请执行以下操作:
- 点击添加前端 IP 和端口。
- 对于名称,输入
fr-ilb
。 - 对于子网,选择
lb-subnet
。 - 在内部 IP 用途部分的 IP 地址列表中,选择创建 IP 地址,输入以下信息,然后点击预留。
- 名称:
ip-ilb
- IP 版本:IPv4。
- 静态 IP 地址:让我选择
- 自定义 IP 地址:
10.1.2.99
- 名称:
- 对于端口,选择多个,然后在端口号中输入
80
、8008
、8080
和8088
。 - 点击完成。
- 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。
- 对于名称,输入
检查配置
- 点击检查并最终确定。检查所有设置。
- 如果设置正确,请点击创建。创建内部直通式网络负载均衡器需要几分钟时间。
gcloud
创建一个新的区域性 HTTP 健康检查,以测试端口 80 上的虚拟机的 HTTP 连接。
gcloud compute health-checks create http hc-http-80 \ --region=us-west1 \ --port=80
为 HTTP 流量创建后端服务:
gcloud compute backend-services create be-ilb \ --load-balancing-scheme=internal \ --protocol=tcp \ --region=us-west1 \ --health-checks=hc-http-80 \ --health-checks-region=us-west1
将两个实例组添加到后端服务:
gcloud compute backend-services add-backend be-ilb \ --region=us-west1 \ --instance-group=ig-a \ --instance-group-zone=us-west1-a gcloud compute backend-services add-backend be-ilb \ --region=us-west1 \ --instance-group=ig-c \ --instance-group-zone=us-west1-c
为后端服务创建两条转发规则。创建 IPv4 转发规则时,请指定
10.1.2.99
作为 IPv4 地址的子网中的内部 IP 地址。gcloud compute forwarding-rules create fr-ilb \ --region=us-west1 \ --load-balancing-scheme=internal \ --subnet=lb-subnet \ --address=10.1.2.99 \ --ip-protocol=TCP \ --ports=80,8008,8080,8088 \ --backend-service=be-ilb \ --backend-service-region=us-west1
gcloud compute forwarding-rules create fr-ilb-ipv6 \ --region=us-west1 \ --load-balancing-scheme=internal \ --subnet=lb-subnet \ --ip-protocol=TCP \ --ports=80,8008,8080,8088 \ --backend-service=be-ilb \ --backend-service-region=us-west1 \ --ip-version=IPV6
api
向 regionHealthChecks.insert
方法发出 POST
请求,以创建健康检查。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/regionHealthChecks { "name": "hc-http-80", "type": "HTTP", "httpHealthCheck": { "port": 80 } }
向 regionBackendServices.insert
方法发出 POST
请求,以创建区域后端服务。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices { "name": "be-ilb", "backends": [ { "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instanceGroups/ig-a", "balancingMode": "CONNECTION" }, { "group": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-c/instanceGroups/ig-c", "balancingMode": "CONNECTION" } ], "healthChecks": [ "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/healthChecks/hc-http-80" ], "loadBalancingScheme": "INTERNAL", "connectionDraining": { "drainingTimeoutSec": 0 } }
向 forwardingRules.insert
方法发出 POST
请求,以创建转发规则。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules { "name": "fr-ilb-ipv6", "IPProtocol": "TCP", "ports": [ "80", "8008", "8080", "8088" ], "loadBalancingScheme": "INTERNAL", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet", "backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb", "ipVersion": "IPV6", "networkTier": "PREMIUM" }
向 forwardingRules.insert
方法发出 POST
请求,以创建转发规则。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules { "name": "fr-ilb", "IPAddress": "10.1.2.99", "IPProtocol": "TCP", "ports": [ "80", "8008", "8080", "8088" ], "loadBalancingScheme": "INTERNAL", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet", "backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb", "networkTier": "PREMIUM" }
测试负载均衡器
如需测试负载均衡器,请在负载均衡器所在的区域中创建客户端虚拟机,然后将流量从客户端发送到负载均衡器。
创建客户端虚拟机
此示例在后端(服务器)虚拟机所在的同一区域创建一个客户端虚拟机 (vm-client
)。该客户端用于验证负载均衡器的配置,并演示测试部分中所述的预期行为。
控制台
在 Google Cloud 控制台中,转到虚拟机实例页面。
点击创建实例。
对于名称,输入
vm-client
。对于区域,请选择
us-west1
。对于可用区,请选择
us-west1-a
。点击高级选项。
点击网络并配置以下字段:
- 对于网络标记,请输入
allow-ssh
。 - 对于网络接口,请选择以下内容:
- 网络:
lb-network-dual-stack
- 子网:
lb-subnet
- IP 栈类型:IPv4 和 IPv6(双栈)
- 主要内部 IP:临时(自动)
- 外部 IP:临时
- 网络:
- 点击完成。
- 对于网络标记,请输入
点击创建。
gcloud
客户端虚拟机可以位于负载均衡器所在的同一区域的任何可用区中,并且可以使用该区域中的任何子网。在此示例中,客户端位于 us-west1-a
可用区,并使用与后端虚拟机相同的子网。
gcloud compute instances create vm-client \ --zone=us-west1-a \ --image-family=debian-10 \ --image-project=debian-cloud \ --stack-type=IPV4_IPV6 \ --tags=allow-ssh \ --subnet=lb-subnet
api
向 instances.insert
方法发出 POST
请求。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances { "name": "vm-client", "tags": { "items": [ "allow-ssh" ] }, "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/machineTypes/e2-standard-2", "canIpForward": false, "networkInterfaces": [ { "stackType": "IPV4_IPV6", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network-dual-stack", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet", "accessConfigs": [ { "type": "ONE_TO_ONE_NAT", "name": "external-nat", "networkTier": "PREMIUM" } ] } ], "disks": [ { "type": "PERSISTENT", "boot": true, "mode": "READ_WRITE", "autoDelete": true, "deviceName": "vm-client", "initializeParams": { "sourceImage": "projects/debian-cloud/global/images/debian-image-name", "diskType": "projects/PROJECT_ID/zones/us-west1-a/diskTypes/pd-standard", "diskSizeGb": "10" } } ], "scheduling": { "preemptible": false }, "deletionProtection": false }
测试连接
此测试通过单独的客户端虚拟机连接负载均衡器;也就是说,并非使用负载均衡器的后端虚拟机。预期的行为是流量在 4 个后端虚拟机之间分配。
连接到客户端虚拟机实例。
gcloud compute ssh vm-client --zone=us-west1-a
描述 IPv6 转发规则
fr-ilb-ipv6
。请注意说明中的IPV6_ADDRESS
。gcloud compute forwarding-rules describe fr-ilb-ipv6 --region=us-west1
描述 IPv4 转发规则
fr-ilb
。gcloud compute forwarding-rules describe fr-ilb --region=us-west1
从具有 IPv6 连接的客户端,运行以下命令:
$ curl -m 10 -s http://IPV6_ADDRESS:80
比方说,如果分配的 IPv6 地址为
[fd20:1db0:b882:802:0:46:0:0/96]:80
,则该命令应如下所示:$ curl -m 10 -s http://[fd20:1db0:b882:802:0:46:0:0]:80
从具有 IPv4 连接的客户端,运行以下命令:
$ curl -m 10 -s http://10.1.2.99:80
请将占位符替换为有效值:
IPV6_ADDRESS
是fr-ilb-ipv6
转发规则中的临时 IPv6 地址。
其他配置选项
本部分对配置示例进行了扩展,并提供了一些其他替代配置选项。所有任务均为可选任务。 您可以按任意顺序执行这些任务。
启用全球访问权限
您可以为示例内部直通式网络负载均衡器启用全球访问权限,以使其可供所有区域的客户端访问。示例负载均衡器的后端仍必须位于一个区域 (us-west1
) 中。
如需配置全球访问权限,请更改以下配置。
控制台
修改负载均衡器的转发规则
在 Google Cloud 控制台中,转到负载均衡页面。
在名称列中,点击您的内部直通式网络负载均衡器。示例负载均衡器名为
be-ilb
。点击前端配置。
点击修改
。在全球访问权限下,选择启用。
点击完成。
点击更新。
在负载均衡器详情页面上,验证前端配置是否显示具有全球访问权限的区域 (REGION
)。
gcloud
更新示例负载均衡器的转发规则
fr-ilb
以添加--allow-global-access
标志。gcloud compute forwarding-rules update fr-ilb \ --region=us-west1 \ --allow-global-access
您可以使用
forwarding-rules describe
命令来确定转发规则是否启用了全球访问权限。例如:gcloud compute forwarding-rules describe fr-ilb \ --region=us-west1 \ --format="get(name,region,allowGlobalAccess)"
启用全球访问权限后,在输出中转发规则的名称和地区之后会出现
True
一词。
API
向 forwardingRules/patch
方法发出 PATCH
请求。
PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr-ilb { "allowGlobalAccess": true }
创建虚拟机客户端以测试全球访问权限
控制台
在 Google Cloud 控制台中,转到虚拟机实例页面。
点击创建实例。
将名称设置为
vm-client2
。将区域设置为
europe-west1
。将可用区设置为
europe-west1-b
。点击高级选项。
点击网络并配置以下字段:
- 对于网络标记,请输入
allow-ssh
。 - 对于网络接口,请选择以下内容:
- 网络:
lb-network
- 子网:
europe-subnet
- 网络:
- 对于网络标记,请输入
点击创建。
gcloud
客户端虚拟机可以位于负载均衡器所在的同一区域的任何可用区中,并且可以使用该区域中的任何子网。在此示例中,客户端位于 europe-west1-b
区域,并使用与后端虚拟机相同的子网。
gcloud compute instances create vm-client2 \ --zone=europe-west1-b \ --image-family=debian-10 \ --image-project=debian-cloud \ --tags=allow-ssh \ --subnet=europe-subnet
API
向 instances.insert
方法发出 POST
请求。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/europe-west1-b/instances { "name": "vm-client2", "tags": { "items": [ "allow-ssh" ] }, "machineType": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/europe-west1-b/machineTypes/e2-standard-2", "canIpForward": false, "networkInterfaces": [ { "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/europe-west1/subnetworks/europe-subnet", "accessConfigs": [ { "type": "ONE_TO_ONE_NAT", "name": "external-nat", "networkTier": "PREMIUM" } ] } ], "disks": [ { "type": "PERSISTENT", "boot": true, "mode": "READ_WRITE", "autoDelete": true, "deviceName": "vm-client2", "initializeParams": { "sourceImage": "projects/debian-cloud/global/images/debian-image-name", "diskType": "projects/PROJECT_ID/zones/europe-west1-b/diskTypes/pd-standard", "diskSizeGb": "10" } } ], "scheduling": { "preemptible": false }, "deletionProtection": false }
连接到虚拟机客户端并测试连接
如需测试连接,请运行以下命令:
gcloud compute ssh vm-client2 --zone=europe-west1-b
您可以在所有已配置的端口上测试到负载均衡器的连接,方法与从 us-west1
区域中的 vm-client
进行连接时相同。在转发规则中配置的四个端口上测试 HTTP 连接:
curl http://10.1.2.99 curl http://10.1.2.99:8008 curl http://10.1.2.99:8080 curl http://10.1.2.99:8088
配置托管式实例组
示例配置创建了两个非代管实例组。您也可以将代管式实例组(包括可用区级和区域级代管式实例组)用作内部直通式网络负载均衡器的后端。
代管实例组要求您创建实例模板。此过程演示了如何使用单个区域级代管实例组替换示例中的两个可用区级非代管式实例组。区域代管实例组会自动在区域内的多个可用区中创建虚拟机,以便更轻松地在可用区之间分布生产流量。
代管实例组还支持自动扩缩和自动修复。如果您将自动扩缩和内部直通式网络负载均衡器搭配使用,则无法基于负载均衡进行扩缩。
此过程展示了如何修改示例内部直通式网络负载均衡器的后端服务,使其使用区域代管式实例组。
控制台
实例模板
在 Google Cloud 控制台中,转到虚拟机实例模板页面。
点击创建实例模板。
将名称设置为
template-vm-ilb
。选择机器类型。
在启动磁盘部分中,确保为启动磁盘选项选择了 Debian 操作系统和 10 (Buster) 版本。如有必要,请点击更改以更改映像。
点击高级选项。
点击网络并配置以下字段:
- 对于网络标记,请输入
allow-ssh
和allow-health-check
。 - 对于网络接口,请选择以下内容:
- 网络:
lb-network
- 子网:
lb-subnet
- 网络:
- 对于网络标记,请输入
点击管理,然后在启动脚本字段中输入以下脚本:
#! /bin/bash if [ -f /etc/startup_script_completed ]; then exit 0 fi apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl file_ports="/etc/apache2/ports.conf" file_http_site="/etc/apache2/sites-available/000-default.conf" file_https_site="/etc/apache2/sites-available/default-ssl.conf" http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088" http_vh_prts="*:80 *:8008 *:8080 *:8088" https_listen_prts="Listen 443\nListen 8443" https_vh_prts="*:443 *:8443" 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 prt_conf="$(cat "$file_ports")" prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")" prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")" echo "$prt_conf" | tee "$file_ports" http_site_conf="$(cat "$file_http_site")" http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")" echo "$http_site_conf_2" | tee "$file_http_site" https_site_conf="$(cat "$file_https_site")" https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")" echo "$https_site_conf_2" | tee "$file_https_site" systemctl restart apache2 touch /etc/startup_script_completed
点击创建。
代管实例组
gcloud
创建实例模板。您也可以为要使用的映像模版设置其他参数,如机器类型。
gcloud compute instance-templates create template-vm-ilb \ --image-family=debian-10 \ --image-project=debian-cloud \ --tags=allow-ssh,allow-health-check \ --subnet=lb-subnet \ --region=us-west1 \ --network=lb-network \ --metadata=startup-script='#! /bin/bash if [ -f /etc/startup_script_completed ]; then exit 0 fi apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl file_ports="/etc/apache2/ports.conf" file_http_site="/etc/apache2/sites-available/000-default.conf" file_https_site="/etc/apache2/sites-available/default-ssl.conf" http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088" http_vh_prts="*:80 *:8008 *:8080 *:8088" https_listen_prts="Listen 443\nListen 8443" https_vh_prts="*:443 *:8443" 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 prt_conf="$(cat "$file_ports")" prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")" prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")" echo "$prt_conf" | tee "$file_ports" http_site_conf="$(cat "$file_http_site")" http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")" echo "$http_site_conf_2" | tee "$file_http_site" https_site_conf="$(cat "$file_https_site")" https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")" echo "$https_site_conf_2" | tee "$file_https_site" systemctl restart apache2 touch /etc/startup_script_completed'
使用模板创建一个区域代管实例组:
gcloud compute instance-groups managed create ig-ilb \ --template=template-vm-ilb \ --region=us-west1 \ --size=6
将区域代管式实例组作为后端添加到您已创建的后端服务:
gcloud compute backend-services add-backend be-ilb \ --region=us-west1 \ --instance-group=ig-ilb \ --instance-group-region=us-west1
断开两个非代管(可用区)实例组与后端服务的连接:
gcloud compute backend-services remove-backend be-ilb \ --region=us-west1 \ --instance-group=ig-a \ --instance-group-zone=us-west1-a gcloud compute backend-services remove-backend be-ilb \ --region=us-west1 \ --instance-group=ig-c \ --instance-group-zone=us-west1-c
从后端虚拟机中移除外部 IP 地址
当您创建后端虚拟机时,系统会为每个虚拟机分配一个临时外部 IP 地址,以便其使用启动脚本下载 Apache。由于后端虚拟机仅供内部直通式网络负载均衡器使用,因此您可以移除其外部 IP 地址。移除外部 IP 地址可防止后端虚拟机直接访问互联网。
控制台
在 Google Cloud 控制台中,转到虚拟机实例页面。
对每个后端虚拟机重复以下步骤。
点击后端虚拟机的名称,例如
vm-a1
。点击
修改。在网络接口部分中,点击网络。
从外部 IP 列表中,选择无,然后点击完成。
点击保存。
gcloud
如需查询实例的可用区(例如,如果您使用的是区域代管实例组),请为每个实例运行以下命令以确定其所在可用区。将
[SERVER-VM]
替换为要查询的虚拟机的名称。gcloud compute instances list --filter="name=[SERVER-VM]"
对每个后端虚拟机重复执行以下步骤。将
[SERVER-VM]
替换为虚拟机的名称,并将[ZONE]
替换为虚拟机所在的区域。gcloud compute instances delete-access-config [SERVER-VM] \ --zone=[ZONE] \ --access-config-name=external-nat
API
针对每个后端虚拟机向 instances.deleteAccessConfig
方法发出 POST
请求,并将 vm-a1
和 us-west1-a
分别替换为虚拟机的名称和虚拟机所在的区域。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-west1-a/instances/vm-a1/deleteAccessConfig?accessConfig=external-nat&networkInterface=None
使用预留的内部 IP 地址
当您创建后端虚拟机和实例组时,该虚拟机实例使用临时内部 IPv4 或 IPv6 地址。
以下步骤展示了如何将内部 IPv4 或 IPv6 地址提升为静态内部 IPv4 或 IPv6 地址,然后将虚拟机实例更新为使用静态内部 IP 地址:
或者,以下步骤展示了如何预留新的静态内部 IPv4 或 IPv6 地址,然后更新虚拟机实例以使用该静态内部 IP 地址:
-
与内部 IPv4 预留不同,内部 IPv6 预留不支持预留子网中的特定 IP 地址。系统会自动从子网的
/64
内部 IPv6 地址范围中分配/96
内部 IPv6 地址范围。
如需了解详情,请参阅如何预留静态内部 IP 地址。
接受所有端口上的流量
负载均衡器的转发规则(而不是其后端服务)决定着负载均衡器接受哪些端口上的流量。如需了解每个组件的用途,请参阅组件。
在创建此示例负载均衡器的转发规则时,请配置端口 80
、8008
、8080
和 8088
。安装 Apache 的启动脚本还会将其配置为接受端口 443
和 8443
上的 HTTPS 连接。
为了支持这 6 个端口,您可以将转发规则配置为接受所有端口上的流量。借助此策略,您还可以配置一条或多条允许到后端虚拟机的传入连接的防火墙规则,以便仅允许特定端口。
此过程演示了如何删除负载均衡器的当前转发规则,然后创建接受所有端口上的流量的新转发规则。
如需详细了解何时使用此设置,请参阅内部直通式网络负载均衡器及共用 IP 地址的转发规则。
控制台
删除转发规则并创建新的转发规则
在 Google Cloud 控制台中,转到负载均衡页面。
点击
be-ilb
负载均衡器,然后点击修改。点击前端配置。
将鼠标指针放在
10.1.2.9
转发规则上,然后点击 删除。点击添加前端 IP 和端口。
在新建前端 IP 和端口部分,输入以下信息,然后点击完成:
- 名称:
fr-ilb
- 子网:
lb-subnet
- 内部 IP:
ip-ilb
- 端口:所有。
- 名称:
请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。
点击检查并最终确定,然后查看您的负载均衡器配置设置。
点击创建。
gcloud
删除现有的转发规则
fr-ilb
。gcloud compute forwarding-rules delete fr-ilb \ --region=us-west1
创建具有相同名称的替换转发规则,其端口配置使用关键字
ALL
。此转发规则的其他参数与之前相同。gcloud compute forwarding-rules create fr-ilb \ --region=us-west1 \ --load-balancing-scheme=internal \ --network=lb-network \ --subnet=lb-subnet \ --address=10.1.2.99 \ --ip-protocol=TCP \ --ports=ALL \ --backend-service=be-ilb \ --backend-service-region=us-west1
API
向 forwardingRules.delete
方法发出 DELETE
请求,以删除转发规则。
DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr-ilb
向 forwardingRules.insert
方法发出 POST
请求,以创建转发规则。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules { "name": "fr-ilb", "IPAddress": "10.1.2.99", "IPProtocol": "TCP", "allPorts": true, "loadBalancingScheme": "INTERNAL", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb", "networkTier": "PREMIUM" }
测试所有端口设置的流量
您可以连接到客户端虚拟机实例并测试 HTTP 和 HTTPS 连接。
连接到客户端虚拟机:
gcloud compute ssh vm-client --zone=us-west1-a
在所有四个端口上测试 HTTP 连接:
curl http://10.1.2.99 curl http://10.1.2.99:8008 curl http://10.1.2.99:8080 curl http://10.1.2.99:8088
在端口
443
和8443
上测试 HTTPS 连接。必须使用--insecure
标志,因为示例设置中的每个 Apache 服务器均使用自签名证书。curl https://10.1.2.99 --insecure curl https://10.1.2.99:8443 --insecure
测试结果显示,HTTP 请求(在所有四个端口上)和 HTTPS 请求(在两个端口上)分布在所有后端虚拟机中。
使用两条转发规则接受多个端口上的流量
在创建此示例负载均衡器的转发规则时,请配置端口 80
、8008
、8080
和 8088
。安装 Apache 的启动脚本还会将其配置为接受端口 443
和 8443
上的 HTTPS 连接。
如需配置单条转发规则以接受所有端口上的流量,一种替代策略是创建多条转发规则,每条转发规则最多支持五个端口。
此过程演示了如何将示例负载均衡器的转发规则替换为两条转发规则,即一条转发规则处理端口 80
、8008
、8080
和 8088
上的流量,另一条转发规则处理端口 443
和 8443
上的流量。
如需详细了解何时使用此设置,请参阅内部直通式网络负载均衡器及共用 IP 地址的转发规则。
控制台
在 Google Cloud 控制台中,转到转发规则页面。
在名称列中,点击
fr-ilb
,然后点击删除。在 Google Cloud 控制台中,转到负载均衡页面。
在名称列中,点击
be-ilb
。点击修改。
点击前端配置。
点击添加前端 IP 和端口。
在新建前端 IP 和端口部分,执行以下操作:
- 对于名称,输入
fr-ilb-http
。 - 对于子网,选择
lb-subnet
。 - 对于内部 IP 用途,请选择共享。
- 在 IP 地址列表中,选择创建 IP 地址,输入以下信息,然后点击预留:
- 名称:
internal-10-1-2-99
- 静态 IP 地址:让我选择
- 自定义 IP 地址:
10.1.2.99
- 名称:
- 对于端口,选择多个,然后在端口号中输入
80
、8008
、8080
和8088
。 - 点击完成。
- 对于名称,输入
点击添加前端 IP 和端口。
在新建前端 IP 和端口部分,执行以下操作:
- 对于名称,输入
fr-ilb-https
。 - 对于子网,选择
lb-subnet
。 - 对于内部 IP 用途,请选择共享。
- 从 IP 地址列表中,选择
internal-10-1-2-99
。 - 对于端口,选择多个,然后在端口号中输入
443
和8443
。 - 点击完成。
- 对于名称,输入
点击检查并最终确定,然后检查您的负载均衡器配置设置。
点击更新。
gcloud
删除现有的转发规则
fr-ilb
。gcloud compute forwarding-rules delete fr-ilb \ --region=us-west1
为
10.1.2.99
创建静态(预留)内部 IP 地址,并将其--purpose
标志设置为SHARED_LOADBALANCER_VIP
。必须使用--purpose
标志,这样两条内部转发规则才能使用同一内部 IP 地址。gcloud compute addresses create internal-10-1-2-99 \ --region=us-west1 \ --subnet=lb-subnet \ --addresses=10.1.2.99 \ --purpose=SHARED_LOADBALANCER_VIP
- 使用以下参数创建两条替换转发规则:
gcloud compute forwarding-rules create fr-ilb-http \ --region=us-west1 \ --load-balancing-scheme=internal \ --network=lb-network \ --subnet=lb-subnet \ --address=10.1.2.99 \ --ip-protocol=TCP \ --ports=80,8008,8080,8088 \ --backend-service=be-ilb \ --backend-service-region=us-west1
gcloud compute forwarding-rules create fr-ilb-https \ --region=us-west1 \ --load-balancing-scheme=internal \ --network=lb-network \ --subnet=lb-subnet \ --address=10.1.2.99 \ --ip-protocol=TCP \ --ports=443,8443 \ --backend-service=be-ilb \ --backend-service-region=us-west1
API
向 forwardingRules.delete
方法发出 DELETE
请求,以删除转发规则。
DELETE https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules/fr-ilb
向 addresses.insert
方法发出 POST
请求,以为 10.1.2.99
创建静态(预留)内部 IP 地址并将其用途设为 SHARED_LOADBALANCER_VIP
。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/addresses { "name": "internal-10-1-2-99", "address": "10.1.2.99", "prefixLength": 32, "addressType": INTERNAL, "purpose": SHARED_LOADBALANCER_VIP, "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet" }
向 forwardingRules.insert
方法发出两个 POST
请求,以创建两条转发规则。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules { "name": "fr-ilb-http", "IPAddress": "10.1.2.99", "IPProtocol": "TCP", "ports": [ "80", "8008", "8080", "8088" ], "loadBalancingScheme": "INTERNAL", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb", "networkTier": "PREMIUM" }
{ "name": "fr-ilb-https", "IPAddress": "10.1.2.99", "IPProtocol": "TCP", "ports": [ "443", "8443" ], "loadBalancingScheme": "INTERNAL", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb", "networkTier": "PREMIUM" }
测试多个端口设置的流量
您可以连接到客户端虚拟机实例并测试 HTTP 和 HTTPS 连接。
连接到客户端虚拟机:
gcloud compute ssh vm-client --zone=us-west1-a
在所有四个端口上测试 HTTP 连接:
curl http://10.1.2.99 curl http://10.1.2.99:8008 curl http://10.1.2.99:8080 curl http://10.1.2.99:8088
在端口
443
和8443
上测试 HTTPS 连接。必须使用--insecure
标志,因为示例设置中的每个 Apache 服务器均使用自签名证书。curl https://10.1.2.99 --insecure curl https://10.1.2.99:8443 --insecure
测试结果显示,HTTP 请求(在所有四个端口上)和 HTTPS 请求(在两个端口上)分布在所有后端虚拟机中。
使用会话亲和性
示例配置创建的后端服务没有会话粘性。
此过程演示了如何根据从客户端的 IP 地址和负载均衡器内部转发规则的 IP 地址创建的哈希值,更新示例内部直通式网络负载均衡器的后端服务以使其使用会话亲和性。
如需了解支持的会话亲和性类型,请参阅会话亲和性选项。
控制台
在 Google Cloud 控制台中,转到负载均衡页面。
点击 be-ilb(您为此示例创建的后端服务的名称),然后点击修改。
在修改内部直通式网络负载均衡器页面上,点击后端配置。
从会话亲和性列表中,选择客户端 IP。
点击更新。
gcloud
使用以下 gcloud
命令更新 be-ilb
后端服务,并指定客户端 IP 会话亲和性:
gcloud compute backend-services update be-ilb \ --region=us-west1 \ --session-affinity CLIENT_IP
API
向 regionBackendServices/patch
方法发出 PATCH
请求。
PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb { "sessionAffinity": "CLIENT_IP" }
配置连接跟踪政策
本部分介绍如何更新后端服务以更改负载均衡器的默认连接跟踪政策。
连接跟踪政策包括以下设置:
gcloud
使用以下 gcloud compute
backend-services
命令更新后端服务的连接跟踪政策:
gcloud compute backend-services update BACKEND_SERVICE \ --region=REGION \ --tracking-mode=TRACKING_MODE \ --connection-persistence-on-unhealthy-backends=CONNECTION_PERSISTENCE_BEHAVIOR \ --idle-timeout-sec=IDLE_TIMEOUT_VALUE
请将占位符替换为有效值:
BACKEND_SERVICE
:您要更新的后端服务REGION
:您要更新的后端服务的区域TRACKING_MODE
:用于传入数据包的连接跟踪模式;如需查看受支持值的列表,请参阅跟踪模式CONNECTION_PERSISTENCE_BEHAVIOR
:后端运行状况不佳时的连接持久性行为;如需查看受支持值的列表,请参阅运行状况不佳的后端上的连接持久性IDLE_TIMEOUT_VALUE
:在负载均衡器处理与条目匹配的最后一个数据包后,必须保持连接跟踪表条目的秒数仅当连接跟踪小于 5 元组时(即当会话亲和性配置为:
CLIENT_IP
或CLIENT_IP_PROTO
,并且跟踪模式为PER_SESSION
时),才能修改此属性。默认值为 600 秒(10 分钟)。最大可配置空闲超时值为 57600 秒(16 小时)。
在其他子网中创建转发规则
此过程会在另一个子网中创建第二个 IP 地址和转发规则,以证明您可以为一个内部直通式网络负载均衡器创建多个转发规则。转发规则的区域必须与后端服务的区域一致。
根据防火墙规则,区域内任何子网中的客户端都可以连接任一内部直通式网络负载均衡器 IP 地址。
控制台
添加第二个子网
在 Google Cloud 控制台中,转到 VPC 网络页面。
点击创建 VPC 网络。
点击
lb-network
。在子网部分中,执行以下操作:
- 点击添加子网。
- 在新子网部分中,输入以下信息:
- 名称:
second-subnet
- 区域:
us-west1
- IP 地址范围:
10.5.6.0/24
- 名称:
- 点击添加。
添加第二条转发规则
在 Google Cloud 控制台中,转到负载均衡页面。
点击
be-ilb
负载均衡器,然后点击修改。点击前端配置。
点击添加前端 IP 和端口。
在新建前端 IP 和端口部分,设置以下字段,然后点击完成:
- 名称:
fr-ilb-2
- IP 版本:IPv4。
- 子网:
second-subnet
- 内部 IP:
ip-ilb
- 端口:
80
和443
- 名称:
请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。
点击检查并最终确定,然后检查您的负载均衡器配置设置。
点击创建。
gcloud
在
us-west1
区域的lb-network
网络中创建第二个子网:gcloud compute networks subnets create second-subnet \ --network=lb-network \ --range=10.5.6.0/24 \ --region=us-west1
为端口 80 和 443 创建第二个转发规则。此规则的其他参数(包括 IP 地址和后端服务)均与主转发规则
fr-ilb
相同。gcloud compute forwarding-rules create fr-ilb-2 \ --region=us-west1 \ --load-balancing-scheme=internal \ --network=lb-network \ --subnet=second-subnet \ --address=10.5.6.99 \ --ip-protocol=TCP \ --ports=80,443 \ --backend-service=be-ilb \ --backend-service-region=us-west1
API
向 subnetworks.insert
方法发出 POST
请求。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks { "name": "second-subnet", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "ipCidrRange": "10.5.6.0/24", "privateIpGoogleAccess": false }
向 forwardingRules.insert
方法发出 POST
请求,以创建转发规则。
POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/forwardingRules { "name": "fr-ilb-2", "IPAddress": "10.5.6.99", "IPProtocol": "TCP", "ports": [ "80", "443" ], "loadBalancingScheme": "INTERNAL", "subnetwork": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/subnetworks/lb-subnet", "network": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/lb-network", "backendService": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb", "networkTier": "PREMIUM" }
测试新转发规则
您可以连接到客户端虚拟机实例并测试与 IP 地址的 HTTP 和 HTTPS 连接。
连接到客户端虚拟机:
gcloud compute ssh vm-client --zone=us-west1-a
测试与 IP 地址的 HTTP 连接:
curl http://10.1.2.99 curl http://10.5.6.99
测试 HTTPS 连接。必须使用
--insecure
,因为示例设置中的 Apache 服务器配置使用自签名证书。curl https://10.1.2.99 --insecure curl https://10.5.6.99 --insecure
测试结果显示,无论使用何种协议(HTTP 或 HTTPS)或 IP 地址,请求均由所有后端虚拟机进行处理。
使用后端子集化
示例配置创建没有子集的后端服务。
此过程说明如何为示例内部直通式网络负载均衡器的后端服务启用子集,以便部署可扩展到更多的后端实例。
当单个负载均衡器需要支持超过 250 个后端虚拟机时,才需要启用子集。
如需详细了解此使用场景,请参阅后端子集化。
gcloud
使用以下 gcloud
命令更新 be-ilb
后端服务,并指定子集化政策:
gcloud compute backend-services update be-ilb \ --subsetting-policy=CONSISTENT_HASH_SUBSETTING
API
向 regionBackendServices/patch
方法发出 PATCH
请求。
PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/us-west1/backendServices/be-ilb { "subsetting": { "policy": CONSISTENT_HASH_SUBSETTING } }
为数据包镜像创建负载均衡器
数据包镜像可让您从 VPC 中的特定实例复制和收集数据包数据。您可以利用所收集到的数据,检测安全威胁并监控应用性能。
数据包镜像需要内部直通式网络负载均衡器,以均衡传送到收集器目标实例组的流量。如需为数据包镜像创建内部直通式网络负载均衡器,请按以下步骤操作。
控制台
开始配置
在 Google Cloud 控制台中,转到负载均衡页面。
- 点击创建负载均衡器。
- 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步。
- 对于代理或直通,选择直通式负载均衡器,然后点击下一步。
- 在公共或内部字段中,选择内部,然后点击下一步。
- 点击配置。
基本配置
- 在负载均衡器名称部分,输入名称。
- 对于区域,请选择您要镜像数据包的虚拟机实例所在的区域。
- 在网络部分,选择要创建数据包镜像的网络。
- 点击后端配置。
- 在新建后端部分,对于实例组,选择要将数据包转发到的实例组。
- 从健康检查列表中,选择创建健康检查,输入以下信息,然后点击保存:
- 在名称字段中,输入健康检查的名称。
- 对于协议,请选择
HTTP
。 - 对于端口,请输入
80
。
- 点击前端配置。
- 在新建前端 IP 和端口部分,执行以下操作:
- 在名称部分,输入名称。
- 对于子网,请选择与要创建镜像的实例位于同一区域的子网。
- 对于端口,选择全部。
- 点击高级配置,然后选中启用此负载均衡器以执行数据包镜像复选框。
- 点击完成。
- 点击创建。
gcloud
创建一个新的区域级 HTTP 健康检查,以测试端口 80 上的实例组 HTTP 连接:
gcloud compute health-checks create http HEALTH_CHECK_NAME \ --region=REGION \ --port=80
请替换以下内容:
HEALTH_CHECK_NAME
:健康检查的名称。REGION
:要为其镜像数据包的虚拟机实例的区域。
为 HTTP 流量创建后端服务:
gcloud compute backend-services create COLLECTOR_BACKEND_SERVICE \ --region=REGION \ --health-checks-region=REGION \ --health-checks=HEALTH_CHECK_NAME \ --load-balancing-scheme=internal \ --protocol=tcp
请替换以下内容:
COLLECTOR_BACKEND_SERVICE
:后端服务的名称。REGION
:您要镜像数据包的虚拟机实例所在的区域。HEALTH_CHECK_NAME
:健康检查的名称。
将实例组添加到后端服务:
gcloud compute backend-services add-backend COLLECTOR_BACKEND_SERVICE \ --region=REGION \ --instance-group=INSTANCE_GROUP \ --instance-group-zone=ZONE
请替换以下内容:
COLLECTOR_BACKEND_SERVICE
:后端服务的名称。REGION
:实例组所在的区域。INSTANCE_GROUP
:实例组的名称。ZONE
:实例组所在的可用区。
为后端服务创建转发规则:
gcloud compute forwarding-rules create FORWARDING_RULE_NAME \ --region=REGION \ --network=NETWORK \ --subnet=SUBNET \ --backend-service=COLLECTOR_BACKEND_SERVICE \ --load-balancing-scheme=internal \ --ip-protocol=TCP \ --ports=all \ --is-mirroring-collector
请替换以下内容:
FORWARDING_RULE_NAME
:转发规则的名称。REGION
:转发规则的区域。NETWORK
:转发规则的网络。SUBNET
:您要镜像数据包的虚拟机所在区域中的子网。COLLECTOR_BACKEND_SERVICE
:此负载均衡器的后端服务。
后续步骤
- 如需了解重要的基础知识,请参阅内部直通式网络负载均衡器概览。
- 如需了解有关故障切换的重要信息,请参阅内部直通式网络负载均衡器的故障切换概念。
- 参阅内部负载均衡及 DNS 域名,了解可用于负载均衡器的 DNS 域名选项。
- 如需查看内部直通式网络负载均衡器故障切换配置的配置步骤和相关示例,请参阅为内部直通式网络负载均衡器配置故障切换。
- 如需了解如何为内部直通式网络负载均衡器配置日志记录和监控功能,请参阅内部直通式网络负载均衡器日志记录和监控。
- 如需了解如何从与您的 VPC 网络连接的对等互连网络访问内部直通式网络负载均衡器,请参阅内部直通式网络负载均衡器和连接的网络。
- 如需了解如何排查内部直通式网络负载均衡器的问题,请参阅内部直通式网络负载均衡器问题排查。
- 清理负载均衡器设置。