Despliegue de JavaScript (Node.js) en Kubernetes: guía básica práctica
El desarrollo web moderno es impensable sin contenedorización y orquestación. Si programas en JavaScript (Node.js), tarde o temprano surgirá la pregunta: ¿cómo ejecutar la aplicación en producción de manera confiable, garantizar su escalabilidad y alta disponibilidad? La respuesta es Kubernetes. No es solo una herramienta de moda, sino el estándar de facto para gestionar aplicaciones contenedorizadas.
En esta guía, analizaremos el ciclo completo de despliegue de una aplicación Node.js simple en Kubernetes. Aprenderás cómo empaquetar el código en una imagen Docker, crear los manifiestos necesarios y ejecutar todo en un clúster. El material está dirigido a desarrolladores que ya conocen los fundamentos de Node.js y desean aprender prácticas de DevOps.
1. Preparación de la aplicación Node.js para la contenedorización
Antes de desplegar la aplicación en Kubernetes, debes empaquetarla en un contenedor. Para ello, crearemos una aplicación Express simple. Asegúrate de tener instalados Node.js y npm.
Crea el archivo app.js:
const express = require('express');const app = express();const port = process.env.PORT || 3000;
app.get('/', (req, res) => { res.json({ message: 'Hello from Node.js on Kubernetes!' });});
app.get('/health', (req, res) => { res.status(200).send('OK');});
app.listen(port, () => { console.log(`Server running on port ${port}`);});Es importante agregar el endpoint /health — Kubernetes lo usará para verificar el estado de funcionamiento (liveness probe).
Ahora crea el Dockerfile en la raíz del proyecto:
FROM node:18-alpine
WORKDIR /usr/src/app
COPY package*.json ./RUN npm install --production
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]Construye la imagen y pruébala localmente:
docker build -t my-node-app:latest .docker run -p 3000:3000 my-node-app:latestAbre http://localhost:3000 — deberías ver una respuesta JSON.
2. Manifiestos básicos de Kubernetes para Node.js
Kubernetes trabaja con configuraciones declarativas (YAML). Para desplegar una aplicación Node.js, necesitaremos al menos dos recursos principales: Deployment y Service.
2.1. Deployment
El Deployment gestiona las réplicas de tu aplicación. Crea el archivo deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: node-app-deployment labels: app: node-appspec: replicas: 3 selector: matchLabels: app: node-app template: metadata: labels: app: node-app spec: containers: - name: node-app image: my-node-app:latest ports: - containerPort: 3000 env: - name: PORT value: "3000" livenessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: path: / port: 3000 initialDelaySeconds: 3 periodSeconds: 5Puntos importantes:
replicas: 3— Kubernetes creará 3 copias de tu aplicación para alta disponibilidad.livenessProbe— verifica si la aplicación está activa. Si no hay respuesta, Kubernetes reiniciará el contenedor.readinessProbe— verifica si la aplicación está lista para recibir tráfico. Hasta que la verificación no sea exitosa, el pod no recibe solicitudes.
2.2. Service
El Service proporciona acceso de red a los pods. Crea service.yaml:
apiVersion: v1kind: Servicemetadata: name: node-app-servicespec: selector: app: node-app ports: - protocol: TCP