Traefik在路由具有部分重叠的名称和重写规则的路由时遇到麻烦

时间:2018-10-19 08:30:01

标签: traefik kubernetes-ingress

我在通过重写设置入口路由时遇到麻烦。 我的入口定义:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: mw-abcd
spec:
  rules:
  - http:
      paths:
      - path: /abcd/v1
        backend:
          serviceName: mw-abcd-v1
          servicePort: 80
      - path: /abcd/v2
        backend:
          serviceName: mw-abcd-v2
          servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: mw-abcd-backward-comp
  annotations:
    traefik.ingress.kubernetes.io/rewrite-target: /abcd/v1
spec:
  rules:
  - http:
      paths:
      - path: /abcd
        backend:
          serviceName: mw-abcd-v1
          servicePort: 80

我在这里想要实现的是,每个不带后缀/v1的请求都应使用该后缀重定向到后端,包括版本在内的请求应按原样路由。发生的情况是,无论如何,将带有/v1的地址重定向到/v1/v1。因此,首要任务是抢占第二条规则。我尝试通过适当的注释手动设置优先级:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: mw-abcd
  annotations:
    traefik.ingress.kubernetes.io/priority: "1"
spec:
  rules:
  - http:
      paths:
      - path: /abcd/v1
        backend:
          serviceName: mw-abcd-v1
          servicePort: 80
      - path: /abcd/v2
        backend:
          serviceName: mw-abcd-v2
          servicePort: 80

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: mw-abcd-backward-comp
  annotations:
    traefik.ingress.kubernetes.io/rewrite-target: /abcd/v1
    traefik.ingress.kubernetes.io/priority: "2"
spec:
  rules:
  - http:
      paths:
      - path: /abcd
        backend:
          serviceName: mw-abcd-v1
          servicePort: 80

但随后所有内容都将返回默认后端并重新启动404。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我设法在这里找到答案。根据有关优先级(https://docs.traefik.io/basics/#priorities)的文档:

  

默认情况下,将使用规则长度对路由进行排序(以降序排列)(以避免路径重叠):PathPrefix:/ foo; Host:foo.com(长度== 28)将在PathPrefixStrip:/ foobar之前进行匹配(长度== 23)将在PathPrefix:/ foo,/ bar(长度== 20)之前匹配。

我以错误的方式设置了优先级,指定的数字必须足够大(大于其他路由的长度)以覆盖默认行为。所以我最终得到了priority值,例如90100