作者:MeshCloud脉时云公有云架构师 王明立
背景
Google Cloud 全球负载均衡 Google Cloud Load Balancing (GCLB) 作为一个全球分布式软件定义负载均衡,可以将全球各地的网络请求通过谷歌边缘节点和骨干网高效投递到用户在任一 Google Cloud 数据中心部署的后端服务,是使用频率非常高的一个云产品。其工作模式为通过分布在全球的数百个边缘节点将用户请求接收并通过自建骨干网将这些请求投递到后端服务。GCLB 在没有配置 WAF 的时候,会无条件接收所有外部的 HTTP/HTTPS 请求,而不做任何限流。但是,在某些场景下,比如流量增长高于后端承载能力,或者遭到 CC 攻击的时候,用户希望负载均衡能进行限流,在一段时间内减少发送到后端服务请求 QPS,从而为后端服务扩容或者代码调整提供时间,通过放弃一部分请求来正常服务主要用户群体,并且防止后端在扩容时不必要的处理积压请求而阻塞。
针对这些场景,可以利用 Google Cloud 应用防火墙 Cloud Armor的Rate Limiting 功能配合全球负载均衡来实现限流方案。本文通过一个操作实例来介绍这一方案。
架构图
技术简介
Google Cloud Armor 提供始终开启的 DDoS 防护,以防范基于网络或协议的耗尽容量的 DDoS 攻击。此防护功能用于负载均衡器后端的应用或服务。它能够检测和缓解网络攻击,以便仅允许格式正确的请求通过负载均衡代理。安全政策强制执行自定义的第 7 层过滤政策,包括可缓解 OWASP 十大 Web 应用漏洞风险的预配置 WAF 规则。您可以将安全政策附加到以下负载均衡器的后端服务:
- 全球外部应用负载均衡器
- 传统应用负载均衡器
- 外部代理网络负载均衡器
利用 Google Cloud Armor 安全政策,您可以在 Google Cloud 边缘尽可能靠近传入流量来源的位置允许或拒绝对您的部署的访问。这样可以防止不受欢迎的流量占用资源或进入您的虚拟私有云 (VPC) 网络。
准备工作
操作需要 Identity and Access Management (IAM) Compute Security Admin 角色
(roles/compute.securityAdmin):
- 配置、修改、更新和删除 Google Cloud Armor 安全政策
- 使用以下 API 方法:
- SecurityPolicies insert
- SecurityPolicies delete
- SecurityPolicies patch
- SecurityPolicies addRule
- SecurityPolicies patchRule
- SecurityPolicies removeRule
操作步骤
1.进入Compute Engine控制台>Instance groups> 创建实例组(非托管式为例)
Compute Engine 提供了两种虚拟机实例组,即托管实例组和非托管实例组:
- 托管实例组 (MIG) 可让您在多个相同的虚拟机上运行应用。您可以利用自动化 MIG 服务让您的工作负载具有可扩缩性和高可用性,这些服务包括自动扩缩、自动修复、区域(多地区)部署和自动更新。
- 非托管实例组可让您跨一组自行管理的虚拟机实现负载平衡
设置实例组名称、对应的区域、实例所在的VPC网络及子网、勾选所配置的机器创建即可
2.创建LB,进入Network service>Load lalancing>创建
3.配置LB的后端
4.开启CDN缓存
缓存模式:
CACHE_ALL_STATIC
自动缓存包含不是不可缓存的静态内容的成功响应。设置有效缓存指令的源站响应也会进行缓存。
对于使用 Google Cloud CLI 或 REST API 创建的已启用 Cloud CDN 的后端,这是默认行为。
USE_ORIGIN_HEADERS
要求成功的源站响应设置有效的缓存指令和有效的缓存标头。没有这些指令的成功响应会从源站转发。
FORCE_CACHE_ALL
无条件缓存成功响应,并跳过源站设置的任何缓存指令。如果后端为每个用户的专用内容(例如动态 HTML 或 API 响应)提供服务,则此模式不适用。
5.配置域名和路径
6.前端配置
7.检查配置,可以看到上面配置项,无问题即可创建
8.创建Cloud Armor规则
为了防止操作不熟练导致错误并影响生产业务,可以先创建配置一个预览的限流防火墙规则,并绑定到负载均衡。这样当流量超过阈值时,可以从日志里查看限流是否会起作用。注意预览规则需要带–preview 参数。
下面的预览规则,是要对“/api/”路径的所有请求做限流。限流的阈值是每分钟1800个请求,即30QPS。该规则的优先级是1000。
gcloud beta compute security-policies create $SECURITY_POLICY_NAME --type=CLOUD_ARMOR
gcloud beta compute security-policies rules create 1000
--security-policy $SECURITY_POLICY_NAME
--expression "request.path.matches('/api/')"
--action "throttle"
--rate-limit-threshold-count 1800
--rate-limit-threshold-interval-sec 60
--conform-action allow
--exceed-action deny-429
--enforce-on-key all
--preview
gcloud beta compute backend-services update $BACKEND_NAME --security-policy $SECURITY_POLICY_NAME --global
在确认预览防火墙规则配置无误后,可以配置正式防火墙规则,来实施流量限制,规则优先级也改为了999,去掉了–preview 参数。
gcloud beta compute security-policies rules create 999
--security-policy $SECURITY_POLICY_NAME
--expression "request.path.matches('/api/')"
--action "throttle"
--rate-limit-threshold-count 1800
--rate-limit-threshold-interval-sec 60
--conform-action allow
--exceed-action deny-429
--enforce-on-key all
测试验证
本地机器执行下面流量测试命令。
ab -n 200000 -c 15 -m POST -H "Content-Length:0" -v 3 http://ip/api/post-test
查看负载均衡日志,会看到有很多请求被阻止,返回了429 – Too Many Requests。原因是被防火墙规则限流。
从负载均衡监控面板可以看到,总请求还是在70 QPS 左右,但其中有30 QPS 投递到了后端,并返回200。其余大概40 QPS 被防火墙拦截并返回了429。