Despliegue de TypeScript en Kubernetes: guía básica para principiantes
\n\nEl desarrollo web moderno es impensable sin contenerización y orquestación. Si escribes en TypeScript y quieres que tu aplicación funcione de manera estable, se escale automáticamente y sea tolerante a fallos — Kubernetes (K8s) será tu mejor amigo. En esta guía, desglosaremos paso a paso cómo empaquetar una aplicación TypeScript en Docker y desplegarla en un clúster de Kubernetes. El material está pensado para principiantes: nada de magia, solo ejemplos claros y explicaciones.
\n\n1. Preparación de la aplicación TypeScript
\n\nAntes de pensar en Kubernetes, debemos asegurarnos de que tu aplicación esté lista para funcionar en un contenedor. Crearemos un servidor HTTP simple con Express y TypeScript.
\n\n1.1. Inicialización del proyecto
\nCrea una carpeta para el proyecto e inicialízalo:
\nmkdir my-ts-app && cd my-ts-app\nnpm init -y\nnpm install express\nnpm install -D typescript @types/node @types/express ts-node nodemon\n\n1.2. Configuración de TypeScript
\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 "skipLibCheck": true\n },\n "include": ["src/**/*"],\n "exclude": ["node_modules", "dist"]\n}\n\n1.3. Código de la aplicación
\nCrea la carpeta src y el archivo index.ts:
import express, { Request, Response } from 'express';\n\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.get('/', (req: Request, res: Response) => {\n res.json({ message: 'Hello from TypeScript on Kubernetes!' });\n});\n\napp.listen(PORT, () => {\n console.log(`Server running on port ${PORT}`);\n});\n\n1.4. Compilación y ejecución
\nAñade los scripts en package.json:
"scripts": {\n "build": "tsc",\n "start": "node dist/index.js",\n "dev": "ts-node src/index.ts"\n}\nVerifica la ejecución local: npm run dev y abre http://localhost:3000.
2. Contenerización con Docker
\n\nKubernetes trabaja con contenedores. Necesitamos crear una imagen Docker de nuestra aplicación TypeScript.
\n\n2.1. Dockerfile
\nCrea el archivo Dockerfile en la raíz del proyecto:
FROM node:18-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci\nCOPY . .\nRUN npm run build\n\nFROM node:18-alpine AS production\nWORKDIR /app\nCOPY --from=builder /app/dist ./dist\nCOPY --from=builder /app/package*.json ./\nRUN npm ci --only=production\nEXPOSE 3000\nCMD ["node", "dist/index.js"]\nUsamos una compilación multi-etapa: primero compilamos TypeScript, luego creamos una imagen final ligera.
\n\n2.2. Compilación de la imagen
\ndocker build -t my-ts-app:latest .\nVerifica localmente:
\ndocker run -p 3000:3000 my-ts-app:latest\n\n2.3. .dockerignore
\nPara no copiar archivos innecesarios, crea .dockerignore:
node_modules\ndist\n.git\n*.md\n\n3. Despliegue en Kubernetes
\n\nAhora que tenemos la imagen Docker, podemos pasar a Kubernetes. Para pruebas locales recomiendo Minikube o Kind.
\n\n3.1. Iniciar Minikube
\nminikube start --driver=docker\nminikube status\n\n3.2. Cargar la imagen en Minikube
\nPara que Kubernetes pueda encontrar nuestra imagen, cárgala en el entorno de Minikube:
\nminikube image load my-ts-app:latest\n\n3.3. Crear el Deployment
\nCrea el archivo deployment.yaml:
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: my-ts-app-deployment\nspec:\n replicas: 2\n selector:\n matchLabels:\n app: my-ts