引言:为何要将 JavaScript 部署到 Kubernetes?
现代 Web 开发离不开容器化。如果您使用 JavaScript (Node.js) 进行开发,并希望您的应用程序稳定运行、自动扩展且具备高可用性——那么 Kubernetes (K8s) 将成为您最好的伙伴。
Kubernetes 是一个容器编排平台。它管理着您应用程序的部署、扩展和运行。在本指南中,我们将介绍如何将一个简单的 Node.js 应用程序基本部署到 Kubernetes。您将学习如何将代码打包成 Docker 镜像,以及如何创建 Pod、Service 和 Deployment。
本文面向 初学者。假设您已经安装了 Docker 和 Minikube(或者可以访问 K8s 集群)。
步骤 1:准备 Node.js 应用程序和 Docker 镜像
首先,我们创建一个基于 Express 的简单 Web 应用程序。它将响应 HTTP 请求。
1.1. 应用程序代码 (app.js)
创建文件 app.js:
const express = require('express');const app = express();const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => { res.send('来自 Kubernetes 的问候!');});
app.listen(PORT, () => { console.log(`服务器已在端口 ${PORT} 上启动`);});1.2. package.json 文件
创建 package.json:
{ "name": "k8s-node-app", "version": "1.0.0", "main": "app.js", "scripts": { "start": "node app.js" }, "dependencies": { "express": "^4.18.2" }}1.3. Dockerfile
现在创建用于构建镜像的 Dockerfile:
FROM node:18-alpine
WORKDIR /usr/src/app
COPY package*.json ./RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]1.4. 构建并推送镜像
执行命令:
docker build -t my-node-app:v1 .如果您使用 Minikube,请在其环境中构建镜像:
minikube image build -t my-node-app:v1 .或者,将镜像推送到 Docker Hub/任意镜像仓库,并在清单文件中指定它。
步骤 2:Kubernetes 核心对象(Pod、Deployment、Service)
Kubernetes 通过对象进行管理。部署时需要三个核心对象:
- Pod — 最小单元,包含一个或多个容器。
- Deployment — 管理 Pod,提供扩缩容和更新能力。
- Service — 提供访问 Pod 的稳定入口(通常通过 ClusterIP 或 NodePort)。
2.1. 创建 Deployment
创建文件 deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: node-app-deploymentspec: replicas: 3 selector: matchLabels: app: node-app template: metadata: labels: app: node-app spec: containers: - name: node-app image: my-node-app:v1 ports: - containerPort: 3000 env: - name: PORT value: "3000"说明:
replicas: 3— 启动 3 个应用副本以实现高可用性。selector和labels— 将 Deployment 与 Pod 关联。image— 您的 Docker 镜像名称。
2.2. 创建 Service
创建文件 service.yaml 以访问应用程序:
apiVersion: v1kind: Servicemetadata: name: node-app-servicespec: selector: app: node-app ports: - protocol: TCP port: 80 targetPort: 3000 type: NodePort这里发生了什么:
- Service 将流量从端口