kubernetes ingress 中基于 Traefik 路径的路由未按预期工作

Traefik path based routing in kubernetes ingress not working as expected

我正在尝试使用 Kubernetes 中 Traefik 入口控制器提供的基于路径的路由机制,但我在 url 重写方面遇到了一些问题。

我的[更新]配置如下

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 前缀的情况下路由到容器 运行 正在侦听后端 / (http://db-manager:8081) 的 db-manager 微服务边.

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

[编辑]

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

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 (当我手动尝试时有效)

我不确定在当前配置中缺少什么。

关于未提供的静态内容,文档说明如下:

Use a *Strip matcher if your backend listens on the root path (/) but should be routeable on a specific prefix. For instance, PathPrefixStrip: /products would match /products but also /products/shoes and /products/shirts. Since the path is stripped prior to forwarding, your backend is expected to listen on /. If your backend is serving assets (e.g., images or Javascript files), chances are it must return properly constructed relative URLs. Continuing on the example, the backend should return /products/shoes/image.png (and not /images.png which Traefik would likely not be able to associate with the same backend). The X-Forwarded-Prefix header (available since Traefik 1.3) can be queried to build such URLs dynamically.

非常感谢您在这件事上的帮助。

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

所有以traefik为前缀的指令都需要双引号

示例:

  • traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip [不
    正确]
  • traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"
    [正确]

在第一种情况下 none 的注释反映在入口中。

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

尝试使用以下方法之一:

traefik.ingress.kubernetes.io/rule-type: "PathPrefixStrip"

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

它们都实现了相似的结果,但又有所不同,并且它们的行为略有不同。

我会阅读更多关于我们文档的差异:(https://docs.traefik.io/v1.7/configuration/backends/kubernetes/#general-annotations)

关于你的第二期:

Resource URL is : local-ubuntu/public/css/bootstrap.min.css

But this should be : local-ubuntu/db/public/css/bootstrap.min.css (which works when I've tried

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

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

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

仅使用 traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip
下面是我过去只发送子路径到我的 k8s pods

apiVersion: networking.k8s.io/v1  
kind: Ingress  
metadata:  
  name: global-ingress  
  namespace: app  
  annotations:  
    kubernetes.io/ingress.class: "traefik"  
    traefik.ingress.kubernetes.io/rule-type: PathPrefixStrip