设置特定路径的 Ingress-Nginx 速率限制 rps

问题描述 投票:0回答:2

我正在使用 Kubernetes Kops。我想仅在 Ingress-Nginx 级别为特定路径设置速率限制 rps。

我知道

nginx.ingress.kubernetes.io/limit-rps 

如果我在入口规则中设置它,那么它将适用于所有路由。但是,我想将其应用于特定路线。比方说,当我尝试访问时

/login

我想将路径 /login 的 rps 限制设置为 100

nginx.ingress.kubernetes.io/limit-rps: 100

这是我的 Ingress 规则配置,

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: staging-ingress-rules
  namespace: staging
  annotations:
    kubernetes.io/ingress.class: 'nginx'
    nginx.ingress.kubernetes.io/proxy-body-size: '0'
spec:
  rules:
  - host: staging.mysite.com
    http:
      paths:
      - path: /login
        backend:
          serviceName: login_site
          servicePort: 80
      - path: /registration
        backend:
          serviceName: registration_site
          servicePort: 80
amazon-web-services docker kubernetes kubernetes-ingress nginx-ingress
2个回答
5
投票

可以通过为同一主机名添加多个 Ingress 定义来稍微滥用 ingress-nginx 的配置。 ingress-nginx 会将规则/路由合并在一起。不过,配置将变得更难管理,并且您正在接近 nginx 代理可以为您做的事情的极限。

其他选项

Traefik 有一个速率限制中间件,可以应用于路线

如果您想开始更详细地管理各个服务,还可以查看 kongistio 等内容。

Nginx 入口配置

为您的命名约定创建一个结构在这里很重要,这样您就知道哪个 Ingress 包含哪些路由。在 Ingress

name
中使用路由路径是我开始的地方,但您的用例可能会有所不同:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: staging-ingress-rules-registration
  annotations:
    kubernetes.io/ingress.class: 'nginx'
    nginx.ingress.kubernetes.io/proxy-body-size: '0'
    nginx.ingress.kubernetes.io/limit-rps: '10'
spec:
  rules:
  - host: staging.mysite.com
    http:
      paths:
      - path: /registration
        backend:
          serviceName: registration-site
          servicePort: 80
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: staging-ingress-rules-login
  annotations:
    kubernetes.io/ingress.class: 'nginx'
    nginx.ingress.kubernetes.io/proxy-body-size: '0'
    nginx.ingress.kubernetes.io/limit-rps: '100'
spec:
  rules:
  - host: staging.mysite.com
    http:
      paths:
      - path: /login
        backend:
          serviceName: login-site
          servicePort: 80

我不确定需要如何管理主机范围或服务器范围的注释(如

nginx.ingress.kubernetes.io/ssl-ciphers
)。如果它们都很好地融合,那么也许会创建一个特殊的 Ingress 来容纳它们。如果没有,您可能最终会管理所有 Ingress 配置中的主机设置,这将是一件痛苦的事情。


0
投票

由于您似乎正在使用 ingress-nginx 控制器,因此不幸的是似乎没有一种简单的方法可以做到这一点。但是,您可以通过添加 nginx.tmpl 块来修改

if
文件,以仅为您的特定端点建立速率限制。

    nginx.tmpl
  1. 复制到本地 找到此文件中构建速率限制位置的区域。位置是您在入口中定义的端点:
  2. {{/* if the location contains a rate limit annotation, create one */}} {{ $limits := buildRateLimit $location }} {{ range $limit := $limits }} {{ $limit }}{{ end }}
将此块包装在另一个模板 
    if
  1. 块中,以便仅在
    $location
    等于您想要的端点时构建速率限制。
    
    
  2. {{/* if the location contains a rate limit annotation, create one */}} {{ if eq $localtion.Path "/login" }} {{ $limits := buildRateLimit $location }} {{ range $limit := $limits }} {{ $limit }}{{ end }} {{ end }}
    nginx.tmpl
  1. 文件安装到您的入口控制器所需的路径
    
        
© www.soinside.com 2019 - 2024. All rights reserved.