插件窝 干货文章 nginx ingress限速怎么配置

nginx ingress限速怎么配置

限速 Ingress limit Nginx 379    来源:    2025-04-27

在 Nginx Ingress 中配置限速(Rate Limiting)可以通过注解(annotations)或自定义模板实现。以下是几种常见的限速配置方法:


1. 基于客户端IP的全局限速

使用 nginx.ingress.kubernetes.io/limit-connectionslimit-rpslimit-rpm 注解实现。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/limit-connections: "10"     # 每个IP允许的最大并发连接数
    nginx.ingress.kubernetes.io/limit-rps: "5"               # 每秒请求数(Requests Per Second)
    nginx.ingress.kubernetes.io/limit-rpm: "100"             # 每分钟请求数(Requests Per Minute)
    nginx.ingress.kubernetes.io/limit-rate-after: "1m"       # 响应超过1MB后开始限速
    nginx.ingress.kubernetes.io/limit-rate: "100k"           # 限速为100KB/s
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80

2. 基于Location的细粒度限速

通过 nginx.ingress.kubernetes.io/server-snippetlocation-snippet 自定义Nginx配置。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/location-snippet: |
      limit_req zone=req_limit burst=5 nodelay;
      limit_conn conn_limit 10;
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80

注意:需在Nginx Ingress Controller的ConfigMap中定义对应的限速zone(见下文)。


3. 配置Nginx Ingress Controller的ConfigMap

在Ingress Controller的ConfigMap中定义全局限速参数(如 limit-req-zonelimit-conn-zone)。

apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
data:
  http-snippet: |
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

4. 基于Header或Cookie的限速

通过自定义Nginx配置实现更复杂的限速逻辑(如针对特定用户或API Key)。

annotations:
  nginx.ingress.kubernetes.io/server-snippet: |
    map $http_cookie_api_key $limit_key {
      default $binary_remote_addr;
      "~*api_key=(?<key>[^;]+)" $key;
    }
    limit_req_zone $limit_key zone=api_limit:10m rate=5r/s;

关键参数说明

注解/配置 作用
limit-connections 每个IP的最大并发连接数
limit-rps 每秒请求数限制
limit-req zone Nginx的请求限速zone(需提前定义)
limit-conn zone Nginx的连接数限制zone
burst 允许的突发请求数(配合limit_req使用)
nodelay 立即拒绝超额请求(否则会延迟处理)

验证限速是否生效

  1. 日志检查
    查看Nginx Ingress Controller的日志,确认限速规则已加载:

    kubectl logs -n ingress-nginx <ingress-controller-pod>
    
  2. 压力测试
    使用工具(如 wrkab)模拟请求,观察是否返回 503429 状态码:

    wrk -t2 -c10 -d10s http://example.com
    
  3. 监控指标
    Nginx Ingress 暴露的Prometheus指标(如 nginx_ingress_controller_requests)可查看限速效果。


常见问题

  1. 限速不生效

    • 检查ConfigMap中的zone定义是否与Ingress注解匹配。
    • 确保Ingress Controller版本支持限速注解。
  2. 限速范围错误

    • 如果需要全局限速(跨Ingress),需在ConfigMap中配置 http-snippet
  3. 性能影响

    • 高并发场景下,限速可能增加Nginx CPU开销,建议合理设置 burstnodelay

通过以上配置,可以灵活实现从简单到复杂的限速策略。根据实际需求选择注解或自定义Nginx片段即可。