Deploy von TypeScript auf Kubernetes: Grundlagenleitfaden
Die moderne Webentwicklung erfordert zunehmend nicht nur das Schreiben von qualitativ hochwertigem Code, sondern auch eine kompetente Bereitstellung von Anwendungen. TypeScript ist dank seiner strengen Typisierung und leistungsstarken Werkzeuge zu einer beliebten Wahl für Backend-Dienste auf Node.js geworden. Ohne das richtige Deployment bleibt jedoch selbst perfekter Code auf dem lokalen Rechner. Kubernetes – der Standard für die Container-Orchestrierung – ermöglicht die Automatisierung von Bereitstellung, Skalierung und Verwaltung von Anwendungen. In diesem Leitfaden gehen wir den schrittweisen Prozess des Deployments einer TypeScript-Anwendung auf Kubernetes durch.
1. Vorbereitung der TypeScript-Anwendung für die Containerisierung
Bevor der Code an den Cluster gesendet wird, muss sichergestellt werden, dass die Anwendung bereit für den Betrieb in einem Container ist. Betrachten wir ein typisches Projekt mit Express.js und TypeScript.
Projektstruktur
my-ts-app/├── src/│ ├── index.ts│ └── routes/├── dist/├── package.json├── tsconfig.json└── DockerfileKonfiguration von tsconfig.json
Stellen Sie sicher, dass der TypeScript-Compiler das Projekt in den Ordner dist kompiliert:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true }, "include": ["src/**/*"]}Einfacher Server (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}`);});Fügen Sie Skripte in package.json hinzu:
"scripts": { "build": "tsc", "start": "node dist/index.js", "dev": "ts-node src/index.ts"}2. Erstellung des Docker-Images für TypeScript
Die Containerisierung ist ein entscheidender Schritt vor dem Deployment in Kubernetes. Wir verwenden einen mehrstufigen Build (multi-stage build), um die Image-Größe zu reduzieren.
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"]Erstellen Sie das Image und senden Sie es an eine Registry (z. B. Docker Hub):
docker build -t yourusername/my-ts-app:v1 .docker push yourusername/my-ts-app:v13. Schreiben von Kubernetes-Manifesten
Für das Deployment in Kubernetes werden mindestens zwei Ressourcen benötigt: Deployment (Verwaltung der Pods) und Service (Zugriff auf die Anwendung).
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: 5service.yaml
apiVersion: v1kind: Servicemetadata: name: my-ts-app-servicespec: selector: app: my-ts-app ports: - protocol: T