【问题标题】:Path based routing fails to match propertly with Traefik Ingress in Kubernetes基于路径的路由无法与 Kubernetes 中的 Traefik Ingress 正确匹配
【发布时间】:2021-05-22 20:34:06
【问题描述】:

我有一个 kubernetes 入口,用于我使用基于路径的路由的应用程序。 集群在 Google Cloud Kubernetes Engine 上运行,我的入口控制器是 Traefik v2.4。

我的一些链接是:

我想要的逻辑是让任何匹配路径 /* 的东西进入前端,任何匹配 /api/auth/* 的东西都被路由到身份服务器。

但是,只有精确的路径被路由,https://www.kwetter.org/ 有效,https://www.kwetter.org/profile 无效。 其他服务也一样,https://www.kwetter.org/api/auth 有效,https://www.kwetter.org/api/auth/users 无效。

我的入口如下所示:

kind: Ingress
apiVersion: networking.k8s.io/v1beta1
metadata:
  name: traefik-ingress
  annotations:
    networking.gke.io/managed-certificates: kwetter-certificate
    traefik.ingress.kubernetes.io/router.entrypoints: web,websecure
spec:
  rules:
  - host: kwetter.org
    http:
      paths:
      - path: /
        backend:
          serviceName: kwetter-web-app
          servicePort: 80
      - path: /api/auth
        pathType: Prefix
        backend:
          serviceName: kwetter-identity-server
          servicePort: 80
  - host: www.kwetter.org
    http:
      paths:
      - path: /
        backend:
          serviceName: kwetter-web-app
          servicePort: 80
      - path: /api/auth
        pathType: Prefix
        backend:
          serviceName: kwetter-identity-server
          servicePort: 80

页面在前端加载正常,但静态文件返回 404,并带有 traefik 消息“响应 404(后端未找到),路径的服务规则不存在”。完整的 url 是 https://kwetter.org/static/js/2.2217857e.chunk.js 并带有 pathType: Prefix,这应该与“/”路径匹配。

谁能告诉我哪里出错了?

编辑解决方案: 我尝试了基于重写目标的解决方案,这与我的 API 控制器在他们到达的服务上发生冲突。

最后我只是尝试在路径上放一颗星:

  • 路径:/*
  • 路径:/api/auth/*

这解决了整个路由问题,甚至不知道这是可能的。

【问题讨论】:

标签: kubernetes-ingress traefik-ingress


【解决方案1】:

我想要的逻辑是让任何匹配路径 /* 的东西进入前端,任何匹配 /api/auth/* 的东西都被路由到身份服务器。

您需要在 .yaml 文件中使用正则表达式和 rewrite-target 注释。查看示例 Ingress .yaml 文件:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  name: rewrite
  namespace: default
spec:
  rules:
  - host: rewrite.bar.com
    http:
      paths:
      - backend:
          serviceName: http-svc
          servicePort: 80
        path: /something(/|$)(.*)

在此入口定义中,(.*) 捕获的任何字符都将分配给占位符 $2,然后将其用作rewrite-target 注释中的参数。

例如,上面的入口定义将导致以下重写:

  • rewrite.bar.com/something 重写为 rewrite.bar.com/
  • rewrite.bar.com/something/ 重写为 rewrite.bar.com/
  • rewrite.bar.com/something/new 重写为 rewrite.bar.com/new

你可以找到更多关于rewrite-target注解here的信息。


您可以在traefik documentation找到类似的提示。

# Replace path with regex
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-replacepathregex
spec:
  replacePathRegex:
    regex: ^/foo/(.*)
    replacement: /bar/$1

但在这种情况下,您可能会注意到 yaml 中的一些差异。如果你想为traefik创建正则表达式,可以测试解决方案here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2020-02-27
    相关资源
    最近更新 更多