【问题标题】:Rate Limit GRPC connections based on authorization token in Nginx Ingress基于 Nginx Ingress 中的授权令牌速率限制 GRPC 连接
【发布时间】:2021-07-27 09:56:05
【问题描述】:

我正在尝试根据授权标头中包含的令牌来限​​制 GRPC 连接数。我在 Nginx configmap 和 Ingress 注释中尝试了以下设置,但 Nginx 速率限制不起作用。

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-ingress-controller
  namespace: default
data:
  http-snippet: |
    limit_req_zone $http_authorization zone=zone-1:20m rate=10r/m;
    limit_req_zone $http_token zone=zone-2:20m rate=10r/m;

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: GRPC
    nginx.ingress.kubernetes.io/configuration-snippet: |
      limit_req zone=zone-1;
      limit_req_log_level notice;
      limit_req_status 429;

我尝试让 Nginx 入口控制器根据 $http_authorization 变量中的值限制 GRPC/HTTP2 流连接的速率。我已修改 Nginx log_format 以记录 $http_authorization 值并观察 Nginx 接收该值。我面临的问题是,由于某种原因,速率限制规则没有被触发。

这是正确的方法吗?

任何帮助和反馈将不胜感激!

谢谢

【问题讨论】:

    标签: nginx kubernetes grpc http2 nginx-ingress


    【解决方案1】:

    您好 Bobby_H,欢迎来到 Stack Overflow!

    在 Kubernetes 上使用 Nginx Ingress 时,您可以使用 these annotations 设置速率限制:

    • nginx.ingress.kubernetes.io/limit-connections: 允许来自单个 IP 地址的并发连接数。 503 错误 超过此限制时返回。

    • nginx.ingress.kubernetes.io/limit-rps: 每秒从给定 IP 接受的请求数。突发限制设置为此限制 乘以突发乘数,默认乘数为 5。当 客户端超出此限制,limit-req-status-code 默认:503 是 返回。

    • nginx.ingress.kubernetes.io/limit-rpm: 每分钟从给定 IP 接受的请求数。突发限制设置为此限制 乘以突发乘数,默认乘数为 5。当 客户端超出此限制,limit-req-status-code 默认:503 是 返回。

    • nginx.ingress.kubernetes.io/limit-burst-multiplier: 突发大小限制速率的乘数。默认突发乘数为 5,这 注释覆盖默认乘数。当客户超过这个 limit,limit-req-status-code 默认:返回503。

    • nginx.ingress.kubernetes.io/limit-rate-after: 初始千字节数,在此之后进一步传输响应到 给定的连接将受到速率限制。此功能必须与 启用代理缓冲。

    • nginx.ingress.kubernetes.io/limit-rate: 每秒允许发送到给定连接的千字节数。零值禁用 速率限制。此功能必须在启用代理缓冲的情况下使用。

    • nginx.ingress.kubernetes.io/limit-whitelist: 从速率限制中排除的客户端 IP 源范围。值是逗号 分隔的 CIDR 列表。

    Nginx 实现了leaky bucket 算法,其中传入的请求被缓冲在一个 FIFO 队列中,然后以有限的速率被消耗。突发值定义了队列的大小,允许超出基本限制的请求数量。当队列满时,以下请求将被拒绝并返回错误代码。

    Here你会发现所有重要的参数来配置你的速率限制。

    预期成功请求的数量可以这样计算:

    successful requests = (period * rate + burst) * nginx replica
    

    因此需要注意的是,nginx 副本的数量也会乘以成功请求的数量。另外,请注意 Nginx 入口控制器将突发值设置为限制的 5 倍。设置所需的注释后,您可以在 nginx.conf 检查这些参数。例如:

    limit_req_zone $limit_cmRfaW5ncmVzcy1yZC1oZWxsby1sZWdhY3k zone=ingress-hello-world_rps:5m rate=5r/s;
    limit_req zone=ingress-hello-world_rps burst=25 nodelay;
    
    limit_req_zone $limit_cmRfaW5ncmVzcy1yZC1oZWxsby1sZWdhY3k zone=ingress-hello-world_rpm:5m rate=300r/m;
    limit_req zone=ingress-hello-world_rpm burst=1500 nodelay;
    

    我还想强调两个限制:

    • 请求按客户端 IP 计数,这可能不准确,或者不符合您的业务需求,例如用户身份的速率限制。

    • 突发和延迟等选项不可配置。

    我强烈建议您阅读以下资源,以便对该主题进行更深入的解释:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 2016-05-21
      • 2014-11-08
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      相关资源
      最近更新 更多