繁体   English   中英

流量的重新路由不适用于入口 controller。 我觉得我误解了重写注释?

[英]re-route of traffic is not working with ingress controller. I feel i mis-understood the re-write annotation?

重写注释的问题。

尝试使用重写注释。 无法得到那个工作。

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

/Green 显示出完美的结果,但为什么不是 /blue。

您应该在日志中看到入口总是命中相同的后端。 也许这个文档可以帮助你。

我用两台 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 我可以达到正确的目标:

$ curl stardust/green
green
$ curl stardust/blue
blue

以下是入口 controller 的日志:

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

我希望它可以帮助你。

你可以这样尝试吗:路径:/blue/(.*) – Vasily Angapov 2 天前

我想为Vasily Angapov 在问题评论中发布的正确答案添加一些解释性的话,以便每个人都能理解为什么/blue/(.*)实际有效以及为什么/blue|/(.+)不起作用并且不应该在这种情况下使用。

让我们使用正则表达式在线解释器,它包含对表达式中使用的每个字符的详细解释,并让我们尝试将不同的字符串与给定的正则表达式匹配:

/blue|/(.+)基本上意味着我们要匹配字符串/blue或任何其他非零字符串。 . 表示除行终止符之外的任何字符, +号是一个量词,它告诉我们前一个字符在我们的字符串中可能出现多少次。 +表示出现一个或多个前面的字符,因此表达式.+匹配由一个或多个不同字符组成的字符串(不包括换行符)。

如果您构建一个与特定字符串匹配的入口路径,您通常不想使用| . 在这个特定的上下文中,这意味着您想要匹配/blueanything else例如/green/yellow/red ...这在这种情况下没有多大意义。 您很感兴趣只匹配从/blue开始的路径,例如/blue/index.html/blue/second.htmlblue/third.php或只是/blue本身您的路径可能如下所示:

/blue/(.+)

它将匹配/blue/index.html/blue/1但不单独匹配/blue因为.+匹配一个或多个任意字符

.*另一方面匹配零个或多个任意字符,因此表达式/blue/(.*)将匹配:

/blue , /blue/index.html , /blue/ , /blue/1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM