Kubernetes上Traefik的Path/PathPrefix路由配置失效问题排查
问题排查与解决方案
1. TLS证书名称不匹配
你的后两个IngressRoute配置中,tls.secretName写为api-baywa-lusy-com-cert,但原始配置对应的证书是api-my-domain-com-cert,域名不匹配会导致Traefik无法正确绑定证书,进而可能使该IngressRoute的规则失效。请修正为正确的证书名称:
tls: secretName: api-my-domain-com-cert
2. 跨命名空间服务访问权限
Traefik默认使用的ServiceAccount通常仅拥有自身命名空间的访问权限,无法直接访问namespace2中的users-api服务。需要为Traefik配置跨命名空间访问权限:
- 创建ClusterRole,允许访问所有命名空间的服务、端点和密钥:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: traefik-cross-namespace-access rules: - apiGroups: [""] resources: ["services", "endpoints", "secrets"] verbs: ["get", "list", "watch"]
- 将该ClusterRole绑定到Traefik的ServiceAccount(假设Traefik部署在
kube-system命名空间):
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: traefik-cross-namespace-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: traefik-cross-namespace-access subjects: - kind: ServiceAccount name: traefik namespace: kube-system
3. 路径匹配规则优化
如果你的请求包含/users/或/users/{id}这类子路径,Path(/users)仅匹配精确的/users路径,此时应改用PathPrefix(/users)。若新服务期望接收不带/users前缀的请求,需添加中间件剥离前缀:
routes: - match: Host(`api.my-domain.com`) && PathPrefix(`/users`) kind: Rule priority: 2000 middlewares: - name: strip-users-prefix services: - name: users-api namespace: namespace2 port: 80
对应的Middleware配置(需在namespace1中创建):
apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: strip-users-prefix namespace: namespace1 spec: stripPrefix: prefixes: - /users
4. 验证服务端点可用性
确认namespace2中的users-api服务对应的端点处于就绪状态:
kubectl get endpoints users-api -n namespace2
若端点未就绪,Traefik会跳过该路由规则,请求将自动 fallback到下一个匹配的旧服务路由。
5. 检查Traefik日志
查看Traefik Pod的日志,排查是否存在路由规则解析错误、服务访问权限问题或证书加载失败:
kubectl logs -n kube-system <traefik-pod-name>
内容的提问来源于stack exchange,提问作者Pascal Paulis
相关产品推荐
相关产品推荐

