使用Kubernetes Ingress资源(nginx)在不同路径上运行两个Flask应用程序



我的目标如下:我在两个独立的Docker容器中有两个Flask应用程序,我想通过同一IP地址上的不同路径访问它们,比如:127.0.0.1/app1、127.0.0.1/pp2(但使用真实的IP地址(。

我想用Kubernetes来做这件事。

我有一个正在运行的Kubernetes集群(Azure Kubernete Service(,两个Docker容器中的每个容器都有一个部署和服务。每个应用程序的pod运行良好。我还在集群中安装了一个入口控制器(Nginx(,现在我正试图让它与单个ingress资源一起工作。

如果我这样做,它完美地适用于一个单一的应用程序(其中任何一个都适用于IP地址/(:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-name
  namespace: my-namespace
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: service1 (or service2)
          servicePort: 5000

但当我尝试以下操作时,它不起作用:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-name
  namespace: my-namespace
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /app1
        backend:
          serviceName: service1 
          servicePort: 5000
- path: /app2
backend:
      serviceName: service2 
      servicePort: 5000

我可以在两个应用程序各自的路径上看到Flask应用程序渲染的html页面,但这些功能都不起作用。

除了路径似乎并不总是有效(我有时会重定向到IP地址/当我试图连接到IP地址/app1或IP地址/app/时(之外,问题如下(我认为(:

每个Flask应用程序都有一个"/predict"路由,只接受POST请求,在那里对应用程序进行相应的调用(每个应用程序都是一个AI应用程序,可以对给定的输入进行预测(。

对这两个应用程序的调用都是针对IP地址/app1/predict,而不是IP地址/app/predict或IP地址/app.predict。此外,由于此路径问题,无法访问静态文件。

我不知道这样做是否正确?我也试着使用"重写目标",但还没有找到解决方案。

我希望有人能解释我做错了什么。

检查ingress资源中的重写注释。您提出的任何请求都将被重写为/。这意味着,如果您调用IP:80/app1,您的容器将收到IP:80/

nginx.ingress.kubernetes.io/rewrite-target: /

如果您不希望发生这种情况,请删除重写注释。你的入口最终会是这样的:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-name
namespace: my-namespace
spec:
rules:
- http:
paths:
- path: /app1
backend:
serviceName: service1 
servicePort: 5000
- path: /app2
backend:
serviceName: service2 
servicePort: 5000

您的容器将收到基于/app1/app2的完整路径。

UPDATE检查此示例。我有两个后端,它们监听/并用您通过环境变量配置的数字响应html。

---
apiVersion: v1
kind: Service
metadata:
name: backend1
namespace: default
labels:
mojix.service: backend1
spec:
ports:
- name: "8000"
port: 8000
targetPort: 8000
selector:
mojix.service: backend1
status:
loadBalancer: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: default
labels:
mojix.service: backend1
name: backend1
spec:
replicas: 1
selector:
matchLabels:
mojix.service: backend1
template:
metadata:
creationTimestamp: null
labels:
mojix.service: backend1
spec:
containers:
- name: backend1
image: lozuwa/number_backend:latest
env:
- name: BACKEND_NUMBER
value: "1"
hostname: backend1
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: backend2
namespace: default
labels:
mojix.service: backend2
spec:
ports:
- name: "8000"
port: 8000
targetPort: 8000
selector:
mojix.service: backend2
status:
loadBalancer: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: default
labels:
mojix.service: backend2
name: backend2
spec:
replicas: 1
selector:
matchLabels:
mojix.service: backend2
template:
metadata:
creationTimestamp: null
labels:
mojix.service: backend2
spec:
containers:
- name: backend2
image: lozuwa/number_backend:latest
env:
- name: BACKEND_NUMBER
value: "2"
hostname: backend2
restartPolicy: Always

我有以下入口。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: vizix-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /app1
backend:
serviceName: backend1
servicePort: 8000
- path: /app2
backend:
serviceName: backend2
servicePort: 8000

如果你击中IP/app1,你得到Response from 1,如果你击中了IP/app2,你得到了Response from 2。我的容器在/上侦听,这就是我需要重写的原因。您的应用程序期望的路径是什么?

您可以考虑完全在Ingress清单中提供捕获组,并指定将定义源Nginx重写规则的特定正则表达式。

我希望在真正的Ingress清单:中进行一些调整后,它能按要求工作

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-name
namespace: my-namespace
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- path: /app1(/|$)(.*)
backend:
serviceName: service1 
servicePort: 5000
- path: /app2(/|$)(.*)
backend:
serviceName: service2 
servicePort: 5000

可能,您还需要在目标URL中添加尾部斜杠,指示Nginx引擎正确地提供一些静态内容。

相关内容

最新更新