问题描述
我对 Nginx 入口控制器有两个定义。它们中的每一个都路由到 Web 应用(托管在 Nginx 上的 React 应用)和 Web api(.Net Core)的服务。
首先工作正常,但很麻烦,因为我需要为每个指定的主机在 etc 文件中添加条目以使其工作:
apiVersion: networking.k8s.io/v1
kind: Ingress
Metadata:
name: ingress-Nginx-controller
annotations:
kubernetes.io/ingress.class: "Nginx"
spec:
rules:
- host: testapp-web-dev
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: testapp-portal-web-service
port:
number: 80
- host: testapp-api-dev
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: testapp-portal-api-service
port:
number: 80
我决定将其修改为具有多个路径的单个主机,因此我将在 etc 文件中只有一个条目。但它不起作用。第一个请求被正确路由到 http://testapp//testapp-web-dev 但接下来每隔一个请求 请求失败,即清单请求转到 http://testapp/manifest.json 但它应该转到 http://testapp/testapp-web-dev/manifest.json。
apiVersion: networking.k8s.io/v1
kind: Ingress
Metadata:
name: ingress-Nginx-controller
annotations:
kubernetes.io/ingress.class: "Nginx"
Nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: testapp
http:
paths:
- path: /testapp-web-dev(/|$)(.*)
pathType: Prefix
backend:
service:
name: testapp-portal-web-service
port:
number: 80
- path: /testapp-api-dev(/|$)(.*)
pathType: Prefix
backend:
service:
name: testapp-portal-api-service
port:
number: 80
尝试了几个不同的 url 重写,但没有运气。
解决方法
如果您想保留请求的路径,您需要删除 nginx.ingress.kubernetes.io/rewrite-target: /$2
注释。
在这个入口定义中,(.*)
捕获的任何字符都将是
分配给占位符 $2
,然后用作参数
重写目标注释。
即,注释将 http://testapp/testapp-web-dev/manifest.json
重定向到 http://testapp/manifest.json
。