带有重新注释的问题。
尝试使用重写注释。无法完成这项工作。
apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
kind: Ingress
metadata:
name: hello-whale-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: hello.whale.info
http:
paths:
- path: /blue|/(.+)
backend:
serviceName: hello-blue-whale-svc
servicePort: 80
- path: /green|/(.+)
backend:
serviceName: hello-green-whale-svc
servicePort: 80
/绿色显示完美结果,但为什么不显示/蓝色。
答案 0 :(得分:0)
您应该在日志中看到该入口始终访问相同的后端。也许this doc可以为您提供帮助。
我用两个nginx服务器作为后端进行了测试,一个返回蓝色,另一个返回绿色:
apiVersion: networking.k8s.io/v1beta1 # for versions before 1.14 use extensions/v1beta1
kind: Ingress
metadata:
name: hello-whale-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
nginx.org/rewrites: "serviceName=green rewrite=/;serviceName=blue rewrite=/"
spec:
rules:
- host: stardust
http:
paths:
- path: /green
backend:
serviceName: green
servicePort: 80
- path: /blue
backend:
serviceName: blue
servicePort: 80
然后,使用卷发我可以达到正确的目标:
$ curl stardust/green
green
$ curl stardust/blue
blue
这是入口控制器的日志:
10.32.0.1 - - [12/Oct/2019:14:56:12 +0000] "GET /green HTTP/1.1" 200 6 "-" "curl/7.64.1" 132 0.008 [default-green-80] [] 10.32.0.28:80 6 0.008 200 b5ac38db9dd6a7e53d316dc48e9401aa
10.32.0.1 - - [12/Oct/2019:14:56:16 +0000] "GET /blue HTTP/1.1" 200 5 "-" "curl/7.64.1" 131 0.011 [default-blue-80] [] 10.32.0.12:80 5 0.012 200 c438d22db0e80a5206ca8885a48d72f9
希望它能对您有所帮助。
答案 1 :(得分:0)
您能尝试这样:path:/blue/(.*)– 2天前Vasily Angapov
我想在问题评论中发布的 Vasily Angapov的正确答案中添加一些解释性词语,以便所有人都可以理解/blue/(.*)
为何有效,为什么/blue|/(.+)
无效工作,不应该在这种情况下使用。
让我们使用regexp online interpreter,其中包含对表达式中使用的每个字符的详细说明,并让我们尝试将不同的字符串与给定的正则表达式进行匹配:
/blue|/(.+)
基本上意味着我们要匹配字符串/blue
或任何其他非零字符串。 .
表示行结束符以外的任何字符,而+
符号是一个量词,它告诉我们字符串中前一个字符可能出现多少次。 +
表示一个或多个前面字符的出现,因此表达式.+
与由一个或多个不同字符组成的字符串匹配(不包括换行符)。
如果您构造一个与特定字符串匹配的入口路径,通常就不想使用|
。在这种特定情况下,这意味着您要匹配/blue
,anything else
,/green
之类的/yellow
或/red
...在这种情况下有意义。您很想匹配仅从/blue
开始的路径,例如/blue/index.html
,/blue/second.html
或blue/third.php
或仅/blue
本身。
您的路径可能如下所示:
/blue/(.+)
,它将匹配/blue/index.html
,/blue/1
,但不能单独匹配/blue
,因为.+
匹配一个或多个任意字符。
.*
匹配零个或多个任意字符,因此表达式/blue/(.*)
将匹配:
/blue
,/blue/index.html
,/blue/
,/blue/1
等。