基于nginx-ingress上的HTTP标头值的速率限制请求

时间:2019-05-02 09:52:35

标签: kubernetes rate-limiting nginx-ingress

是否可以基于nginx-ingress上的HTTP标头值对限制请求进行评分?

2 个答案:

答案 0 :(得分:3)

由于我没有kubernetes,nginxinc的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代码段用作注释!

对于一个入口定义的不同位置,具有不同节流的示例:

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;

请注意,在服务器摘要批注中在此处定义位置不允许您在入口处进一步定义

答案 1 :(得分:1)

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

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

captureEvent

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

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