在Kubernetes非根URL部署Jaeger遇Nginx 502错误求助
解决Jaeger非根URL访问的502 Bad Gateway问题
以下是排查和解决步骤:
1. 先验证集群内Jaeger服务的可达性
502通常意味着Ingress无法连接到后端服务,先确认Jaeger服务在集群内部能正常访问:
- 启动一个临时测试Pod:
kubectl run -it --rm busybox --image=busybox:1.36 --namespace=my-namespace - 在Pod内执行curl命令测试:
如果返回200和Jaeger UI的页面内容,说明服务本身没问题;如果返回连接失败/超时,检查:curl -v http://jaeger:16868- Jaeger Pod是否正常运行(
kubectl get pods -n my-namespace) - Service的selector是否匹配Pod的labels(
kubectl describe service jaeger -n my-namespace对比Pod的labels) - Pod的端口是否正确暴露(Jaeger UI默认端口16868,确认Pod的containerPort配置)
- Jaeger Pod是否正常运行(
2. 调整Jaeger的base path配置
仅设置QUERY_BASE_PATH不够,Jaeger UI和查询API需要统一的路径前缀,需同时配置两个环境变量:
# 在Jaeger Deployment的containers.env中添加 env: - name: QUERY_BASE_PATH value: "/xyz/jaeger" - name: JAEGER_UI_BASE_PATH value: "/xyz/jaeger"
这会让Jaeger的UI和API都以/xyz/jaeger作为路径前缀提供服务。
3. 修正Ingress的rewrite规则
当前的rewrite规则会把/xyz/jaeger开头的请求转发到后端的根路径,但Jaeger已经配置了前缀,需要调整rewrite规则让请求路径完整传递:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress namespace: my-namespace annotations: nginx.ingress.kubernetes.io/rewrite-target: /xyz/jaeger/$2 spec: rules: - host: somedomain.com http: paths: - path: /xyz/jaeger(/|$)(.*) pathType: Prefix backend: service: name: jaeger port: number: 16868
或者更简洁的写法:
# 替换path和rewrite-target annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 rules: - host: somedomain.com http: paths: - path: /xyz/jaeger/(.*) pathType: Prefix backend: service: name: jaeger port: number: 16868
这样访问https://somedomain.com/xyz/jaeger/search会被转发到http://jaeger:16868/search,匹配Jaeger配置的前缀路径。
4. 查看Ingress Controller日志定位细节
如果以上步骤仍未解决,查看Nginx Ingress Controller的日志,获取具体错误信息:
# 替换为你的Ingress Controller所在命名空间和Pod名 kubectl logs -n ingress-nginx nginx-ingress-controller-xxxxxx-xxxxx -f
日志中会显示连接后端服务的具体错误(比如连接被拒绝、超时、DNS解析失败等),进一步定位问题。
内容的提问来源于stack exchange,提问作者sergi
相关产品推荐
相关产品推荐

