[英]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.