簡體   English   中英

為什么 k8s ingress-nginx 將請求轉發到其他地方?

[英]Why k8s ingress-nginx forward the reques to somewhere else?

在 k8s 中,我部署了一個使用 clusterIP(端口:5270)運行的應用程序。 然后我想設置一個ingress-nginx來將請求轉發給這個應用程序。 這是配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8s-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /core
        pathType: Prefix
        backend:
          service:
            name: core-service 
            port:
              number: 5270

我的服務是一個 NestJS 應用程序,這是我對該服務的請求:

192.168.10.131/core/api/myorder/get-order-by-id?id=1

“myorder”是我擁有的模塊之一,我使用app.setGlobalPrefix('api');添加了一個全局前綴。 在 main.ts

當輸入請求路徑時,我會得到:

{"statusCode":404,"message":"ENOENT: no such file or directory, stat '/app/client/index.html'"}

入口似乎可以將請求發送到 Pod,但它會查找“/app/client/index.html”,這不是預期的。 它應該訪問 myorder 模塊。 /app下有一個client文件夾。

如果我使用Nodeport訪問服務而不是入口,一切都很好。

這是我得到你的解決方案后的變化:

我部署了一個簡單的 nest 應用程序,一個非常簡單的應用程序: 在此處輸入圖像描述

它只有一個 getHalleo function。這是 main.js: 在此處輸入圖像描述

這是用於在 k8s 部署的 yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8-ingress-test1
  labels:
    app: k8-ingress-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: k8-ingress-test
  template:
    metadata:
      labels:
        app: k8-ingress-test
    spec:
      containers:
      - name: k8-ingress-test
        image: 192.168.10.145:8080/k8s-ingress-test
        imagePullPolicy: Always
        ports:
        - containerPort: 3146 
---
apiVersion: v1
kind: Service
metadata:
  name: k8-ingress-test-service
spec:
  selector:
    app: k8-ingress-test
  ports:
    - protocol: TCP
      port: 3146
      targetPort: 3146
  

這是我的新 ingress-nginx:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: k8s-ingress
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /hello
        pathType: Prefix
        backend:
          service:
            name: k8-ingress-test-service
            port:
              number: 3146

我刪除了“nginx.ingress.kube.netes.io/rewrite-target: /”。 這是我的訪問 URL:

192.168.10.131/hello

根據我的理解,它應該捕獲“/hello”並將“/hello”發送到測試應用程序。 由於應用程序中沒有“你好”模塊,我得到以下信息:

{"statusCode":404,"message":"Cannot GET /hello","error":"Not Found"}

所以,這就是為什么我們有:

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

這會將請求從“/hello”編輯為“/”。 換句話說,它會將“/”而不是“/hello”發送到測試應用程序。 所以我可以點擊 getHello function。

對於192.168.10.131/core/api/myorder/get-order-by-id?id=1 ,我不能做nginx.ingress.kube.netes.io/rewrite-target: /因為它會將請求重寫為/這是錯誤的。

那么,有什么辦法可以捕獲包括core在內的請求,然后刪除core部分,然后將/api/myorder/get-order-by-id?id=1發送到端口 5270(它也可以捕獲“你好”然后刪除它然后發送“/”到端口 3146)?

謝謝

我認為您可能對 nginx ingress 的rewrite-target annotation 和 NestJS application's redirection之間有一些誤解。

使用以下注釋:

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

您的請求路徑/core/api/myorder/get-order-by-id?id=1將重寫為/ ,而不是/api/myorder/get-order-by-id?id=1 查看文檔以獲取更多信息: ingress-nginx annotations/#rewrite and examples

不熟悉 NestJS,我猜你的應用程序沒有正確返回到根路徑/

您可能需要的是 NestJS 應用程序中的Redirection NestJS 控制器重定向

我解決了這個問題:

我把這個加到我的 yaml :

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

這是我的路

  - path: /hello(/|$)(.*)

所以,我們可以進行以下重寫

/hello writes to /

/hello/ rewrites to /

/hello/new rewrites to /new

類似於core

暫無
暫無

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

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