好吧,这个问题的各种排列都被问到了,我觉得问这个问题很糟糕;我正在认输,我很好奇是否有人能给我指明正确的方向(或者指出我错了)。我继续尝试了一些来自文档的示例,但是没有结果(见下文)。
我正在尝试使用一个侵入控制器将流量路由到Kubernetes下的适当位置。
服务器设置
我有一个服务器、myserver.com和三个服务运行在:
myserver.com/services/
myserver.com/services/service_1/
myserver.com/services/service_2/
请注意,我没有(故意)对myserver.com/做任何事情。
在这三个地方的每一个地方,都有一个网络应用程序在运行。例如,myserver.com/services/service_2需要在myserver.com/services/service_2/static/css加载css文件,等等.
库伯奈特斯
为了管理网络,我使用了一个Kubernetes Ingress控制器,我在下面定义了这个控制器。CORS注释并不是非常相关的,但是为了消除任何混乱,我已经将它们包括进来了。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myServices
namespace: myServices
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-origin: '$http_origin'
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/use-regex: "true"
spec:
ingressClassName: nginx
tls:
- hosts:
- myserver.com
rules:
- host: myserver.com
http:
paths:
- path: /services
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
- path: /services/service_1(/|$)
pathType: Prefix
backend:
service:
name: web-service-1
port:
number: 80
- path: /services/service_2(/|$)
pathType: Prefix
backend:
service:
name: web-service-2
port:
number: 80目标
我注意到一件有用的事情就是给出一些路径示例。从下面的例子看,路径看起来并没有那么复杂。我想这就是我想要的。请注意,我希望每个服务能够解析其css和图像文件。
myserver.com/services -> myserver.com/services
myserver.com/services/xxx/xxx -> myserver.com/services/xxx/xxx
myserver.com/services/service_1 -> myserver.com/services/service_1
myserver.com/services/service_1/xxx/xxx -> myserver.com/services/service_1/xxx/xxx
myserver.com/services/service_2/xxx/xxx -> myserver.com/services/service_2/xxx/xxx尝试
我知道这个问题与nginx.ingress.kubernetes.io/rewrite-target规则及其与我定义的路径的交互有很大关系。
我知道我不想要nginx.ingress.kubernetes.io/rewrite-target: $1,因为当我访问myserver.com/services时,它给了我500个
我知道我不想要nginx.ingress.kubernetes.io/rewrite-target: $1/$2,因为当我访问myserver.com/services/service_1时,我实际上得到了页面上呈现的myserver.com/services的部分内容。
所以尝试1
我还试图从这问题中复制已接受的解决方案。
在这个尝试中我设定
的nginx.ingress.kubernetes.io/rewrite-target: "/$1"和服务路径之一
- path: /(services/service_1(?:/|$).*)
当我访问myserver.com/services/service_1/xyz时,会呈现来自myserver.com/services/service_1的HTML。
结束语
路径重写和路径规则有些不太正确。有什么建议吗?
发布于 2022-01-21 20:34:50
您在最近的评论中报告的问题可以通过查看nginx-ingress文档中的重写示例来解决。
rewrite-target注释配置入口,以便将匹配的路径重写到该值。由于您已经指定了/的静态值,任何与您的入口规则相匹配的内容都将被重写为/,这正是您所看到的行为。
解决方案是捕获我们所关心的路径的一部分,然后在rewrite-target注释中使用它。例如:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myservices
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, OPTIONS"
nginx.ingress.kubernetes.io/cors-allow-origin: '$http_origin'
nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$2
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
ingressClassName: nginx
rules:
- host: myserver.com
http:
paths:
- path: /services/service_1(/|$)(.*)
pathType: Prefix
backend:
service:
name: webservice-service1
port:
number: 80
- path: /services/service_2(/|$)(.*)
pathType: Prefix
backend:
service:
name: webservice-service2
port:
number: 80
- path: /services(/|$)(.*)
pathType: Prefix
backend:
service:
name: webservice
port:
number: 80在这里,我们修改了匹配表达式,使它们看起来像:
- path: /services/service_1(/|$)(.*)第二个捕获组(.*)捕获匹配路径部分之后的所有内容。然后在rewrite-target注释中使用捕获组($2,因为它是第二个组):
nginx.ingress.kubernetes.io/rewrite-target: /$2在配置就绪后,对/services/service_2的请求将导致:
This is service2.但是,对/services/service_2/foo/bar的请求会导致:
<html><head><title>404 Not Found</title></head><body>
<h1>Not Found</h1>
The URL you requested (/foo/bar) was not found.
<hr>
</body></html>查看后端服务器日志,我们看到:
10.42.0.32 - - [21/Jan/2022:20:33:23 +0000] "GET / HTTP/1.1" 200 211 "" "curl/7.79.1"
10.42.0.32 - - [21/Jan/2022:20:33:45 +0000] "GET /foo/bar HTTP/1.1" 404 311 "" "curl/7.79.1"我更新了我的示例库以匹配此配置。
https://stackoverflow.com/questions/70795048
复制相似问题