Minikube环境下Kubernetes DNS解析失败:前后端Service通信异常
问题:Minikube集群中前端无法通过Service访问后端,出现
net::ERR_NAME_NOT_RESOLVED错误 我尝试用Minikube搭建一个仅包含前端和后端的小型Kubernetes集群,但运行异常。核心问题是前端无法通过定义好的Service访问后端:用minikube service simplefrontend-service创建隧道后,前端请求http://simplebackend-service:8080/时出现net::ERR_NAME_NOT_RESOLVED错误。
前端代码(React)
useEffect(() => { async function fetchData() { try { const result = await axios.get("http://simplebackend-service:8080/"); setData(result.data); } catch (error) { console.log(error); } } fetchData(); }, []);
后端代码(Node.js/Express)
const express = require("express"); const app = express(); const port = 8080; var cors = require("cors"); app.use(cors()); app.get("/", (req, res) => { res.send({ hey: "hello my friend", }); }); app.listen(port, () => { console.log(`Example app listening at http://localhost:${port}`); });
前端部署配置(simple-frontend.yaml)
apiVersion: apps/v1 kind: Deployment metadata: name: simplefrontend-deployment labels: app: simplefrontend spec: replicas: 1 selector: matchLabels: app: simplefrontend template: metadata: labels: app: simplefrontend spec: containers: - name: simplefrontend image: image ports: - containerPort: 3000 --- apiVersion: v1 kind: Service metadata: name: simplefrontend-service spec: type: NodePort selector: app: simplefrontend ports: - protocol: TCP port: 3000 targetPort: 3000 nodePort: 30100
后端部署配置(simple-backend.yaml)
apiVersion: apps/v1 kind: Deployment metadata: name: simplebackend-deployment labels: app: simplebackend spec: replicas: 1 selector: matchLabels: app: simplebackend template: metadata: labels: app: simplebackend spec: containers: - name: simplebackend image: image ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: simplebackend-service spec: selector: app: simplebackend ports: - protocol: TCP port: 8080 targetPort: 8080
所有资源已通过kubectl apply -f ...部署完成,请问问题出在哪里?
解决方案
核心原因
simplebackend-service是Kubernetes集群内部的Service域名,只有集群内的Pod能通过集群DNS解析这个地址。而你通过minikube service打开的前端页面是在本地浏览器中运行的,浏览器无法识别集群内部的域名,因此出现ERR_NAME_NOT_RESOLVED错误。
解决方法一:暴露后端Service为NodePort,用Minikube IP访问
- 修改后端Service配置为NodePort类型:
apiVersion: v1 kind: Service metadata: name: simplebackend-service spec: type: NodePort selector: app: simplebackend ports: - protocol: TCP port: 8080 targetPort: 8080 nodePort: 30200 # 可选,不指定会自动分配端口
- 执行
kubectl apply -f simple-backend.yaml更新配置 - 获取Minikube的IP地址:
minikube ip,假设返回192.168.49.2 - 修改前端请求地址为
http://192.168.49.2:30200/,重新构建前端镜像并部署
解决方法二:用Ingress统一管理外部访问(更优雅的方案)
- 启用Minikube的Ingress插件:
minikube addons enable ingress - 创建Ingress配置文件
ingress.yaml:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: simple-app-ingress spec: rules: - host: simple-app.local http: paths: - path: /api pathType: Prefix backend: service: name: simplebackend-service port: number: 8080 - path: / pathType: Prefix backend: service: name: simplefrontend-service port: number: 3000
- 部署Ingress:
kubectl apply -f ingress.yaml - 在本地
hosts文件中添加映射(Windows在C:\Windows\System32\drivers\etc\hosts,Linux/macOS在/etc/hosts):
192.168.49.2 simple-app.local # 替换为你的Minikube IP
- 修改前端请求地址为
/api/,这样请求会通过Ingress自动转发到后端Service,重新构建部署前端
验证集群内部通信是否正常
如果想确认后端Service在集群内是可用的,可以进入前端Pod测试:
# 获取前端Pod名称 kubectl get pods # 进入Pod执行curl命令 kubectl exec -it <simplefrontend-pod-name> -- curl http://simplebackend-service:8080/
如果能返回{"hey":"hello my friend"},说明集群内部通信没问题,问题确实是外部浏览器无法解析内部域名。
内容的提问来源于stack exchange,提问作者quinzo
相关产品推荐
相关产品推荐

