将 JavaScript (Node.js) 部署到 Kubernetes:分步指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么在 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                

博客

书籍推荐