Introducción: por qué TypeScript y Kubernetes son la pareja ideal
\nEl desarrollo web moderno no solo requiere código de calidad, sino también una infraestructura confiable. TypeScript, como superconjunto tipado estáticamente sobre JavaScript, permite crear aplicaciones de servidor escalables con un mínimo de errores en tiempo de compilación. Kubernetes (K8s) es el estándar de facto para la orquestación de contenedores, proporcionando despliegue automático, escalado y gestión de aplicaciones.
\nEn esta guía, analizaremos en la práctica cómo construir una aplicación simple en TypeScript (Express API), empaquetarla en una imagen Docker y desplegarla en un clúster de Kubernetes. Obtendrás comandos listos, archivos de configuración y una explicación de cada paso. El material está dirigido a desarrolladores que ya conocen los fundamentos de TypeScript y desean aprender procesos de devops.
\nAl final del artículo, podrás desplegar proyectos TypeScript en un entorno de producción utilizando Kubernetes por tu cuenta.
\n\n1. Preparación de la aplicación TypeScript para contenerización
\n1.1. Creación de un servidor Express básico en TypeScript
\nPara la demostración, crearemos una API mínima en TypeScript. Asegúrate de tener Node.js y npm instalados.
\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\nCrea el archivo 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}\nAhora escribamos el servidor. Crea el archivo 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('¡Hola desde TypeScript en Kubernetes!');\n});\n\napp.listen(PORT, () => {\n console.log(`Servidor ejecutándose en el puerto ${PORT}`);\n});\nAgrega los scripts en package.json:
"scripts": {\n "build": "tsc",\n "start": "node dist/index.js",\n "dev": "nodemon src/index.ts"\n}\nVerifica la compilación: npm run build && npm start. El servidor debería iniciarse en el puerto 3000.
1.2. Optimización para producción
\nPara producción, es importante minimizar el tamaño de la imagen. Agrega el archivo .dockerignore:
node_modules\ndist\n.git\n*.md\n.env\nAsegúrate de que todas las dependencias estén listadas en dependencies (no en devDependencies), si son necesarias en tiempo de ejecución.
2. Construcción de la imagen Docker para la aplicación TypeScript
\n2.1. Escritura del Dockerfile
\nUsamos compilación en múltiples etapas (multi-stage build) para reducir el tamaño de la imagen final.
\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"]\nPuntos clave:
\n- \n
npm ci— instalación rápida y determinista de dependencias. \n - La segunda capa contiene solo el JS compilado y los módulos necesarios. \n
- La imagen base
node:18-alpinepesa solo ~120 MB. \n
2.2. Construcción y verificación de la imagen
\ndocker build -t ts-k8s-app:latest .\ndocker run -p 3000:3000 ts-k8s-app:latest\nAbre http://localhost:3000/health — deberías ver una respuesta JSON. Si en