将 TypeScript 部署到 Kubernetes:初学者基础指南
现代 Web 开发离不开容器化和编排。如果您使用 TypeScript 编写代码,并希望您的应用程序稳定运行、自动扩展且具备高可用性——Kubernetes (K8s) 将成为您最好的朋友。在本指南中,我们将逐步讲解如何将 TypeScript 应用程序打包到 Docker 中,并将其部署到 Kubernetes 集群。本材料面向初学者:没有魔法,只有清晰的示例和解释。
1. 准备 TypeScript 应用程序
在考虑 Kubernetes 之前,需要确保您的应用程序已准备好运行在容器中。我们将使用 Express 和 TypeScript 创建一个简单的 HTTP 服务器。
1.1. 初始化项目
创建项目文件夹并执行初始化:
mkdir my-ts-app && cd my-ts-appnpm init -ynpm install expressnpm install -D typescript @types/node @types/express ts-node nodemon1.2. TypeScript 配置
创建 tsconfig.json 文件:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true, "skipLibCheck": true }, "include": ["src/**/*"], "exclude": ["node_modules", "dist"]}1.3. 应用程序代码
创建 src 文件夹和 index.ts 文件:
import express, { Request, Response } from 'express';
const app = express();const PORT = process.env.PORT || 3000;
app.get('/', (req: Request, res: Response) => { res.json({ message: 'Hello from TypeScript on Kubernetes!' });});
app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);});1.4. 构建与运行
在 package.json 中添加脚本:
"scripts": { "build": "tsc", "start": "node dist/index.js", "dev": "ts-node src/index.ts"}检查本地运行:执行 npm run dev 并打开 http://localhost:3000。
2. 使用 Docker 进行容器化
Kubernetes 使用容器运行。我们需要为 TypeScript 应用程序创建 Docker 镜像。
2.1. Dockerfile
在项目根目录创建 Dockerfile 文件:
FROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run build
FROM node:18-alpine AS productionWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/package*.json ./RUN npm ci --only=productionEXPOSE 3000CMD ["node", "dist/index.js"]我们使用多阶段构建:首先编译 TypeScript,然后创建轻量级的最终镜像。
2.2. 构建镜像
docker build -t my-ts-app:latest .本地验证:
docker run -p 3000:3000 my-ts-app:latest2.3. .dockerignore
为避免复制多余文件,创建 .dockerignore 文件:
node_modulesdist.git*.md3. 部署到 Kubernetes
现在我们已经有了 Docker 镜像,可以进入 Kubernetes 阶段。对于本地测试,推荐使用 Minikube 或 Kind。
3.1. 启动 Minikube
minikube start --driver=dockerminikube status3.2. 将镜像加载到 Minikube
为了让 Kubernetes 能找到我们的镜像,将其加载到 Minikube 环境中:
minikube image load my-ts-app:latest3.3. 创建 Deployment
创建 deployment.yaml 文件:
apiVersion: apps/v1kind: Deploymentmetadata: name: my-ts-app-deploymentspec: replicas: 2 selector: matchLabels: app: my-ts