在 Kubernetes 上部署 TypeScript:基础指南

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

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

开始课程

将 TypeScript 部署到 Kubernetes:基础指南



现代 Web 开发越来越需要不仅编写高质量的代码,还要正确部署应用程序。TypeScript 凭借其严格的类型检查和强大的工具,已成为 Node.js 后端服务的热门选择。然而,如果没有正确的部署,即使完美的代码也只会停留在本地机器上。Kubernetes 作为容器编排的标准,可以自动化部署、扩展和管理应用程序。在本指南中,我们将逐步讲解将 TypeScript 应用程序部署到 Kubernetes 的过程。



1. 准备 TypeScript 应用程序进行容器化

在将代码发送到集群之前,必须确保应用程序已准备好可以在容器中运行。我们来看一个使用 Express.js 和 TypeScript 的典型项目。



项目结构

my-ts-app/├── src/│   ├── index.ts│   └── routes/├── dist/├── package.json├── tsconfig.json└── Dockerfile


配置 tsconfig.json

确保 TypeScript 编译器将项目构建到 dist 文件夹:

{  "compilerOptions": {    "target": "ES2020",    "module": "commonjs",    "outDir": "./dist",    "rootDir": "./src",    "strict": true,    "esModuleInterop": true  },  "include": ["src/**/*"]}


简单的服务器 (src/index.ts)

import express, { Request, Response } from 'express';

const app = express();const PORT = process.env.PORT || 3000;

app.get('/health', (_req: Request, res: Response) => { res.json({ status: 'ok', timestamp: new Date().toISOString() });});

app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);});


在 package.json 中添加脚本:

"scripts": {  "build": "tsc",  "start": "node dist/index.js",  "dev": "ts-node src/index.ts"}


2. 为 TypeScript 构建 Docker 镜像

容器化是部署到 Kubernetes 之前的关键步骤。我们使用多阶段构建来减小镜像大小。



Dockerfile

# Stage 1: BuildFROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ciCOPY tsconfig.json ./COPY src/ ./src/RUN npm run build

# Stage 2: ProductionFROM 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"]


构建镜像并将其推送到仓库(例如 Docker Hub):

docker build -t yourusername/my-ts-app:v1 .docker push yourusername/my-ts-app:v1


3. 编写 Kubernetes 清单文件

要部署到 Kubernetes,至少需要两个资源:Deployment(管理 Pod)和 Service(访问应用程序)。



deployment.yaml

apiVersion: apps/v1kind: Deploymentmetadata:  name: my-ts-app  labels:    app: my-ts-appspec:  replicas: 2  selector:    matchLabels:      app: my-ts-app  template:    metadata:      labels:        app: my-ts-app    spec:      containers:      - name: app        image: yourusername/my-ts-app:v1        ports:        - containerPort: 3000        env:        - name: PORT          value: "3000"        livenessProbe:          httpGet:            path: /health            port: 3000          initialDelaySeconds: 5          periodSeconds: 10        readinessProbe:          httpGet:            path: /health            port: 3000          initialDelaySeconds: 3          periodSeconds: 5


service.yaml

apiVersion: v1kind: Servicemetadata:  name: my-ts-app-servicespec:  selector:    app: my-ts-app  ports:  - protocol: T                

博客

书籍推荐