特定请求被发送到Nginx Ingress的常规路径

时间:2019-08-26 21:07:48

标签: kubernetes nginx-ingress

我有一个Flask Python APP,它有很多路由。该应用程序(容器)可以在许多不同的部署中使用,每种计划类型都有一个。示例:我们有一个名为esg-enterprise的部署来处理企业计划,另一个有esg-professional的专业人士等。最后,我们还有另一个pod可以为我们的前端应用程序提供身份验证及其所需的模型。所有这些都是同一个容器。

正如您在下面的Ingress文件中看到的那样,我们拥有后端规则,可将流量路由到特定服务。问题在于,大多数特定请求(例如/task/connections/update/advanced//task/connections/update/advanced/)都被发送到仅应为前端服务的根路径/(这是有效的,因为它们使用相同的容器)。问题在于这些特定的请求非常庞大,导致前端API变得不可用。特定服务在更强的节点上运行,因此它们可以处理此负载,而前端api在较弱的节点上运行。运行kubectl get hpa时,我可以看到大多数负载(副本)都停留在API上。我什至不得不增加最大副本数以尝试缓解此问题。我在日志中看到,一些请求已按应有的方式发送到特定的路由,但大多数没有发送。

我要做的就是阻止/路由来接收那些特定的请求。

enter image description here

我们的入口看起来像这样:

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/

1 个答案:

答案 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