我有一个Flask Python APP,它有很多路由。该应用程序(容器)可以在许多不同的部署中使用,每种计划类型都有一个。示例:我们有一个名为esg-enterprise的部署来处理企业计划,另一个有esg-professional的专业人士等。最后,我们还有另一个pod可以为我们的前端应用程序提供身份验证及其所需的模型。所有这些都是同一个容器。
正如您在下面的Ingress文件中看到的那样,我们拥有后端规则,可将流量路由到特定服务。问题在于,大多数特定请求(例如/task/connections/update/advanced/
或/task/connections/update/advanced/
)都被发送到仅应为前端服务的根路径/
(这是有效的,因为它们使用相同的容器)。问题在于这些特定的请求非常庞大,导致前端API变得不可用。特定服务在更强的节点上运行,因此它们可以处理此负载,而前端api在较弱的节点上运行。运行kubectl get hpa
时,我可以看到大多数负载(副本)都停留在API上。我什至不得不增加最大副本数以尝试缓解此问题。我在日志中看到,一些请求已按应有的方式发送到特定的路由,但大多数没有发送。
我要做的就是阻止/
路由来接收那些特定的请求。
我们的入口看起来像这样:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/affinity: cookie
nginx.ingress.kubernetes.io/proxy-body-size: 150m
nginx.ingress.kubernetes.io/proxy-connect-timeout: "1200"
nginx.ingress.kubernetes.io/proxy-read-timeout: "1200"
nginx.ingress.kubernetes.io/proxy-send-timeout: "1200"
nginx.ingress.kubernetes.io/upstream-fail-timeout: "1200"
name: ingress-nginx
namespace: default
spec:
tls:
- hosts:
- app.ourdomain.com
- api.ourdomain.com
secretName: ourdomain-certificate
rules:
- host: app.ourdomain.com
http:
paths:
- backend:
serviceName: frontend
servicePort: 80
path: /
- host: api.ourdomain.com
http:
paths:
- backend:
serviceName: api
servicePort: 8000
path: /
- backend:
serviceName: esg
servicePort: 8000
path: /cron/
- backend:
serviceName: esg-bigquery-migration
servicePort: 8000
path: /cron/big-query/
- backend:
serviceName: esg
servicePort: 8000
path: /task/
- backend:
serviceName: esg-trial
servicePort: 8000
path: /task/connections/update/trial/
- backend:
serviceName: esg-advanced
servicePort: 8000
path: /task/connections/update/advanced/
- backend:
serviceName: esg-professional
servicePort: 8000
path: /task/connections/update/professional/
- backend:
serviceName: esg-enterprise
servicePort: 8000
path: /task/connections/update/enterprise/
答案 0 :(得分:0)
摘自文档:
从0.22.0版开始,使用注释进入定义 nginx.ingress.kubernetes.io/rewrite-target不向后 与以前的版本兼容。在0.22.0及更高版本中,任何 请求URI中需要传递给 重新编写的路径必须在捕获组中明确定义。
在某些情况下,后端服务中公开的URL与Ingress规则中指定的路径不同。如果没有重写,则任何请求都将返回404。为避免这种情况,您可以将注释ingress.kubernetes.io/rewrite-target设置为服务所需的路径。请参阅documentation,以了解更多信息。另外,您应该在注释中添加以下行:
nginx.ingress.kubernetes.io/rewrite-target: /$1