首页 > 解决方案 > 基于 Nginx Ingress 中的授权令牌速率限制 GRPC 连接

问题描述

我正在尝试根据授权标头中包含的令牌来限​​制 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 接收该值。我面临的问题是,由于某种原因,速率限制规则没有被触发。

这是正确的方法吗?

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

谢谢

标签: nginxkubernetesgrpchttp2nginx-ingress

解决方案


您好 Bobby_H,欢迎来到 Stack Overflow!

在 Kubernetes 上使用 Nginx Ingress 时,您可以使用以下注释设置速率限制:

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

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

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

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

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

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

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

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

在这里,您将找到配置速率限制的所有重要参数。

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

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 计数,这可能不准确,或者不符合您的业务需求,例如用户身份的速率限制。

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

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


推荐阅读