簡體   English   中英

使用 Kubernetes 入口資源 (nginx) 在不同路徑上的兩個 Flask 應用程序

[英]Two Flask apps on different paths with Kubernetes Ingress resource (nginx)

My goal is the following: I have two Flask apps in two separate Docker containers and I want to access them via different paths on the same IP address, like this: 127.0.0.1/app1, 127.0.0.1/app2 (but with a real IP 地址)。

我想用 Kubernetes 做到這一點。

我有一個 Kubernetes 集群正在運行(Azure Kubernetes 服務),兩個 Docker 容器中的每一個都有一個部署和服務。 每個應用程序的 pod 運行良好。 我還在集群中安裝了一個入口 controller (Nginx),現在我正試圖讓它與單個入口資源一起工作。

如果我按以下方式執行此操作,則它適用於 1 個單個應用程序(其中任何一個都適用於 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-address/app1 或 IP-address/app1/ 時,我有時會被重定向到 IP-address/)之外,問題如下(我認為):

每個 Flask 應用程序都有一個“/predict”路由,它只接受 POST 請求,其中對應用程序進行了相應的調用(每個應用程序都是一個 AI 應用程序,對給定的輸入進行預測)。

兩個應用程序的調用均針對 IP-address/predict,而不是 IP-address/app1/predict 或 IP-address/app2/predict。 此外,由於此路徑問題,無法訪問 static 文件。

我不知道這是否是正確的做法? 我也嘗試過使用“重寫目標”,但還沒有找到解決方案。

我希望有人能解釋我做錯了什么。

檢查入口資源中的重寫注釋。 您提出的任何請求都將被重寫為/ 這意味着如果您調用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: 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 引擎正確提供一些 static 內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM