【发布时间】:2021-10-14 13:17:22
【问题描述】:
我希望对 Azure 上的生产部署实施全局速率限制,以确保我的应用程序不会由于无法控制的流量而变得不稳定(我不是在谈论 DDoS,而是大量的合法流量)。 Azure Web 应用程序防火墙仅支持基于 IP 的速率限制。
我在不增加系统中的跳数的情况下寻找替代方案。我发现的唯一解决方案是在 NGINX 中使用 limit_req_zone 指令。这并没有给出实际的全局速率限制,但它可用于对每个 pod 施加全局速率限制。以下 configmap 被挂载到 Kubernetes NGINX 入口控制器来实现这一点。
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-ingress-ingress-nginx-controller
namespace: ingress-basic
data:
http-snippet : |
limit_req_zone test zone=static_string_rps:5m rate=10r/m ;
location-snippet: |
limit_req zone=static_string_rps burst=20 nodelay;
limit_req_status 429;
static_string_rps 是一个常量字符串,因此所有请求都计入单个关键字下,该关键字提供每个 pod 的全局速率限制。
这似乎是一种实现全局速率限制的 hacky 方法。有没有更好的选择,Kubernetes NGINX 入口控制器是否正式支持这种方法?(他们的文档说他们支持为高级配置安装 configmap,但没有提到使用这种方法而不使用额外的 memcached pod 来同步计数器之间的豆荚)
https://www.nginx.com/blog/rate-limiting-nginx/#:~:text=One%20of%20the%20most%20useful,on%20a%20log%E2%80%91in%20form。 https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#global-rate-limiting
【问题讨论】:
-
我怀疑除了 NGINX 入口文档中提供的方法之外还有其他方法。如果要对合法流量实施速率限制,则需要存储一些信息以在流量超过给定阈值时拒绝流量。它可以是 IP、用户信息或其他内容。所以你必须使用一些存储解决方案,比如 Memcache。甚至不同的入口解决方案也使用这些方法。
-
是的。我同意你的看法。您认为上述方法是否推荐用于生产?这可以创建每个 pod 全局速率限制
-
我没有使用这个的真实例子,但我认为它应该是生产就绪的。您可以在 k8 松弛通道中询问正在使用的任何生产实现。
-
谢谢@NitishkumarSingh。我试试看
-
是的。当然。我确实有一篇博文。给我一些时间来总结一下答案
标签: nginx kubernetes kubernetes-ingress nginx-ingress rate-limiting