我有一个具有/customers
资源的kube服务,该资源将返回所有客户。它还可以返回/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文档中:
如果您的后端在特定基础上侦听,请使用*前缀*匹配器 路径,但也可以在子路径上提供请求。例如,PathPrefix: / products可以匹配/ products,也可以匹配/ products / shoes和 /产品/衬衫。由于路径是按原样转发的,因此您的后端是 希望能收听/ products。
问题是,当我向/customers/1
提交请求时,响应为404。我已确认该请求未到达服务。如果我将PathPrefix
更改为PathPrefixStrip
,则对/customers
的请求将返回404,这与预期的一样,因为该服务未在/
上进行监听。看来我正确使用了注释。
有什么想法我做错了什么或进一步的故障排除步骤吗?
答案 0 :(得分:2)
更多调试后,我找出了问题所在。这与我使用Traefik的方式无关,这对Golang HTTP路由的工作方式造成了误解。我的路线被编码为“ / customers”。原来,这条路线永远不会满足“ / customers / {id}”。但是,“ / customers /”将同时路由“ / customers”和“ / customers / {id}”。因此,在简单的代码更改之后,所有这些都起作用。
使调试工作复杂化的一个因素是,通过检查(非Golang库)代码或放入调试日志消息看不到此行为。