【问题标题】:Rate limit requests based on HTTP header value on nginx-ingress基于 nginx-ingress 上的 HTTP 标头值的速率限制请求
【发布时间】:2020-04-09 16:46:55
【问题描述】:

是否可以根据 nginx-ingress 上的 HTTP 标头值对请求进行速率限制?

【问题讨论】:

    标签: kubernetes rate-limiting nginx-ingress


    【解决方案1】:

    因为我没有来自 nginxinc 的 kubernetes nginx 入口,所以这里建议的解决方案不起作用。

    通过 configmap 和注释调整来管理。

    配置图:

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: nginx-configuration
      namespace: ingress-nginx
      labels:
        app: nginx-ingress
        chart: nginx-ingress-1.33.0-dev
        release: nginx-ingress
    data:
      http-snippet: |
        limit_req_zone $http_authorization zone=my-zone:20m rate=5r/s;
        limit_req_zone $binary_remote_addr zone=my-zone:20m rate=10r/s;
        limit_req_zone $http_someheader zone=my-zone:20m rate=20r/s;
    

    入口资源中的注释:

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

    注意:http-sn-p 不能作为注解!

    一个入口定义的不同位置的不同节流示例:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      annotations:
        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/server-snippet: |
          location /content/images/ {
          limit_req zone=my-zone-2 burst=50 nodelay;
          }
          location /content/texts/ {
          limit_req zone=my-zone-3 burst=50 nodelay;
          }
        nginx.ingress.kubernetes.io/configuration-snippet: |
          limit_req zone=my-zone-1 burst=10 nodelay;
          limit_req_log_level notice;
          limit_req_status 429;
    

    请注意,在 server-sn-p 注释中定义位置不允许您在 ingress 中进一步定义它

    【讨论】:

    • 那么我们需要在 server-sn-p 中添加完整的位置定义吗?您是如何在服务器 sn-p 中提及后端的?
    【解决方案2】:

    是的,您可以通过使用包含“limit_req_zone”指令的自定义模板创建 ConfigMap 文件来实现,如官方 NGINX Ingress 自定义注释使用示例here 中所示。

    您应该为 limit_req_zone 指令指定键/变量,例如:

    limit_req_zone $http_authorization_key ...
    

    其中 $http_authorization_key 变量对应于“Authorization-Key”请求头字段*

    *变量名的最后一部分是转换为小写的字段名,用下划线替换破折号(来自NGINX官方doc

    【讨论】:

    • 只能通过注释实现吗?在文档中找不到参考。
    猜你喜欢
    • 2015-06-21
    • 1970-01-01
    • 2021-07-27
    • 2013-12-13
    • 2012-02-28
    • 2022-08-04
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    相关资源
    最近更新 更多