gpt4 book ai didi

nginx - nginx.ingress.kubernetes.io/rewrite-target :/$1 mean in minikube annotation? 到底是做什么的

转载 作者:行者123 更新时间:2023-12-04 12:20:27 25 4
gpt4 key购买 nike

在使用 minikube ingress 时,我必须写 nginx.ingress.kubernetes.io/rewrite-target: /$1 .我一直在努力理解为什么我们需要这个注释以及如何使用它。
我知道doc说如下:

In some scenarios the exposed URL in the backend service differs from the specified path in the Ingress rule. Without a rewrite any request will return 404. Set the annotation nginx.ingress.kubernetes.io/rewrite-target to the path expected by the service.


但我无法得到确切的点 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 个代码片段的每一对之间究竟有什么区别?
PS:我是 minikube 的新手,并试图弄清楚事情的确切工作方式。请帮忙。

最佳答案

我不知道情况是否会随着 Ingress 资源的新版本或 Nginx Ingress Controller 的新版本而改变,但我认为这就是它的工作原理。
假设我想在同一个域下使用 Ingress 为 2 个不同的 Web 应用程序提供服务。

  • 应用程序 A 正在等待 / 下的请求
  • 应用程序 B 正在等待 / 下的请求

  • 因此,这两个应用程序都希望它们的请求直接在 root 下,这(乍一看)似乎使它们无法在同一个域中提供服务。
    除了重写目标,我可以。我可以在不同的路径下为它们提供服务,但将目标重写为 /
  • myexample.com/aaa/ 下为 App A 提供服务
  • myexample.com/bbb/ 下为 App 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路径,或者它可以取决于入口 Controller (又名 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/然后取第二个捕获组(这意味着第二个正则表达式, (.*) )
    文档很好地解释了它,即使它仍然使用旧的 Ingress 资源 ( https://kubernetes.github.io/ingress-nginx/examples/rewrite/ )

    关于nginx - nginx.ingress.kubernetes.io/rewrite-target :/$1 mean in minikube annotation? 到底是做什么的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67031162/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com