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

时间:2019-10-12 13:21:57

标签: kubernetes minikube kubernetes-ingress

带有重新注释的问题。

尝试使用重写注释。无法完成这项工作。

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

/绿色显示完美结果,但为什么不显示/蓝色。

2 个答案:

答案 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或任何其他非零字符串。 .表示行结束符以外的任何字符,而+符号是一个量词,它告诉我们字符串中前一个字符可能出现多少次。 +表示一个或多个前面字符的出现,因此表达式.+与由一个或多个不同字符组成的字符串匹配(不包括换行符)。

如果您构造一个与特定字符串匹配的入口路径,通常就不想使用|。在这种特定情况下,这意味着您要匹配/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等。