Kubernetes 基于nginx入口上的HTTP头值的速率限制请求

Kubernetes 基于nginx入口上的HTTP头值的速率限制请求,kubernetes,rate-limiting,nginx-ingress,Kubernetes,Rate Limiting,Nginx Ingress,是否可以根据nginx ingress上的HTTP头值对限制请求进行评级?是的,您可以使用包含“limit_req_zone”指令的自定义模板创建ConfigMap文件,如nginx ingress官方自定义注释用法示例所示 您应指定limit_req_zone指令的键/变量,例如: limit_req_zone $http_authorization_key ... 其中$http\u authorization\u key变量对应于“authorization key”请求头字段* *变量

是否可以根据nginx ingress上的HTTP头值对限制请求进行评级?

是的,您可以使用包含“limit_req_zone”指令的自定义模板创建ConfigMap文件,如nginx ingress官方自定义注释用法示例所示

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

limit_req_zone $http_authorization_key ...
其中$http\u authorization\u key变量对应于“authorization key”请求头字段*


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

因为我没有NGINX公司的kubernetes NGINX Ingres,这里建议的解决方案不起作用

通过configmap和注释调整来实现这一点

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;
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;
入口资源中的注释:

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;
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;
注意:http代码段不允许作为注释

一个入口定义的不同位置具有不同喉道的示例:

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;
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;

请注意,在服务器代码段注释中定义位置不允许您在入口中进一步定义位置

是否只能通过注释?在文档中找不到引用。