如何在Kubernetes中实现Pod间网络通信?(简易示例)
新手友好版K8s前后端Pod配置+通信示例
我完全懂这种困扰!刚接触Kubernetes的时候,网上的资料要么太零散,要么默认你已经懂一堆概念,新手根本摸不着头绪。下面我给你一套极简、可直接运行的配置,包含Node.js后端、React前端的Pod,还有让它们能互相通信的Service配置,再附上前后端的代码示例,一步步来:
一、Kubernetes配置文件(可拆成2个文件,或合并成一个用---分隔)
1. Node.js后端 Deployment + Service
创建node-backend.yaml:
# 后端Deployment:管理Pod的创建与生命周期 apiVersion: apps/v1 kind: Deployment metadata: name: node-backend spec: replicas: 1 selector: matchLabels: app: node-backend template: metadata: labels: app: node-backend spec: containers: - name: node-backend image: node:18-alpine # 用轻量的Alpine镜像减少体积 ports: - containerPort: 3001 # 内嵌简单的后端代码,直接在容器里运行 command: ["sh", "-c"] args: - "echo 'const express = require(\"express\"); const app = express(); app.get(\"/api/data\", (req, res) => { res.json({ message: \"Hello from Node.js Backend!\", data: [\"K8s\", \"Node\", \"React\"] }); }); app.listen(3001, () => console.log(\"Backend running on port 3001\"));' > app.js && npm init -y && npm install express && node app.js" --- # 后端Service:给Pod分配稳定的网络地址,让前端能找到它 apiVersion: v1 kind: Service metadata: name: node-backend-service spec: selector: app: node-backend ports: - port: 3001 targetPort: 3001
2. React前端 Deployment + Service
创建react-frontend.yaml:
# 前端Deployment apiVersion: apps/v1 kind: Deployment metadata: name: react-frontend spec: replicas: 1 selector: matchLabels: app: react-frontend template: metadata: labels: app: react-frontend spec: containers: - name: react-frontend image: node:18-alpine ports: - containerPort: 3000 # 内嵌React代码,直接在容器里启动项目 command: ["sh", "-c"] args: - "npx create-react-app frontend && cd frontend && echo 'import { useEffect, useState } from \"react\"; function App() { const [data, setData] = useState(null); useEffect(() => { fetch(\"http://node-backend-service:3001/api/data\") .then(res => res.json()) .then(data => setData(data)); }, []); return (<div className=\"App\"><h1>React Frontend</h1>{data ? (<div><p>Backend Response:</p><pre>{JSON.stringify(data, null, 2)}</pre></div>) : (<p>Loading...</p>)}</div>); } export default App;' > src/App.js && npm start" --- # 前端Service:用NodePort类型让外部能访问前端 apiVersion: v1 kind: Service metadata: name: react-frontend-service spec: type: NodePort selector: app: react-frontend ports: - port: 3000 targetPort: 3000 nodePort: 30100 # 指定固定端口(范围30000-32767),方便测试
二、关键概念解释(新手必看)
- Deployment:用来管理Pod的生命周期,比如创建、重启、扩缩容,这里我们每个服务只跑1个副本,先跑通再说。
- Service:解决Pod IP不稳定的核心——Pod重启后IP会变,但Service的名字和地址是固定的。前端就是通过
node-backend-service:3001这个地址调用后端的,因为它们在同一个默认Namespace下,K8s内部会自动解析Service名称。 - NodePort:前端Service用了这个类型,这样我们可以通过
集群节点IP:30100从外部浏览器直接访问前端页面。
三、部署和测试步骤
- 把上面的两个文件保存到本地,执行部署命令:
kubectl apply -f node-backend.yaml kubectl apply -f react-frontend.yaml
- 查看Pod状态,等所有Pod都变成
Running:
kubectl get pods
- 访问前端:找到你的K8s集群节点IP(本地Minikube用
minikube ip获取),在浏览器打开http://<节点IP>:30100,就能看到前端加载出后端返回的数据了!
四、独立代码示例(如果你不想用YAML内嵌代码)
Node.js后端代码(app.js)
const express = require("express"); const app = express(); // 简单的API接口 app.get("/api/data", (req, res) => { res.json({ message: "Hello from Node.js Backend!", data: ["K8s入门", "后端服务", "前端调用"] }); }); const PORT = 3001; app.listen(PORT, () => { console.log(`Backend running on port ${PORT}`); });
你可以把这个代码打包成自己的Docker镜像,替换YAML里的image字段,比内嵌代码更规范。
React前端代码(src/App.js)
import { useEffect, useState } from "react"; function App() { const [backendData, setBackendData] = useState(null); useEffect(() => { // 关键:用Service名称作为域名,K8s内部自动解析 fetch("http://node-backend-service:3001/api/data") .then(response => response.json()) .then(data => setBackendData(data)) .catch(err => console.error("Error fetching data:", err)); }, []); return ( <div className="App"> <h1>React + K8s 入门示例</h1> {backendData ? ( <div> <h3>后端返回内容:</h3> <p>{backendData.message}</p> <ul> {backendData.data.map(item => ( <li key={item}>{item}</li> ))} </ul> </div> ) : ( <p>正在加载后端数据...</p> )} </div> ); } export default App;
五、新手小提示
- 查看后端日志用
kubectl logs <你的后端Pod名称>,能帮你排查问题。 - 后续可以学习Docker镜像构建,把前后端代码打包成私有镜像,替换YAML里的公共镜像,更贴近生产环境。
内容的提问来源于stack exchange,提问作者Peter Weyand
相关产品推荐
相关产品推荐

