Traefik Ingress 后端无法访问 Jaeger UI 的问题排查求助
从你提供的信息来看,问题主要出在Ingress配置的注解混用和路径重写规则错误上,另外还有Ingress控制器的匹配问题,具体分析和修复步骤如下:
1. 修正Ingress控制器的Class匹配
从你提供的ingress-nginx服务状态可以看到,集群中实际运行的是nginx-ingress控制器,但你的Ingress配置里指定了kubernetes.io/ingress.class: traefik,这会导致nginx-ingress控制器忽略这个Ingress规则,请求无法转发到Jaeger服务,最终被myhost.com的默认站点处理,所以跳转到了其他网站。
修复:把Ingress的class改成nginx:
kubernetes.io/ingress.class: nginx
2. 清理冲突的注解
你同时添加了nginx和traefik的混合注解,比如nginx.ingress.kubernetes.io/rewrite-target: /是nginx-ingress的注解,但之前的class是traefik,这完全冲突了。另外,ingress.kubernetes.io/auth-type这类是旧版Ingress的注解,nginx-ingress的认证注解应该用nginx.ingress.kubernetes.io/auth-type,所以需要统一注解:
annotations: kubernetes.io/ingress.class: nginx # 修正路径重写规则(见下一点) nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: my-auth-secret
3. 修复路径重写规则
Jaeger UI的所有静态资源(CSS、JS、图标)都是基于根路径/加载的,如果直接把/jaeger重写到/,浏览器会尝试从myhost.com/而不是myhost.com/jaeger/加载这些资源,同时也会导致页面跳转异常。
需要调整路径规则,用正则匹配来保留子路径:
rules: - host: myhost.com http: paths: - path: /jaeger(/|$)(.*) pathType: ImplementationSpecific backend: service: name: jaeger-query port: number: 80
这个规则会把/jaeger/xxx重写成/xxx,让Jaeger服务能正确处理请求,同时浏览器加载资源时的路径也会被正确转发。
4. 验证Ingress配置生效
修改完Ingress配置后,应用更新:
kubectl apply -f your-ingress-file.yaml -n monitoring
然后查看Ingress的状态,确认是否绑定到了nginx-ingress控制器:
kubectl get ingress jaegerquery-ingress -n monitoring
检查ADDRESS字段是否显示nginx-ingress的外部IP(17.168.1.181),如果显示正常,说明Ingress规则已经被控制器识别。
额外验证点
- 确认
myhost.com的DNS解析指向了nginx-ingress的外部IP(17.168.1.181),可以在本地PC用ping myhost.com测试。 - 检查jaeger-query服务是否正常运行:
kubectl get pods -n monitoring | grep jaeger-query,确保Pod处于Running状态。
内容的提问来源于stack exchange,提问作者Golide

