Despliegue de TypeScript en Kubernetes: guía básica
El desarrollo web moderno cada vez requiere no solo escribir código de calidad, sino también un despliegue adecuado de las aplicaciones. TypeScript, gracias a su tipado estricto y potentes herramientas, se ha convertido en una opción popular para servicios backend en Node.js. Sin embargo, sin un despliegue correcto, incluso el código perfecto permanecerá en la máquina local. Kubernetes — el estándar de orquestación de contenedores — permite automatizar el despliegue, escalado y gestión de aplicaciones. En esta guía, analizaremos el proceso paso a paso para desplegar una aplicación TypeScript en Kubernetes.
1. Preparación de la aplicación TypeScript para contenerización
Antes de enviar el código al clúster, es necesario asegurarse de que la aplicación esté lista para funcionar en un contenedor. Consideremos un proyecto típico con Express.js y TypeScript.
Estructura del proyecto
my-ts-app/├── src/│ ├── index.ts│ └── routes/├── dist/├── package.json├── tsconfig.json└── DockerfileConfiguración de tsconfig.json
Asegúrese de que el compilador de TypeScript compile el proyecto en la carpeta dist:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true }, "include": ["src/**/*"]}Servidor simple (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}`);});Agregue scripts en package.json:
"scripts": { "build": "tsc", "start": "node dist/index.js", "dev": "ts-node src/index.ts"}2. Construcción de la imagen Docker para TypeScript
La contenerización es un paso clave antes del despliegue en Kubernetes. Usamos compilación en múltiples etapas (multi-stage build) para reducir el tamaño de la imagen.
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"]Construya la imagen y envíela al registro (por ejemplo, Docker Hub):
docker build -t yourusername/my-ts-app:v1 .docker push yourusername/my-ts-app:v13. Escritura de manifiestos de Kubernetes
Para el despliegue en Kubernetes se necesitan al menos dos recursos: Deployment (gestión de pods) y Service (acceso a la aplicación).
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