Kubernetes Ingress多路径配置异常:请求返回Cannot GET /
问题解决方案
你遇到的Cannot GET /错误,核心原因是Ingress转发请求时错误截断路径前缀,仅将根路径/传递给后端服务,导致Node.js API无法匹配对应路由。针对Minikube默认使用的Nginx Ingress Controller,可通过以下步骤修复:
修改Ingress配置,添加路径重写注解
在Ingress资源的metadata.annotations中添加Nginx路径重写配置,同时调整路径匹配规则,确保转发时保留路径后缀:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: foobar-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: foobar.com http: paths: - path: /foo(/|$)(.*) pathType: Prefix backend: service: name: foo-service port: number: 80 - path: /bar(/|$)(.*) pathType: Prefix backend: service: name: bar-service port: number: 80该配置会将
/foo/tea这类请求重写为/tea转发给后端Foo服务,匹配你Node.js API中的/tea路由。验证后端服务路由匹配
确认Node.js API的路由定义为/tea而非/foo/tea——Ingress已完成路径前缀剥离,后端只需处理业务路径即可。
Ingress常见问题调试方法
查看Ingress Controller日志
执行kubectl logs -n kube-system <nginx-ingress-controller-pod-name>(替换为实际Controller Pod名称),查看请求转发细节,确认后端收到的路径是否符合预期。直接验证后端服务可用性
通过端口转发直接访问后端Service:kubectl port-forward service/foo-service 8080:80,然后执行curl localhost:8080/tea,若能正常返回,说明后端服务本身无问题,问题出在Ingress配置。检查Ingress资源状态
执行kubectl describe ingress foobar-ingress,查看Ingress绑定状态、规则是否生效,是否存在配置错误提示。确认Ingress网络可达性
执行kubectl get ingress查看Ingress的ADDRESS字段是否有值,同时确保minikube tunnel处于运行状态,/etc/hosts中127.0.0.1 foobar.com的配置正确。
内容的提问来源于stack exchange,提问作者emriti

