Einleitung: Warum TypeScript und Kubernetes ein ideales Paar sind
\nModerne Webentwicklung erfordert nicht nur qualitativ hochwertigen Code, sondern auch eine zuverlässige Infrastruktur. TypeScript, als statisch typisierte Erweiterung von JavaScript, ermöglicht die Erstellung skalierbarer Serveranwendungen mit minimalen Fehlern während der Kompilierung. Kubernetes (K8s) ist der De-facto-Standard für die Container-Orchestrierung und gewährleistet automatisches Deployment, Skalierung und Verwaltung von Anwendungen.
\nIn diesem Handbuch werden wir praktisch durchgehen, wie man eine einfache TypeScript-Anwendung (Express API) erstellt, sie in ein Docker-Image packt und in einem Kubernetes-Cluster bereitstellt. Sie erhalten fertige Befehle, Konfigurationsdateien und eine Erklärung jedes Schrittes. Das Material richtet sich an Entwickler, die bereits mit den Grundlagen von TypeScript vertraut sind und DevOps-Prozesse erlernen möchten.
\nAm Ende dieses Artikels werden Sie in der Lage sein, TypeScript-Projekte selbstständig in einer Produktionsumgebung mit Kubernetes bereitzustellen.
\n\n1. Vorbereitung der TypeScript-Anwendung für die Containerisierung
\n1.1. Erstellung eines einfachen Express-Servers mit TypeScript
\nZur Demonstration erstellen wir eine minimale API mit TypeScript. Stellen Sie sicher, dass Node.js und npm installiert sind.
\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\nErstellen Sie 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}\nSchreiben wir nun den Server selbst. Erstellen Sie die Datei 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});\nFügen Sie Skripte in package.json hinzu:
"scripts": {\n "build": "tsc",\n "start": "node dist/index.js",\n "dev": "nodemon src/index.ts"\n}\nÜberprüfen Sie den Build: npm run build && npm start. Der Server sollte auf Port 3000 laufen.
1.2. Optimierung für die Produktion
\nFür die Produktion ist es wichtig, die Image-Größe zu minimieren. Fügen Sie .dockerignore hinzu:
node_modules\ndist\n.git\n*.md\n.env\nStellen Sie sicher, dass alle Abhängigkeiten in dependencies (nicht in devDependencies) aufgeführt sind, wenn sie zur Laufzeit benötigt werden.
2. Erstellung des Docker-Images für die TypeScript-Anwendung
\n2.1. Schreiben des Dockerfile
\nWir verwenden einen mehrstufigen Build (multi-stage build), um die Größe des endgültigen Images zu reduzieren.
\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"]\nWichtige Punkte:
\n- \n
npm ci— schnelle und deterministische Installation von Abhängigkeiten. \n - Die zweite Schicht enthält nur den kompilierten JS-Code und die erforderlichen Module. \n
- Das Basis-Image
node:18-alpinewiegt nur etwa 120 MB. \n
2.2. Bau und Überprüfung des Images
\ndocker build -t ts-k8s-app:latest .\ndocker run -p 3000:3000 ts-k8s-app:latest\nÖffnen Sie http://localhost:3000/health — Sie sollten eine JSON-Antwort sehen. Wenn in