引言:为什么在 Node.js 中使用 Kubernetes?
现代 JavaScript (Node.js) Web 应用程序需要高可用性、可扩展性和容错能力。当您的应用程序超出单台服务器的范围时,手动管理将变成一场噩梦。这时 Kubernetes (K8s) 就派上了用场——它是一个容器编排系统,可以自动完成应用程序的部署、扩展和管理。
在本指南中,我们将走完完整的流程:从一个简单的 Node.js 应用程序开始,到将其部署到 Kubernetes 上类似生产的环境中。您将学习如何将代码打包成 Docker 镜像、创建必要的 K8s 资源(Pod、Deployment、Service)以及配置外部访问。
1. 准备 Node.js 应用程序
首先,我们创建一个简单的 Express 应用程序。它将响应 HTTP 请求并输出容器的主机名(这对于检查负载均衡很有用)。
1.1. app.js 文件
const express = require('express');
const os = require('os');
const app = express();
const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => {
res.json({
message: 'Hello from Node.js on Kubernetes!',
hostname: os.hostname(),
timestamp: new Date().toISOString()
});
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
1.2. package.json 文件
{
"name": "k8s-node-app",
"version": "1.0.0",
"dependencies": {
"express": "^4.18.2"
},
"scripts": {
"start": "node app.js"
}
}
2. 容器化:Docker 镜像
Kubernetes 使用容器工作。让我们为 Node.js 应用程序创建一个最小的 Dockerfile。我们使用官方的 Node.js 镜像和多阶段构建来优化大小。
2.1. Dockerfile
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
构建镜像并将其推送到 Docker Hub 或其他仓库:
docker build -t your-dockerhub/k8s-node-app:v1 .
docker push your-dockerhub/k8s-node-app:v1
3. 部署到 Kubernetes
现在进入最重要的部分——创建 Kubernetes 资源。我们将使用 Deployment(用于管理 Pod)和 Service(用于网络访问)。
3.1. 创建 Deployment
Deployment 确保运行所需数量的包含您应用程序的 Pod。创建 deployment.yaml 文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-app-deployment
labels:
app: node-app
spec:
replicas: 3
selector:
matchLabels:
app: node-app
template:
metadata:
labels:
app: node-app
spec:
containers:
- name: node-app
image: your-dockerhub/k8s-node-app:v1
ports:
- containerPort: 3000
env:
- name: PORT
value: "3000"
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
3.2. 创建 Service
Service 为访问 Pod 提供稳定的 IP 地址和 DNS 名称。创建 service.yaml:
apiVersion: v1
kind: Service
metadata:
name: node-app-service
spec:
selector:
app: node-app
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: ClusterIP
3.3. 在集群上启动
执行以下命令(请确保您已配置好 kubectl 并且可以访问集群):
kubectl apply -f deployment.yaml
kubectl app