Kubernetes v1.21.5下Ingress找不到后端服务返回404/ECONNRefused问题求助
1. 路径重写规则缺失问题
你当前的Ingress配置启用了正则匹配,但没有配置路径重写规则,请求会将完整路径/service/account/signup直接透传给后端auth服务。如果你的Express服务仅配置了/signup路由,没有添加/service/account前缀,会直接返回404错误。
解决方法:在Ingress的annotations中添加重写规则,同时调整路径类型适配正则逻辑:
kind: Ingress metadata: name: ingress-service annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/use-regex: "true" # 新增重写注解,将匹配到的后缀路径转发给后端 nginx.ingress.kubernetes.io/rewrite-target: /$1 spec: rules: - host: triver.dev http: paths: - path: /service/account/?(.*) # 调整路径类型适配正则匹配 pathType: ImplementationSpecific backend: service: name: auth-srv port: number: 3000
修改后重写规则会将/service/account/signup转为/signup后转发给后端服务,匹配Express路由规则。
2. 本地域名解析配置检查
ECONNREFUSED错误大概率是域名解析异常导致:你需要在本地hosts文件中配置triver.dev指向Ingress Controller的对外IP:
- Docker Desktop部署的K8s默认指向
127.0.0.1 - Minikube部署的K8s指向
minikube ip命令返回的IP
hosts文件路径:
- Windows:
C:\Windows\System32\drivers\etc\hosts - Linux/Mac:
/etc/hosts
添加配置示例:
127.0.0.1 triver.dev
3. Ingress Controller运行状态检查
如果未安装NGINX Ingress Controller,所有Ingress规则都不会生效,会直接返回连接错误。执行以下命令检查Controller运行状态:kubectl get pods -n ingress-nginx
如果没有正常运行的Pod,需要重新安装对应版本的NGINX Ingress Controller适配K8s v1.21.5。
生效验证
修改配置后重新执行kubectl apply -f [你的Ingress配置文件路径],先使用curl命令本地测试:curl -X POST http://triver.dev/service/account/signup
接口返回正常响应后再通过Postman调用即可。
内容的提问来源于stack exchange,提问作者user14261498

