Despliegue de TypeScript en Kubernetes: guía básica práctica

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: por qué TypeScript y Kubernetes son la pareja ideal

\n

El 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.

\n

En 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.

\n

Al final del artículo, podrás desplegar proyectos TypeScript en un entorno de producción utilizando Kubernetes por tu cuenta.

\n\n

1. Preparación de la aplicación TypeScript para contenerización

\n

1.1. Creación de un servidor Express básico en TypeScript

\n

Para la demostración, crearemos una API mínima en TypeScript. Asegúrate de tener Node.js y npm instalados.

\n
mkdir ts-k8s-app\ncd ts-k8s-app\nnpm init -y\nnpm install express\nnpm install -D typescript @types/node @types/express ts-node nodemon
\n

Crea el archivo tsconfig.json:

\n
{\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}
\n

Ahora escribamos el servidor. Crea el archivo src/index.ts:

\n
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});
\n

Agrega los scripts en package.json:

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

Verifica la compilación: npm run build && npm start. El servidor debería iniciarse en el puerto 3000.

\n\n

1.2. Optimización para producción

\n

Para producción, es importante minimizar el tamaño de la imagen. Agrega el archivo .dockerignore:

\n
node_modules\ndist\n.git\n*.md\n.env
\n

Asegúrate de que todas las dependencias estén listadas en dependencies (no en devDependencies), si son necesarias en tiempo de ejecución.

\n\n

2. Construcción de la imagen Docker para la aplicación TypeScript

\n

2.1. Escritura del Dockerfile

\n

Usamos 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"]
\n

Puntos 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-alpine pesa solo ~120 MB.
  • \n
\n\n

2.2. Construcción y verificación de la imagen

\n
docker build -t ts-k8s-app:latest .\ndocker run -p 3000:3000 ts-k8s-app:latest
\n

Abre http://localhost:3000/health — deberías ver una respuesta JSON. Si en

Blogs

Book Recommendations