引言:为什么要在 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 请求。
\n1.1. 创建简单服务器 (app.js)
\nconst 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\npackage.json 文件(依赖项):
{\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\n1.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
2. 为 Kubernetes 创建 YAML 清单
\nKubernetes 使用声明式方法:我们在 YAML 文件中描述系统的期望状态,而 K8s 会自动将一切调整到该状态。我们需要三个主要资源:Deployment、Service 和 Ingress。
\n2.1. Deployment (deployment.yaml)
\nDeployment 负责启动和更新 Pod(容器)。它确保所需数量的副本始终在运行。
\napiVersion: 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— 启