引言:为什么 TypeScript 和 Kubernetes 是理想组合
\n现代 Web 开发不仅需要高质量的代码,还需要可靠的基础设施。TypeScript 作为 JavaScript 的静态类型超集,能够在编译阶段最大限度地减少错误,从而构建可扩展的服务器端应用。Kubernetes (K8s) 是容器编排的事实标准,提供自动部署、扩展和应用管理功能。
\n在本指南中,我们将实践如何构建一个简单的 TypeScript 应用(Express API),将其打包成 Docker 镜像,并部署到 Kubernetes 集群中。您将获得现成的命令、配置文件以及每一步的详细解释。本教程面向已经熟悉 TypeScript 基础并希望掌握 devops 流程的开发者。
\n到文章结尾,您将能够独立地将 TypeScript 项目部署到使用 Kubernetes 的生产环境中。
\n\n1. 准备 TypeScript 应用以进行容器化
\n1.1. 创建基于 TypeScript 的基本 Express 服务器
\n为了演示,我们将创建一个基于 TypeScript 的最小 API。请确保您已安装 Node.js 和 npm。
\nmkdir ts-k8s-app\ncd ts-k8s-app\nnpm init -y\nnpm install express\nnpm install -D typescript @types/node @types/express ts-node nodemon\n创建 tsconfig.json 文件:
{\n "compilerOptions": {\n "target": "ES2020",\n "module": "commonjs",\n "outDir": "./dist",\n "rootDir": "./src",\n "strict": true,\n "esModuleInterop": true\n },\n "include": ["src/**/*"]\n}\n现在编写服务器代码。创建文件 src/index.ts:
import express, { Request, Response } from 'express';\n\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.get('/health', (_req: Request, res: Response) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n});\n\napp.get('/', (_req: Request, res: Response) => {\n res.send('Hello from TypeScript on Kubernetes!');\n});\n\napp.listen(PORT, () => {\n console.log(`Server running on port ${PORT}`);\n});\n在 package.json 中添加脚本:
"scripts": {\n "build": "tsc",\n "start": "node dist/index.js",\n "dev": "nodemon src/index.ts"\n}\n验证构建:运行 npm run build && npm start。服务器应该在 3000 端口启动。
1.2. 为生产环境优化
\n对于生产环境,最小化镜像大小非常重要。添加 .dockerignore 文件:
node_modules\ndist\n.git\n*.md\n.env\n确保所有运行时需要的依赖都列在 dependencies 中(而不是 devDependencies)。
2. 为 TypeScript 应用构建 Docker 镜像
\n2.1. 编写 Dockerfile
\n我们使用多阶段构建来减小最终镜像的大小。
\n# Stage 1: Build\nFROM node:18-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY . .\nRUN npm run build\n\n# Stage 2: Production\nFROM node:18-alpine\nWORKDIR /app\nCOPY --from=builder /app/dist ./dist\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY --from=builder /app/package.json ./\nEXPOSE 3000\nCMD ["node", "dist/index.js"]\n关键点:
\n- \n
npm ci— 快速且确定性地安装依赖。 \n - 第二阶段仅包含编译后的 JS 文件和必要的模块。 \n
- 基础镜像
node:18-alpine仅约 120 MB。 \n
2.2. 构建并验证镜像
\ndocker build -t ts-k8s-app:latest .\ndocker run -p 3000:3000 ts-k8s-app:latest\n打开 http://localhost:3000/health — 您应该会看到 JSON 响应。如果