如何配置Nginx Ingress限流?AKS环境配置未生效问题求解
Nginx Ingress 限流核心原理
Nginx 限流底层基于 ngx_http_limit_req_module 模块实现,默认采用漏桶算法,核心逻辑如下:
- 以固定速率处理请求,默认统计维度为客户端IP,同一IP的所有请求统一计数
- 超出速率阈值的请求会先存入burst(突发)缓存队列,队列未满时请求会被保留等待处理
- 队列满后新增的超出请求会直接返回503错误
- 若开启nodelay模式,burst队列内的请求无需等待固定速率的时间槽,会被直接处理,不会产生额外延迟
现有配置问题排查
你的配置没有达到预期效果,核心原因如下:
- 未显式配置
nginx.ingress.kubernetes.io/limit-burst注解,默认突发队列大小为5,无法达到你预期的rps叠加自定义突发的效果 - 同时配置了
limit-connections: "1"(单IP并发连接数限制)和limit-rps: "1"(单IP每秒请求数限制),两个规则同时生效,任意一个触发就会返回限流错误,严苛的限制导致你无法观测到突发流量的处理效果 - 注意不要同时配置
limit-rpm(每分钟请求限制)和limit-rps(每秒请求限制),两个均为速率限制规则,会同时生效取更严格的阈值,你的历史配置中残留的limit-rpm: "1"也可能影响限流效果 - 若Nginx Ingress Controller版本低于0.25.0,部分限流注解的支持存在bug,也会导致配置不生效
正确限流配置示例
你可以参考以下注解修改你的Ingress配置,其余spec规则部分保持原有配置即可:
kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx # 单IP每秒允许的请求速率阈值为10 nginx.ingress.kubernetes.io/limit-rps: "10" # 突发队列大小为20,允许峰值达到10+20=30rps nginx.ingress.kubernetes.io/limit-burst: "20" # 开启nodelay模式,突发请求直接处理无延迟 nginx.ingress.kubernetes.io/limit-req-mode: "nodelay" # 若前端有CDN/反向代理,可修改统计键为X-Forwarded-For头,避免统计代理IP导致限流不准 # nginx.ingress.kubernetes.io/limit-rate-key: "$http_x_forwarded_for" nginx.ingress.kubernetes.io/proxy-body-size: 30m nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/ssl-redirect: "false" name: hop-ingress namespace: default
验证注意事项
- 测试时直接访问Ingress的公网IP,不要使用集群内部地址测试,避免所有请求被统计为集群节点出口IP,导致限流提前触发
- 可进入Nginx Ingress Controller的Pod,查看日志中是否有
limiting requests相关日志,确认限流规则是否正常触发 - 调试阶段可以临时调高限流阈值,更容易观测到突发流量的处理效果
内容的提问来源于stack exchange,提问作者guru
相关产品推荐
相关产品推荐

