首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于路径的路由无法与Kubernetes中的Traefik in适当匹配

基于路径的路由无法与Kubernetes中的Traefik in适当匹配
EN

Stack Overflow用户
提问于 2021-05-22 20:34:06
回答 1查看 1.8K关注 0票数 2

在我使用基于路径的路由的应用程序中,我有一个kubernetes入口。集群运行在引擎上,我的入口控制器是Traefikv2.4。

我的一些链接是:

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

然而,只有精确的路径被路由,https://www.kwetter.org/工作,https://www.kwetter.org/profile没有。与其他服务一样,https://www.kwetter.org/api/auth工作,https://www.kwetter.org/api/auth/users不工作。

我的入口看起来是这样的:

代码语言:javascript
复制
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消息“Response404(后端NotFound),路径不存在的服务规则”。完整的url是https://kwetter.org/static/js/2.2217857e.chunk.js,使用pathType:前缀,这应该与"/“路径匹配。

有人能告诉我哪里出了问题吗?

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

最后,我试着把一颗星星放在路上:

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

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

EN

回答 1

Stack Overflow用户

发布于 2021-05-24 09:04:34

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

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

代码语言:javascript
复制
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注释这里的更多信息。

您可以在traefik文档中找到类似的提示。

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

但在这种情况下,您可能会注意到yaml的一些不同之处。如果要为traefik创建正则表达式,可以测试解决方案这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67653940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档