Kubernetes ingress 基于路径的路由与Kubernetes中的Traefik入口不匹配

Kubernetes ingress 基于路径的路由与Kubernetes中的Traefik入口不匹配,kubernetes-ingress,traefik-ingress,Kubernetes Ingress,Traefik Ingress,对于使用基于路径的路由的应用程序,我有一个kubernetes入口。 集群运行在Google Cloud Kubernetes引擎上,我的入口控制器是Traefik v2.4 我的一些链接是: ->主页(前端) ->个人资料页(前端) 信息页面(前端) ->OAuth端点(IdentityServer) ->用户端点(IdentityServer) 我想要的逻辑是将任何匹配路径/*的内容发送到前端,并将任何匹配/api/auth/*的内容发送到identity server 然而,只有精确的

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

我的一些链接是:

  • ->主页(前端)
  • ->个人资料页(前端)
  • 信息页面(前端)
  • ->OAuth端点(IdentityServer)
  • ->用户端点(IdentityServer)
我想要的逻辑是将任何匹配路径/*的内容发送到前端,并将任何匹配/api/auth/*的内容发送到identity server

然而,只有精确的路径被路由,有效,无效。 其他服务也一样,有效,无效

我的入口看起来像这样:

种类:入口
apiVersion:networking.k8s.io/v1beta1
元数据:
名称:traefik ingress
注释:
networking.gke.io/managed-certificates:kwetter证书
traefik.ingres.kubernetes.io/router.entrypoints:web,websecure
规格:
规则:
-主持人:kwetter.org
http:
路径:
-路径:/
后端:
serviceName:kwetter web应用程序
服务端口:80
-路径:/api/auth
路径类型:前缀
后端:
serviceName:kwetter标识服务器
服务端口:80
-主持人:www.kwetter.org
http:
路径:
-路径:/
后端:
serviceName:kwetter web应用程序
服务端口:80
-路径:/api/auth
路径类型:前缀
后端:
serviceName:kwetter标识服务器
服务端口:80
前端页面加载正常,但静态文件返回404,traefik消息“response 404(backend NotFound),路径的服务规则不存在”。完整url为,且带有pathType:前缀,这应与“/”路径匹配

谁能告诉我哪里出了问题

编辑解决方案: 我尝试了基于目标的重写解决方案,这与我的API控制器所提供的服务相冲突

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

  • 路径:/*
  • 路径:/api/auth/*
这解决了整个路由问题,甚至不知道这是可能的

我想要的逻辑是将任何匹配路径/*的内容发送到前端,并将任何匹配/api/auth/*的内容发送到identity server

您需要在.yaml文件中使用正则表达式和重写目标注释。查看示例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.bar.com/something
    重写到
    rewrite.bar.com/
  • rewrite.bar.com/something/
    重写为
    rewrite.bar.com/
  • rewrite.bar.com/something/new
    重写为
    rewrite.bar.com/new
您可以找到有关
重写目标
注释的更多信息


您可以在中找到类似的提示


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

您可能需要在
路径中使用正则表达式,请参阅:Hello@DirkHeijnen。有进展吗?是这样吗?
# Replace path with regex
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: test-replacepathregex
spec:
  replacePathRegex:
    regex: ^/foo/(.*)
    replacement: /bar/$1