Kubernetes入口中基于Traefik路径的路由无法按预期工作

时间:2019-01-29 01:51:11

标签: traefik kubernetes-ingress traefik-ingress

我试图在Kubernetes中使用Traefik入口控制器提供的基于路径的路由机制,但URL重写存在一些问题。

我的[UPDATED]配置如下

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/auth-type: "basic"
    traefik.ingress.kubernetes.io/auth-tls-insecure: "true"
    traefik.ingress.kubernetes.io/frontend-entry-points: "http,https"
    traefik.ingress.kubernetes.io/app-root: "/"
    traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"
    traefik.ingress.kubernetes.io/rewrite-target: "/"
  name: webapp-ingress
  namespace: my-company
spec:
  rules:
   - host: local-ubuntu
   - http:
      paths:
      - path: /
        backend:
          serviceName: webapp
          servicePort: 80
      - path: /db
        backend:
          serviceName: db-manager
          servicePort: 8081

流量被路由到正确的服务,但是当我查看db-manager(kubernetes)服务的日志时,URL仍带有/ db前缀。 我对PathPrefixStrip的预期是,流量将不带/ db前缀路由到运行db-manager微服务的容器,该容器正在后端监听/(http://db-manager:8081)。

我想念什么吗?是traefik支持还是仅nginx支持? 预先感谢您的反馈。

[编辑]

更具体地说,我将在下面讨论的当前注释中观察到以下内容

  • traefik.ingress.kubernetes.io/rule-type:“ PathPrefixStrip”
  • traefik.ingress.kubernetes.io/rewrite-target:“ /”

URL:http://local-ubuntu/db [确定]-> 200

然后其他资源正在加载,但是指向错误的基本url

示例:

资源URL为:http://local-ubuntu/public/css/bootstrap.min.css

但这应该是:http://local-ubuntu/db/public/css/bootstrap.min.css (当我手动尝试时可以使用)

我不确定当前配置中缺少的内容。

3 个答案:

答案 0 :(得分:1)

非常感谢您在此问题上的帮助。

首先,我必须解决有关yaml文件中注释格式的问题。

所有以traefik为前缀的指令都必须加双引号

示例:

  • traefik.ingress.kubernetes.io/规则类型:PathPrefixStrip [不是
    正确]
  • traefik.ingress.kubernetes.io/规则类型:“ PathPrefixStrip”
    [正确]

在第一种情况下,所有注释均未反映在入口中。

但是我仍然无法正确路由流量。 使用当前配置,仅返回在/上提供的资源。 没有加载js,css或其他资源。 因此我想知道是否需要使用 traefik.frontend.redirect.regex 指令。

答案 1 :(得分:0)

关于不提供静态内容,文档规定以下内容:

  

如果后端侦听根路径(/),但应在特定前缀上路由,请使用* Strip匹配器。例如,PathPrefixStrip:/ products可以匹配/ products,也可以匹配/ products / shoes和/ products / shirts。   由于路径是在转发之前剥离的,因此您的后端应侦听/。   如果您的后端正在提供资产(例如图像或Javascript文件),则它很可能必须返回正确构造的相对URL。   继续该示例,后端应返回/products/shoes/image.png(而不是/images.png,Traefik可能无法将其与同一后端关联)。   可以查询X-Forwarded-Prefix标头(自Traefik 1.3起可用)以动态构建此类URL。

答案 2 :(得分:0)

尝试以下方法之一:

  

traefik.ingress.kubernetes.io/规则类型:“ PathPrefixStrip”

     

traefik.ingress.kubernetes.io/rewrite-target:“ /

它们都达到相似的结果,但是它们是不同的,并且它们的行为略有不同。

我会详细阅读我们的文档,以了解区别:(https://docs.traefik.io/v1.7/configuration/backends/kubernetes/#general-annotations

关于第二期:

  

资源URL为:local-ubuntu / public / css / bootstrap.min.css

     

但这应该是:local-ubuntu / db / public / css / bootstrap.min.css(在我尝试过后可以使用

您从请求中删除了该路径...您的数据库服务永远都看不到数据库前缀...应该怎么知道将它们添加回去?

您需要在Web应用程序中设置一个根URL来处理剥离的路径。

一旦这样做,您甚至根本不需要剥离路径,而只需保留它即可。如果您无法为应用程序设置基本URL,则可能无法使用目录进行路由,而可能不得不使用子域。