1. 简介
欢迎学习高级负载均衡优化 Codelab!
在此 Codelab 中,您将学习如何为全球外部应用负载平衡器配置高级负载均衡选项。在开始之前,建议您先查看有关 Cloud Load Balancing 的文档 ( https://cloud.google.com/load-balancing/docs/load-balancing-overview)
图 1. 使用全局外部应用负载平衡器选择目标端点的工作流。
Codelab 拓扑和用例
图 2. HTTP 负载平衡器路由拓扑
在本代码实验中,您将设置两个托管式实例组。您将创建一个全球外部 https 负载平衡器。该负载平衡器将利用基于 Envoy 的负载平衡器支持的高级功能列表中的多项功能。部署完成后,您将生成一些模拟负载,并验证您设置的配置是否正常运行。
学习内容
- 如何配置 ServiceLbPolicy 以微调负载平衡器。
所需条件
- 熟悉外部 HTTPS 负载均衡。此 Codelab 的前半部分与“带高级流量管理 (Envoy) 外部 HTTP 负载平衡器”Codelab ( https://codelabs.developers.google.com/codelabs/externalhttplb-adv) 非常相似。建议您先查看该文档。
2. 准备工作
在 Cloud Shell 中,确保已设置项目 ID
gcloud config list project gcloud config set project [YOUR-PROJECT-NAME] prodproject=YOUR-PROJECT-NAME echo $prodproject
启用 API
启用所有必要的服务
gcloud services enable compute.googleapis.com gcloud services enable logging.googleapis.com gcloud services enable monitoring.googleapis.com gcloud services enable networkservices.googleapis.com
3. 创建 VPC 网络
创建 VPC 网络
通过 Cloud Shell
gcloud compute networks create httplbs --subnet-mode=auto
输出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/httplbs]. NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 httplbs AUTO REGIONAL
创建 VPC 防火墙规则
创建 VPC 后,您现在需要创建防火墙规则。该防火墙规则将用于允许所有 IP 访问测试应用网站的外部 IP(端口 80),以便进行 HTTP 流量传输。
通过 Cloud Shell
gcloud compute firewall-rules create httplb-allow-http-rule \ --allow tcp:80 \ --network httplbs \ --source-ranges 0.0.0.0/0 \ --priority 700
输出
Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/httplb-allow-http-rule]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED httplb-allow-http-rule httplbs INGRESS 700 tcp:80 False
在此 Codelab 中,我们将调整虚拟机的运行状况。因此,我们还将创建防火墙规则以允许 SSH。
通过 Cloud Shell
gcloud compute firewall-rules create fw-allow-ssh \ --network=httplbs \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --rules=tcp:22
输出
Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/fw-allow-ssh]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED fw-allow-ssh httplbs INGRESS 1000 tcp:22 False
4. 设置托管式实例组
您需要设置包含 HTTP 负载平衡器使用的后端资源的模式的代管式实例组。首先,我们将创建实例模板,用于定义要为每个区域创建的虚拟机的配置。接下来,针对每个区域中的后端,我们将创建一个引用实例模板的托管实例组。
代管式实例组的范围可以是可用区级,也可以是区域级。在本实验练习中,我们将创建地区托管式实例组。
在本部分中,您可以看到一个预先创建的启动脚本,系统会在创建实例时引用该脚本。此启动脚本会安装并启用 Web 服务器功能,我们将使用这些功能来模拟 Web 应用。您可以随时查看此脚本。
创建实例模板
第一步是创建实例模板。
通过 Cloud Shell
gcloud compute instance-templates create test-template \ --network=httplbs \ --tags=allow-ssh,http-server \ --image-family=debian-9 \ --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://169.254.169.254/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
输出
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP test-template n1-standard-1 2021-11-09T09:24:35.275-08:00
现在,您可以使用以下 gcloud 命令验证实例模板是否已成功创建:
通过 Cloud Shell
gcloud compute instance-templates list
输出
NAME MACHINE_TYPE PREEMPTIBLE CREATION_TIMESTAMP test-template n1-standard-1 2021-11-09T09:24:35.275-08:00
创建实例组
现在,我们必须根据之前创建的实例模板创建一个托管式实例组。
通过 Cloud Shell
gcloud compute instance-groups managed create us-east1-a-mig \ --size=1 \ --template=test-template \ --zone=us-east1-a
输出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instanceGroupManagers/us-east1-a-mig]. NAME LOCATION SCOPE BASE_INSTANCE_NAME SIZE TARGET_SIZE INSTANCE_TEMPLATE AUTOSCALED us-east1-a-mig us-east1-a zone us-east1-a-mig 0 1 test-template no
通过 Cloud Shell
gcloud compute instance-groups managed create us-east1-b-mig \ --size=5 \ --template=test-template \ --zone=us-east1-b
输出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-b/instanceGroupManagers/us-east1-b-mig]. NAME LOCATION SCOPE BASE_INSTANCE_NAME SIZE TARGET_SIZE INSTANCE_TEMPLATE AUTOSCALED us-east1-b-mig us-east1-b zone us-east1-b-mig 0 5 test-template no
我们可以使用以下 gcloud 命令验证实例组是否已成功创建:
通过 Cloud Shell
gcloud compute instance-groups list
输出
NAME LOCATION SCOPE NETWORK MANAGED INSTANCES us-east1-a-mig us-east1-a zone httplbs Yes 1 us-east1-b-mig us-east1-b zone httplbs Yes 5
验证 Web 服务器功能
每个实例都配置为运行 Apache Web 服务器,并使用简单的 PHP 脚本呈现如下内容:
网页提供者:us-east1-a-mig-ww2h
为确保您的 Web 服务器正常运行,请前往 Compute Engine > 虚拟机实例。确保已根据实例组定义创建了新实例(例如 us-east1-a-mig-xxx)。
现在,在浏览器中向其发出 Web 请求,以确保 Web 服务器正在运行(启动可能需要一分钟)。在 Compute Engine 下的“虚拟机实例”页面上,选择您的实例组创建的实例,然后点击其外部(公共)IP。
或者,在您的浏览器中,转到 http://<IP_Address>
5. 设置负载平衡器
创建健康检查
首先,我们必须创建一个基本健康检查,以确保我们的服务能够成功启动并正常运行。我们将创建一个基本健康检查,还可以进行更多高级自定义。
通过 Cloud Shell
gcloud compute health-checks create http http-basic-check \ --port 80
输出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/healthChecks/http-basic-check]. NAME PROTOCOL http-basic-check HTTP
预留外部 IP 地址
在此步骤中,您需要预留一个全局可用的静态 IP 地址,以便稍后将其附加到负载平衡器。
通过 Cloud Shell
gcloud compute addresses create lb-ipv4-2 \ --ip-version=IPV4 \ --global
输出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses/lb-ipv4-2].
请务必记下预留的 IP 地址。
gcloud compute addresses describe lb-ipv4-2 \ --format="get(address)" \ --global
创建后端服务
现在,我们必须为之前创建的代管式实例组创建后端服务。
通过 Cloud Shell
gcloud compute backend-services create east-backend-service \ --load-balancing-scheme=EXTERNAL_MANAGED \ --protocol=HTTP \ --port-name=http \ --health-checks=http-basic-check \ --global
输出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/east-backend-service]. NAME BACKENDS PROTOCOL east-backend-service HTTP
将 MIG 添加到后端服务
现在,我们已经创建了后端服务,接下来必须将我们之前创建的托管式实例组添加到每个后端服务。
通过 Cloud Shell
gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-a-mig --instance-group-zone us-east1-a --global
通过 Cloud Shell
gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-b-mig --instance-group-zone us-east1-b --global
您可以运行以下命令来验证后端是否已添加。
通过 Cloud Shell
gcloud compute backend-services list
输出
NAME BACKENDS PROTOCOL east-backend-service us-east1-a/instanceGroups/us-east1-a-mig,us-east1-b/instanceGroups/us-east1-b-mig HTTP
创建网址映射
现在,我们将创建一个网址映射。
gcloud compute url-maps create web-map-http \ --default-service=east-backend-service \ --global
输出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http]. NAME DEFAULT_SERVICE web-map-http backendServices/east-backend-service
创建 HTTP 前端
创建负载平衡器的最后一步是创建前端。这会将您之前预留的 IP 地址映射到您创建的负载平衡器网址映射。
通过 Cloud Shell
gcloud compute target-http-proxies create http-lb-proxy-adv \ --url-map=web-map-http
输出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetHttpProxies/http-lb-proxy-adv]. NAME URL_MAP http-lb-proxy-adv web-map-http
接下来,您需要创建一条全局转发规则,将之前预留的 IP 地址映射到 HTTP 代理。
通过 Cloud Shell
gcloud compute forwarding-rules create http-content-rule \ --load-balancing-scheme EXTERNAL_MANAGED \ --address=lb-ipv4-2 \ --global \ --target-http-proxy=http-lb-proxy-adv \ --ports=80
至此,您可以确认负载平衡器是否在使用您之前记下的 IP 地址正常运行。
6. 验证负载平衡器是否正常运行
为了验证负载均衡功能是否正常运行,您需要生成一些负载。为此,我们将创建一个新的虚拟机来模拟负载。
创建 Siege-vm
现在,您将创建用于生成负载的 siege-vm
通过 Cloud Shell
gcloud compute instances create siege-vm \ --network=httplbs \ --zone=us-east1-a \ --machine-type=e2-medium \ --tags=allow-ssh,http-server \ --metadata=startup-script='sudo apt-get -y install siege'
输出
Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instances/siege-vm]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS siege-vm us-central1-ir1 e2-medium 10.132.0.15 34.143.20.68 RUNNING
接下来,您可以通过 SSH 连接到您创建的虚拟机。创建完成后,点击 SSH 以启动一个终端并进行连接。
连接后,运行以下命令以生成负载。使用您之前为外部 HTTP 负载平衡器预留的 IP 地址。
通过 Cloud Shell
siege -c 20 http://$lb-ipv4-2
输出
New configuration template added to /home/cloudcurriculumdeveloper/.siege Run siege -C to view the current settings in that file
检查负载分布
既然 Siege 正在运行,现在就可以检查流量是否均匀地分配到了两个代管式实例组。
停止围攻
现在,您已经证明了高级流量拆分可以正常工作,是时候停止包围攻击了。为此,请返回 siege-vm 的 SSH 终端,然后按 CTRL+C 停止 siege 的运行。
7. 配置服务负载平衡器政策
创建服务负载平衡器政策
现在,基本设置已完成,我们将创建服务 Lb 政策并试用高级功能。例如,我们会将服务配置为使用一些高级负载均衡设置。在此示例中,我们只需创建一个政策来使用自动容量排空功能。不过,您可以随时试用其他功能。
通过 Cloud Shell
gcloud beta network-services service-lb-policies create http-policy \ --auto-capacity-drain --location=global
我们可以使用以下 gcloud 命令验证政策是否已成功创建:
通过 Cloud Shell
gcloud beta network-services service-lb-policies list --location=global
输出
NAME http-policy
将服务负载平衡器政策附加到后端服务
现在,我们将将新政策附加到上述现有后端服务。
通过 Cloud Shell
gcloud beta compute backend-services update east-backend-service \ --service-lb-policy=http-policy --global
8. 调整后端运行状况
至此,新的服务负载均衡政策已应用于您的后端服务。从技术上讲,您可以直接跳转到清理过程。不过,在此 Codelab 中,我们还会进行一些额外的生产环境调整,以向您展示新政策的运作方式。
当健康后端的总数低于某个阈值(25%)时,自动容量排空功能会自动从负载平衡器中移除后端 MIG。为了测试此功能,我们将通过 SSH 连接到 us-east1-b-mig 中的虚拟机,并使其处于不健康状态。如果使用 25% 的阈值,您需要通过 SSH 连接到其中 4 个虚拟机,然后关闭 Apache 服务器。
为此,请选择四台虚拟机,然后点击 SSH 以启动终端并进行连接,从而通过 SSH 连接到这些虚拟机。然后运行以下命令。
sudo apachectl stop
此时,系统将触发自动容量排空功能,且 us-east1-b-mig 将无法接收新的请求。
9. 验证自动容量排空功能是否正常运行
重新开始围攻
为了验证新功能,我们将再次重复使用 siege 虚拟机。让我们通过 SSH 连接到您在上一步中创建的虚拟机。创建完毕后,点击 SSH 以启动终端并进行连接。
连接后,运行以下命令以生成负载。使用您之前为外部 HTTP 负载平衡器预留的 IP 地址。
通过 Cloud Shell
siege -c 20 http://$lb-ipv4-2
输出
New configuration template added to /home/cloudcurriculumdeveloper/.siege Run siege -C to view the current settings in that file
此时,您会发现所有请求都发送到了 us-east1-a-mig。
阻止重围
现在,您已经证明了高级流量拆分功能有效,是时候停止攻城了。为此,请返回 siege-vm 的 SSH 终端,然后按 CTRL+C 停止 siege 的运行。
10. 清理步骤
现在,我们已经完成了实验环境的设置,接下来需要拆解该环境。请运行以下命令以删除测试环境。
通过 Cloud Shell
gcloud compute instances delete siege-vm --zone=us-east1-a gcloud compute forwarding-rules delete http-content-rule --global gcloud compute target-http-proxies delete http-lb-proxy-adv gcloud compute url-maps delete web-map-http gcloud compute backend-services delete east-backend-service --global gcloud compute addresses delete lb-ipv4-2 --global gcloud compute health-checks delete http-basic-check gcloud beta network-services service-lb-policies delete http-policy --location=global gcloud compute instance-groups managed delete us-east1-a-mig --zone=us-east1-a gcloud compute instance-groups managed delete us-east1-b-mig --zone=us-east1-b gcloud compute instance-templates delete test-template gcloud compute firewall-rules delete httplb-allow-http-rule gcloud compute firewall-rules delete fw-allow-ssh gcloud compute networks delete httplbs
11. 恭喜!
恭喜您完成此 Codelab。
所学内容
- 使用 Service lb 政策创建外部应用负载平衡器。
- 为后端服务配置容量自动排空功能。
后续步骤
- 试用服务负载平衡器政策提供的其他功能。