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

使用Kubernetes入口资源(nginx)在不同路径上运行两个Flask应用程序,nginx,flask,kubernetes,kubernetes-ingress,nginx-ingress,Nginx,Flask,Kubernetes,Kubernetes Ingress,Nginx Ingress,我的目标如下:我在两个单独的Docker容器中有两个Flask应用程序,我希望通过同一IP地址上的不同路径访问它们,如下所示:127.0.0.1/app1、127.0.0.1/app2(但使用真实IP地址) 我想和库伯内特斯一起做这件事 我有一个Kubernetes集群正在运行(Azure Kubernetes服务),两个Docker容器中的每一个都有一个部署和服务。每个应用程序的pod运行正常。 我还在集群中安装了一个入口控制器(Nginx),现在我正试图让它与一个入口资源一起工作 如果我按如

我的目标如下:我在两个单独的Docker容器中有两个Flask应用程序,我希望通过同一IP地址上的不同路径访问它们,如下所示:127.0.0.1/app1、127.0.0.1/app2(但使用真实IP地址)

我想和库伯内特斯一起做这件事

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

如果我按如下方式操作,则它完全适用于一个应用程序(其中任何一个都适用于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: /app1
        backend:
          serviceName: service1 
          servicePort: 5000
      - path: /app2
        backend:
          serviceName: service2 
          servicePort: 5000

我能够看到Flask应用程序在各自路径上呈现的两个应用程序的html页面,但这些功能都不起作用

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

每个Flask应用程序都有一个“/predict”路由,该路由只接受POST请求,其中对应用程序进行了相应的调用(每个应用程序都是一个AI应用程序,对给定的输入进行预测)

对这两个应用程序的调用都是对IP地址/predict进行的,而不是对IP地址/app1/predict或IP地址/app2/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的完整路径

更新 检查这个例子。我有两个后端,它们监听
/
,并用您通过环境变量配置的数字响应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: 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
你会得到来自1的
响应,如果你点击
IP/app2
你会得到来自2的
响应。我的容器侦听
/
,这就是我需要重写的原因。应用程序需要什么路径?

在入口资源中检查重写注释。您提出的任何请求都将被重写为
/
。这意味着如果您调用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的完整路径

更新 检查这个例子。我有两个后端,它们监听
/
,并用您通过环境变量配置的数字响应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: 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
你会得到来自1的
响应,如果你点击
IP/app2
你会得到来自2的
响应。我的容器侦听
/
,这就是我需要重写的原因。你的应用程序期望什么样的路径?

你可以考虑在入口清单中完全提供,并指定定义源nGnx规则的特定正则表达式。 我希望在对正版
入口
清单进行一些调整后,它能按预期工作:

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,指示NGNX引擎适当地服务一些静态内容。

< P>您可以考虑在入口清单中完全提供,并指定定义源NGIX规则的特定正则表达式。 我希望在对正版
入口
清单进行一些调整后,它能按预期工作:

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引擎正确提供一些静态内容。

谢谢您的回答。如果忽略重写注释,尝试访问路径时会得到“404未找到”。我认为重写注释应该类似于/$1,因此对IP地址/app1/*的调用确实被重定向到地址的第一部分(app1/*),但我无法使其工作。请检查我添加的示例。如果你得到404,那就意味着你的应用程序得到了一个无法识别的URI,或者你的入口配置不好。谢谢你的回答。如果忽略重写注释,尝试访问路径时会得到“404未找到”。我认为重写注释应该类似于/$1,因此对IP地址/app1/*的调用确实被重定向到地址的第一部分(app1/*),但我无法使其工作。请检查我添加的示例。如果您获得404,则意味着您的应用程序获得了无法识别的URI,或者您的入口配置不正确。谢谢,使用您的解决方案,我可以使用IP地址/app1/static/style.css正确访问应用程序中的不同方法和静态文件。例如,这以前不起作用。但主要问题仍然存在:我的app1仍然试图在IP address/static/style.css中查找该文件。在我的HTML页面中,我使用< {代码>HRFF =({静态),文件名=“样式.css”}}“< /代码>(金贾)”,因此我认为这应该正常工作。如果您的烧瓶应用程序使用绝对路径,那么您可能会考虑在初始入口RE中使用不重写操作的单一路径基路由。