将 JavaScript (Node.js) 部署到 Kubernetes:基础实践指南
现代 Web 开发离不开容器化和编排。如果您使用 JavaScript (Node.js) 进行开发,迟早会面临一个问题:如何可靠地在生产环境中运行应用程序,确保其可扩展性和容错性?答案是 Kubernetes。这不仅仅是一个时髦的工具,更是管理容器化应用程序的事实标准。
在本指南中,我们将介绍将简单 Node.js 应用程序部署到 Kubernetes 的完整流程。您将学习如何将代码打包成 Docker 镜像、创建必要的清单文件,并在集群中运行所有内容。本材料面向已经熟悉 Node.js 基础知识并希望掌握 DevOps 实践的开发者。
1. 准备 Node.js 应用程序以进行容器化
在将应用程序部署到 Kubernetes 之前,需要将其打包到容器中。为此,我们将创建一个简单的 Express 应用程序。请确保您已安装 Node.js 和 npm。
创建文件 app.js:
const express = require('express');const app = express();const port = process.env.PORT || 3000;
app.get('/', (req, res) => { res.json({ message: 'Hello from Node.js on Kubernetes!' });});
app.get('/health', (req, res) => { res.status(200).send('OK');});
app.listen(port, () => { console.log(`Server running on port ${port}`);});务必添加 /health 端点——Kubernetes 将使用它进行存活检查(liveness probe)。
现在,在项目根目录下创建 Dockerfile:
FROM node:18-alpine
WORKDIR /usr/src/app
COPY package*.json ./RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]构建镜像并在本地测试:
docker build -t my-node-app:latest .docker run -p 3000:3000 my-node-app:latest打开 http://localhost:3000——您应该会看到 JSON 响应。
2. 用于 Node.js 的基本 Kubernetes 清单文件
Kubernetes 使用声明式配置(YAML)。要部署 Node.js 应用程序,我们至少需要两个基本资源:Deployment 和 Service。
2.1. Deployment
Deployment 管理应用程序的副本。创建文件 deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: node-app-deployment labels: app: node-appspec: replicas: 3 selector: matchLabels: app: node-app template: metadata: labels: app: node-app spec: containers: - name: node-app image: my-node-app:latest ports: - containerPort: 3000 env: - name: PORT value: "3000" livenessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: path: / port: 3000 initialDelaySeconds: 3 periodSeconds: 5重要事项:
replicas: 3— Kubernetes 将创建 3 个应用程序副本以实现容错。livenessProbe— 检查应用程序是否存活。如果没有响应,Kubernetes 将重启容器。readinessProbe— 检查应用程序是否准备好接收流量。在检查通过之前,Pod 不会收到请求。
2.2. Service
Service 提供对 Pod 的网络访问。创建 service.yaml:
apiVersion: v1kind: Servicemetadata: name: node-app-servicespec: selector: app: node-app ports: - protocol: TCP