我试图在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支持? 预先感谢您的反馈。
[编辑]
更具体地说,我将在下面讨论的当前注释中观察到以下内容
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 (当我手动尝试时可以使用)
我不确定当前配置中缺少的内容。
答案 0 :(得分:1)
非常感谢您在此问题上的帮助。
首先,我必须解决有关yaml文件中注释格式的问题。
所有以traefik为前缀的指令都必须加双引号
示例:
在第一种情况下,所有注释均未反映在入口中。
但是我仍然无法正确路由流量。 使用当前配置,仅返回在/上提供的资源。 没有加载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,则可能无法使用目录进行路由,而可能不得不使用子域。