[英]Rate Limit GRPC connections based on authorization token in Nginx Ingress
我正在尝试根据授权 header 中包含的令牌来限制 GRPC 连接数。 我在 Nginx 配置映射和入口注释中尝试了以下设置,但 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 Ingress Controller 根据 $http_authorization 变量中的值限制 GRPC/HTTP2 stream 连接的速率。 我已修改 Nginx log_format 以记录 $http_authorization 值并观察 Nginx 接收到该值。 我面临的问题是,由于某种原因,速率限制规则没有被触发。
这是正确的方法吗?
任何帮助和反馈将不胜感激!
谢谢
您好 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 入口 controller 将突发值设置为限制的 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 计算,这可能不准确,或者不符合您的业务需求,例如用户身份的速率限制。
突发和延迟等选项不可配置。
我强烈建议通过以下来源 go 也对这个主题有更深入的解释:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.