You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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集群,通过同一个域名/端口对外提供服务,按路径区分前后端:

  1. 配置Ingress规则,路径/转发到React的demo Service,路径/api转发到SpringBoot的bootdemo Service,同时配置路径重写把/api前缀去掉
  2. React代码里的请求改为相对路径/api/greeting,不需要再写域名端口,既避免了跨域,也不需要关心后端的服务地址

对你怀疑点的回应

  1. 部署文件确实存在小问题,就是上面提到的React Service的targetPort配置不匹配
  2. 拆分为两个Service是完全正确的设计,不需要合并
  3. 确实是浏览器无法解析集群内部服务名,Ingress就是你需要的反向代理组件,不需要额外单独部署Nginx在业务层,用K8s原生的Ingress即可

内容的提问来源于stack exchange,提问作者Damisco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:15:00