如何解决nginx.ingress.kubernetes.io/rewrite-target: /$1 在 minikube 注释中究竟是什么意思?
在使用 minikube ingress 时,我必须写 nginx.ingress.kubernetes.io/rewrite-target: /$1
。我一直在努力理解为什么我们需要这个注释以及如何使用它。
我知道 doc 说明如下:
在某些情况下,后端服务中暴露的 URL 与 Ingress 规则中指定的路径不同。如果没有重写,任何请求都会返回 404。将注解 nginx.ingress.kubernetes.io/rewrite-target 设置为服务期望的路径。
但我无法准确理解 the exposed URL in the backend service differs from the specified path in the Ingress rule
的确切含义。我无法清楚地理解这个想法。
此外,在尝试使用服务执行入口文件时:
代码 1:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: example-namespace
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: myexample.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
代码 2:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: example-namespace
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: myexample.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
代码 3:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: example-namespace
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: myexample.com
http:
paths:
- path: /index
pathType: Prefix
backend:
service:
name: example-service
port:
number: 80
上述 3 个代码片段中的每一对在上面提到的 rewrite-target 和 path 之间究竟有什么区别?
PS:我是 minikube 的新手,并试图弄清楚事情的确切工作方式。请帮忙。
解决方法
我不知道情况是否会随着 Ingress 资源的新版本或 Nginx Ingress Controller 的新版本而改变,但我认为它是这样工作的。
假设我想在同一个域下使用一个 Ingress 为 2 个不同的 Web 应用程序提供服务。
- 应用 A 正在等待
/
下的请求 - 应用 B 正在等待
/
下的请求
因此,这两个应用都希望它们的请求直接在根目录下进行,这(乍一看)似乎使它们无法在同一个域中提供服务。
除了重写目标之外,我可以。我可以在不同的路径下为它们提供服务,但将目标重写为 /
- 在
myexample.com/aaa/
下提供应用程序 A - 在
myexample.com/bbb/
下提供应用程序 B
并添加重写目标以删除路径的第一部分。这只是重写目标可用于什么的一个示例,它只是让您能够在应用本身期望的不同路径下为应用提供服务。
入口示例:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
namespace: example-namespace
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: myexample.com
http:
paths:
- path: /aaa(/|$)(.*)
pathType: Prefix
backend:
service:
name: app-a
port:
number: 80
- path: /bbb(/|$)(.*)
pathType: Prefix
backend:
service:
name: app-b
port:
number: 80
请注意,虽然这在 Rest API 和类似的东西上工作得很好,但在网页上可能不太好用,因为网页可能会尝试在不同的路径加载资源(例如如果它不使用相对路径)。这就是为什么(通常)前端应用程序需要知道它们在域下的哪条路径上提供服务。
关于重写目标的语法,我将以我上面写的Ingress为例。需要考虑以下几点:
- 路径
- 路径类型
- 重写目标
让我们从 path
和 pathType
交互开始。通过路径,我可以定义在哪里为我的服务提供服务。根据 pathType
,它可能只是整个路径的 Prefix
、Exact
路径,也可能取决于入口控制器(又名 ImplementationSpecific
)。文档中的所有内容都用一长串示例 ( https://kubernetes.io/docs/concepts/services-networking/ingress/#examples )
我几乎可以使用 path 和 pathType 做任何事情,除非我想要服务的应用程序期望在与 Ingress 中指定的路径不同的路径上提供服务;这就是 rewrite-target
发挥作用的时候。
与上面的示例一样,我可以使用 rewrite-target
在与预期路径不同的路径下为应用程序提供服务,根据需要组合 url。我还可以使用正则表达式和捕获组(这就是 $1
、$2
等)
例如,如果我写 path: /bbb(/|$)(.*)
我的意思是这个路径将匹配 /bbb 下的所有内容,在 bbb 之后有或没有 /。如果我然后写 rewrite-target: /$2
,我的意思是请求将被重写以用 /bbb
替换 /
,然后采用第二个捕获组(这意味着第二个正则表达式,{{1 }})
文档很好地解释了它,即使它仍然使用旧的 Ingress 资源 (https://kubernetes.github.io/ingress-nginx/examples/rewrite/)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。