如何在AWS EKS环境下为Nginx Ingress配置按日统计的速率限制规则
实现方案
官方Nginx Ingress内置的nginx.ingress.kubernetes.io/limit-rps、nginx.ingress.kubernetes.io/limit-rpm注解仅支持秒、分钟级速率限制,没有原生按日统计的配置项,可通过以下两种本地实现方案完成配置:
方案1:基于Nginx原生limit_req模块自定义配置(推荐,无额外依赖)
- 第一步:修改Nginx Ingress Controller的全局ConfigMap(通常命名为
ingress-nginx-controller,在ingress-nginx命名空间下),新增按日维度的限流共享内存zone配置:
apiVersion: v1 kind: ConfigMap metadata: name: ingress-nginx-controller namespace: ingress-nginx data: http-snippet: | # 定义按日限流的zone:以客户端IP为key,10M共享内存足够存储约16万IP的统计数据,时间窗口86400秒=1天 # 可自行调整rate参数设置单日请求上限,示例为每天最多允许1000次请求 limit_req_zone $binary_remote_addr zone=per_day_limit:10m rate=1000r/d;
- 第二步:修改你当前的Ingress配置,新增自定义配置片段注解引用上面定义的限流规则,可保留原有秒/分钟级限流配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-nginx-ingress annotations: nginx.ingress.kubernetes.io/limit-rps: "5" nginx.ingress.kubernetes.io/limit-rpm: "10" # 新增按日限流规则 nginx.ingress.kubernetes.io/configuration-snippet: | limit_req zone=per_day_limit burst=0 nodelay; spec: ingressClassName: nginx rules: - host: "*" http: paths: - path: / pathType: suffix backend: service: name: my-service port: number: 5000
- 扩展说明:如果需要按其他维度统计(比如按用户ID、按请求路径),只需要修改
limit_req_zone的key即可,比如要按请求路径+IP统计就改成$binary_remote_addr$uri。
方案2:基于Lua脚本自定义限流逻辑
如果需要更复杂的日限流逻辑(比如不同接口不同日限额、超限后返回自定义响应),可以使用OpenResty版本的Nginx Ingress Controller,通过nginx.ingress.kubernetes.io/server-snippet注解注入Lua脚本实现本地计数、按自然日重置统计的逻辑,不需要额外依赖外部存储。
注意:以上两种方案都是本地节点级别的限流,每个Ingress Controller节点会独立统计请求速率,如果需要集群全局统一的日速率限制,需要额外对接Redis存储限流计数。
内容的提问来源于stack exchange,提问作者brekkanegg
相关产品推荐
相关产品推荐

