0

尝试进行一些负载测试时,我有一个奇怪的行为。

环境 :

  • NGINX 入口控制器版本:0.44.0
  • Kubernetes 版本:1.17.8
  • openidc.lua 版本:1.7.4

情况如下:

  • nginx 入口控制器部署为守护程序集,并且由于 openidc 模块,我将 sessionAffinity 激活到 ClientIP。
  • 我有一个简单的无状态休息服务部署了一个基本入口,该入口已经过负载测试(那个没有 sessionAffinity)。

在没有 sessionAffinity ClientIP 的情况下对其余服务启动负载测试时,我的速度远远超过 25 个请求/秒(大约 130 个请求/秒,服务资源开始崩溃,这是另一回事)。但是激活 sessionAffinity 后,我只能达到 25 req/s。

经过一番研究,我发现了一些有趣的东西,如下所示:https ://medium.com/titansoft-engineering/rate-limiting-for-your-kubernetes-applications-with-nginx-ingress-2e32721f7f57

因此,由于负载测试应始终由同一个 nginx pod 提供服务,因此公式应为:成功请求 = 周期 * 速率 + 突发

所以我确实尝试在我的入口添加注释 nginx.ingress.kubernetes.io/limit-rps: "100",但没有运气,仍然是相同的 25 req/s。

我还尝试了以下注释的不同组合:https ://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#rate-limiting ,但也没有运气。

我错过了什么吗?

4

1 回答 1

1

事实上,它比这更恶毒。

它与 sessionAffinity 无关,也与速率限制无关(实际上默认情况下没有,我一开始没有得到它,只有当我们想限制 ddos​​ 时才会有速率限制)。

问题是,我在 configmap 中添加了 modsecurity 和 owasp 规则的选项。

正因为如此,请求处理非常慢,它限制了每秒的请求数。当 sessionAffinity 没有设置时,我没有看到概率,因为 req/s 是公平的,分布在所有 pod 中。

但是使用 sessionAffinity,因此在单个 pod 上进行负载测试,问题清晰可见。

所以我不得不删除 modsecurity 和 owasp,这将由应用程序负责。

有点难过,因为我希望在 nginx 上有更多的中央安全性,所以应用程序不需要处理它,但不是以那个成本...

我很想知道 modsecurity 到底做了什么这么慢。

于 2021-02-23T14:42:43.337 回答