React本地可调用SpringBoot接口,Kubernetes集群中调用失败如何解决?
问题根因
你遇到的net::ERR_NAME_NOT_RESOLVED报错核心原因是:React是前端代码,编译后会下载到用户本地浏览器运行,而不是运行在K8s集群的Pod内。K8s的内部DNS(能解析bootdemo服务名的能力)仅对集群内部的资源(比如Pod、其他Service)生效,你的本地浏览器不在K8s集群网络范围内,自然无法解析bootdemo这个内部服务名。
其他可排查的配置问题
先检查你现有配置里的一个明显错误:
- React Deployment里配置的容器端口是
containerPort: 80,但React Service的targetPort写的是3000。如果你的React镜像打包后是用Nginx托管的静态资源,默认暴露端口是80,那这里的Service配置不匹配,需要把React Service的targetPort改为80。
解决方案
方案1:临时测试用,实现最简单
给SpringBoot的Service也改为NodePort类型暴露到本地,修改bootdemo的Service配置:
kind: Service apiVersion: v1 metadata: name: bootdemo labels: app: bootdemo spec: type: NodePort selector: app: bootdemo ports: - name: http port: 8080 targetPort: 80 nodePort: 31001
然后把React代码里的请求地址改为http://localhost:31001/greeting,重新构建React镜像即可。缺点是前端硬编码了端口,还会有跨域问题需要SpringBoot配置CORS放行。
方案2:生产常用,用Ingress统一入口
部署Nginx Ingress到你的Docker Desktop K8s集群,通过同一个域名/端口对外提供服务,按路径区分前后端:
- 配置Ingress规则,路径
/转发到React的demo Service,路径/api转发到SpringBoot的bootdemo Service,同时配置路径重写把/api前缀去掉 - React代码里的请求改为相对路径
/api/greeting,不需要再写域名端口,既避免了跨域,也不需要关心后端的服务地址
对你怀疑点的回应
- 部署文件确实存在小问题,就是上面提到的React Service的targetPort配置不匹配
- 拆分为两个Service是完全正确的设计,不需要合并
- 确实是浏览器无法解析集群内部服务名,Ingress就是你需要的反向代理组件,不需要额外单独部署Nginx在业务层,用K8s原生的Ingress即可
内容的提问来源于stack exchange,提问作者Damisco
相关产品推荐
相关产品推荐

