Kubernetes搭配NGINX限流公式正确性及实际请求超预期原因咨询
一、关于限流计算公式的正确性
(period * rate + burst) * number of PODs 仅在两个严格前提同时满足时成立:
- 限流规则配置在每个NGINX Pod本地,没有使用集中式共享限流存储(比如Redis),每个Pod独立维护限流计数器
- 入口流量完全均匀分发到所有NGINX Pod,不存在单IP请求集中落到少数Pod的情况
只要其中一个前提不满足,该公式的计算结果就和实际限流值存在偏差。
二、实际成功请求数远高于预期的常见原因
- 限流参数理解错误
你提到的burst配置为30/sec本身就是典型的认知误区:NGINX生态所有限流模块的burst参数是允许超出平均速率的总请求队列长度,单位是次,不是次/秒。如果你配置时混淆了概念,实际将burst值设为300甚至更高,单Pod允许的请求数就会达到100+300=400,2个Pod合计800,叠加流量分布不均的冗余就和你1006的实测值非常接近。 - 压测统计口径不匹配
你参考的公式是单秒维度的最大允许请求数,但实测的1006次成功请求如果是多秒累积的结果,就会出现数值远超260的情况:比如压测持续了10秒的情况下,单Pod的累积允许请求为10*100 + 30 = 1030,刚好和你实测的1006次高度吻合。 - 流量分发策略异常
如果你的K8s Service负载均衡策略配置了源IP会话保持,或者Ingress控制器的流量分发规则不是轮询,单IP发起的压测请求可能集中落到同一个NGINX Pod上,若此时你实际配置的限流阈值更高,也会出现实测值远超预期的情况。 - 限流键配置错误
若你配置的限流规则的统计键不是$binary_remote_addr(源IP维度),而是服务名、接口路径等其他维度,就会出现限流规则未按你预期的单IP维度生效,自然不会触发你计算的260次/秒的阈值。
内容的提问来源于stack exchange,提问作者Thangakumar D
相关产品推荐
相关产品推荐

