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

如何在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从外部浏览器直接访问前端页面。

三、部署和测试步骤

  1. 把上面的两个文件保存到本地,执行部署命令:
kubectl apply -f node-backend.yaml
kubectl apply -f react-frontend.yaml
  1. 查看Pod状态,等所有Pod都变成Running:
kubectl get pods
  1. 访问前端:找到你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:36:08