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

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

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

开始课程

引言:为什么要在 Kubernetes 上部署 JavaScript?

\n

现代 JavaScript 网络开发(尤其是 Node.js)越来越需要的不仅仅是在一台服务器上运行应用程序,而是构建一个容错、可扩展且易于管理的基础设施。Kubernetes (K8s) 是容器编排的事实标准。如果您使用 Node.js 编写代码,并希望您的应用程序能够承受峰值负载、在故障后自动恢复并轻松实现无停机更新,那么您需要 Kubernetes。

\n

在本指南中,我们将介绍将简单 Node.js 应用程序部署到 Kubernetes 集群的基本过程。您将学习如何准备 Docker 镜像、编写必要的 YAML 清单(Deployment、Service、Ingress)以及启动应用程序。本文面向已经熟悉 Node.js 和 Docker 基础知识,但刚刚开始进入 Kubernetes 世界的开发者。

\n
\n

1. 准备 Node.js 应用程序和 Docker 镜像

\n

首先,我们需要一个要部署的应用程序。让我们创建一个基于 Express 的简单 HTTP 服务器,用于响应 GET 请求。

\n

1.1. 创建简单服务器 (app.js)

\n
const express = require('express');\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.get('/', (req, res) => {\n  res.send('Hello from Node.js on Kubernetes!');\n});\n\napp.listen(PORT, () => {\n  console.log(`Server running on port ${PORT}`);\n});\n
\n

package.json 文件(依赖项):

\n
{\n  "name": "k8s-node-app",\n  "version": "1.0.0",\n  "main": "app.js",\n  "scripts": {\n    "start": "node app.js"\n  },\n  "dependencies": {\n    "express": "^4.18.2"\n  }\n}\n
\n

1.2. Node.js 的 Dockerfile

\n

为了让 Kubernetes 能够运行我们的应用程序,需要将其打包到容器中。我们使用官方的 Node.js 镜像(版本 18 LTS)。

\n
# 使用官方 Node.js 镜像\nFROM node:18-alpine\n\n# 设置容器内的工作目录\nWORKDIR /usr/src/app\n\n# 复制 package.json 和 package-lock.json\nCOPY package*.json ./\n\n# 安装依赖项\nRUN npm install --production\n\n# 复制应用程序源代码\nCOPY . .\n\n# 指定应用程序监听的端口\nEXPOSE 3000\n\n# 启动应用程序的命令\nCMD ["node", "app.js"]\n
\n

构建镜像并推送到仓库:

\n
# 构建镜像\ndocker build -t my-registry/node-app:v1 .\n\n# 推送到 Docker Hub 或您的私有仓库\ndocker push my-registry/node-app:v1\n
\n

将 my-registry 替换为您仓库的名称(例如,docker.io/username/node-app)。

\n
\n

2. 为 Kubernetes 创建 YAML 清单

\n

Kubernetes 使用声明式方法:我们在 YAML 文件中描述系统的期望状态,而 K8s 会自动将一切调整到该状态。我们需要三个主要资源:Deployment、Service 和 Ingress。

\n

2.1. Deployment (deployment.yaml)

\n

Deployment 负责启动和更新 Pod(容器)。它确保所需数量的副本始终在运行。

\n
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: node-app-deployment\n  labels:\n    app: node-app\nspec:\n  replicas: 3  # 副本数量(应用程序的副本数)\n  selector:\n    matchLabels:\n      app: node-app\n  template:\n    metadata:\n      labels:\n        app: node-app\n    spec:\n      containers:\n      - name: node-app\n        image: my-registry/node-app:v1\n        ports:\n        - containerPort: 3000\n        env:\n        - name: PORT\n          value: "3000"\n        resources:\n          requests:\n            memory: "64Mi"\n            cpu: "250m"\n          limits:\n            memory: "128Mi"\n            cpu: "500m"\n
\n

关键点:

\n
    \n
  • replicas: 3 — 启

博客

书籍推荐