GKE部署下React调用Spring Boot API出现ERR_NAME_NOT_RESOLVED错误求助
问题根源
浏览器运行在用户本地环境,不属于GKE集群内部,无法解析Kubernetes集群的内部服务域名(比如imageupload-service、imageupload-service.default.svc.cluster.local)。而前端Pod属于集群内部网络,所以curl能正常访问后端服务。
解决方案
以下是几种可行的处理方式:
1. 为后端服务配置Ingress暴露外部访问地址
- 给后端Spring Boot服务创建Ingress资源,通过GKE的Ingress Controller暴露可被外部访问的域名或IP,前端直接调用这个外部地址。
- 示例Ingress配置(YAML):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: backend-ingress annotations: kubernetes.io/ingress.class: "gce" # GKE默认Ingress类 spec: rules: - http: paths: - path: /api/v1/* pathType: Prefix backend: service: name: imageupload-service port: number: 9595
- 部署后执行
kubectl get ingress获取外部IP,前端API地址改为http://<外部IP>/api/v1/user-profile。
2. 前端集成Nginx做反向代理(生产环境)
- 修改前端Dockerfile,集成Nginx,通过Nginx配置将前端的API请求转发到集群内部的后端服务:
- 示例Nginx配置(
nginx.conf):
- 示例Nginx配置(
server { listen 80; root /usr/share/nginx/html; index index.html; location /api/ { proxy_pass http://imageupload-service:9595/api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { try_files $uri $uri/ /index.html; } }
- 前端代码中只需调用相对路径
/api/v1/user-profile,Nginx会自动将请求转发到后端集群内部服务。
3. 使用NodePort类型暴露后端服务
- 将后端服务改为NodePort类型,通过GKE节点IP+NodePort访问:
- 修改后端Service配置:
apiVersion: v1 kind: Service metadata: name: imageupload-service spec: type: NodePort ports: - port: 9595 targetPort: 9595 nodePort: 30000 # 可选,端口范围需在30000-32767之间 selector: app: imageupload
- 前端API地址改为
http://<GKE节点IP>:30000/api/v1/user-profile,需确保节点IP可被外部访问,且防火墙开放对应NodePort。
验证建议
部署完成后,先在本地浏览器直接访问后端的外部地址,确认API能正常返回预期的JSON响应,再测试前端页面的调用逻辑。
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

