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

时间:2019-05-26 19:56:18

标签: amazon-web-services docker kubernetes kubernetes-ingress nginx-ingress

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

我知道

nginx.ingress.kubernetes.io/limit-rps 

如果我在Ingress规则中设置了此规则,则该规则将适用于所有路由。但是,我想将其应用于特定路线。假设当我尝试访问

/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

1 个答案:

答案 0 :(得分:1)

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

其他选项

Traefik有一个rate limit middleware,可以应用于routes

如果您想开始更详细地管理各个服务,还可以查看类似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配置中管理主机设置,这将很麻烦。