配置HAProxy+K8s Nginx Ingress后子路径404问题求助
从你的配置来看,访问/blue返回404主要有几个核心原因,咱们一步步拆解排查:
1. Ingress Rewrite规则适配错误(v1beta1版本专属坑)
你使用的是networking.k8s.io/v1beta1版本的Ingress,这个版本的rewrite-target注解逻辑和后续v1版本差异很大。当前你设置nginx.ingress.kubernetes.io/rewrite-target: /+path: /blue的组合,无法正确触发路径重写——NGINX不知道该如何把/blue的请求映射到后端服务的根路径。
针对v1beta1版本,需要通过正则捕获组来实现正确的重写:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-resource annotations: nginx.ingress.kubernetes.io/rewrite-target: /$1 kubernetes.io/ingress.class: nginx spec: rules: - host: example.com http: paths: - path: /blue(/|$)(.*) backend: serviceName: nginx-deploy-blue servicePort: 80
这个配置会把/blue或/blue/xxx这类请求,分别重写到后端服务的/或/xxx,完全匹配后端服务的路径期望。
2. 确认HAProxy完整转发请求路径
你的HAProxy配置看起来是直接转发所有请求到192.168.1.10:80,但要确保它没有修改请求的URI。可以优化配置,添加健康检测和客户端IP传递,同时避免路径丢失:
frontend http_front bind *:80 stats uri /haproxy?stats option forwardfor # 传递客户端真实IP到Ingress Controller default_backend http_back backend http_back balance roundrobin server kube 192.168.1.10:80 check # 检测后端服务健康状态
3. 验证后端服务本身的可用性
访问/blue最终会被重写到后端服务的根路径,所以需要先确认nginx-deploy-blue服务本身能正常响应根路径请求。你可以在集群内部直接测试:
# 用集群内任意可执行curl的Pod测试服务可用性 kubectl exec -it <your-test-pod-name> -- curl http://nginx-deploy-blue/
如果这个请求返回404,问题就出在后端服务本身,和Ingress无关。
4. 查看NGINX Ingress Controller日志定位问题
最直接的方式是查看Ingress Controller的Pod日志,确认请求的路径、重写规则是否生效:
kubectl logs -n <nginx-ingress-namespace> <nginx-ingress-controller-pod-name>
日志里会清晰显示每个请求的request_uri、重写后的路径,以及转发的后端服务,能快速定位是路径重写失败还是服务路由错误。
5. 确认Ingress Class匹配
你的Ingress配置了kubernetes.io/ingress.class: nginx,要确保NGINX Ingress Controller的Deployment启动参数里也设置了--ingress-class=nginx,否则Ingress资源不会被该Controller识别处理。
按照上面的步骤逐一排查,应该能快速找到/blue返回404的根源。
内容的提问来源于stack exchange,提问作者Luiz Henrique

