我正在使用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
答案 0 :(得分:1)
通过为同一主机名添加多个Ingress定义,可能会稍微滥用ingress-nginx的配置。 ingress-nginx会将规则/路由合并在一起。但是,配置将变得更加难以管理,并且您正接近Nginx代理可以为您完成的功能的极限。
Traefik有一个rate limit middleware,可以应用于routes。
如果您想开始更详细地管理各个服务,还可以查看类似kong或istio的内容。
在这里为您的命名约定创建一个结构非常重要,这样您才能知道哪个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配置中管理主机设置,这将很麻烦。