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 支持?
预先感谢您的反馈。
[编辑]
更具体地说,我观察到以下内容以及下面讨论的当前注释
- 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
(当我手动尝试时有效)
我不确定在当前配置中缺少什么。
关于未提供的静态内容,文档说明如下:
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
我正在尝试使用 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 支持? 预先感谢您的反馈。
[编辑]
更具体地说,我观察到以下内容以及下面讨论的当前注释
- 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 (当我手动尝试时有效)
我不确定在当前配置中缺少什么。
关于未提供的静态内容,文档说明如下:
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