【问题标题】:Traefik 'PathPrefix' not working as expectedTraefik 'PathPrefix' 没有按预期工作
【发布时间】:2020-03-09 22:51:56
【问题描述】:

我有一个 kube 服务,它有一个 /customers 资源,可以返回所有客户。它还可以通过/customers/1 返回特定客户。我已将 Traefik 入口配置如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    traefik.frontend.rule.type: PathPrefix
  name: customerd
  namespace: video
spec:
  rules:
  - host: custd.kube
    http:
      paths:
      - backend:
          serviceName: customerd
          servicePort: http
        path: /customers
      - backend:
          serviceName: customerd
          servicePort: http
        path: /custdhealth
      - backend:
          serviceName: customerd
          servicePort: http
        path: /metrics
      - backend:
          serviceName: customerd
          servicePort: http
        path: /sleeper

请注意,存在以下注释:traefik.frontend.rule.type: PathPrefix。来自 Traefik 文档:

如果您的后端侦听特定的基础,请使用 * Prefix * 匹配器 路径,但也为子路径上的请求提供服务。例如,路径前缀: /products 将匹配 /products 但也匹配 /products/shoes 和 /产品/衬衫。由于路径按原样转发,因此您的后端是 预计会在 /products 上收听。

问题是,当我向/customers/1 提交请求时,响应为 404。我已确认该请求未到达服务。如果我将PathPrefix 更改为PathPrefixStrip/customers 的请求会按预期返回404,因为该服务没有在/ 上侦听。所以看起来我正确地使用了注释。

任何想法我做错了什么或进一步的故障排除步骤?

【问题讨论】:

  • 你使用的是 Traefik 2.0 吗?
  • 不,Traefik 1.7。很抱歉没有包括那个细节。 Kubernetes 服务器版本 1.15.3,客户端 1.17.3。

标签: kubernetes kubernetes-ingress traefik traefik-ingress


【解决方案1】:

经过更多调试,我发现了问题所在。这与我使用 Traefik 的方式无关,这是我对 Golang HTTP 路由如何工作的误解。我的路线被编码为“/customers”。原来这条路线永远不会满足“/customers/{id}”。然而,“/customers/”将同时路由“/customers”和“/customers/{id}”。因此,经过简单的代码更改后,一切都奏效了。

使我的调试工作复杂化的一个因素是,通过检查(非 Golang 库)代码或放入调试日志消息是看不到这种行为的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    • 2014-11-15
    • 1970-01-01
    • 2012-07-02
    • 2011-09-07
    • 2013-03-03
    相关资源
    最近更新 更多