Introducción: ¿Por qué Kubernetes para Node.js?
Las aplicaciones web modernas en JavaScript (Node.js) requieren alta disponibilidad, escalabilidad y tolerancia a fallos. Cuando tu aplicación supera los límites de un solo servidor, la gestión manual se convierte en una pesadilla. Aquí es donde Kubernetes (K8s) viene al rescate: un sistema de orquestación de contenedores que automatiza el despliegue, escalado y gestión de aplicaciones.
En esta guía, recorreremos el camino completo: desde una aplicación simple de Node.js hasta su ejecución en un entorno similar a producción en Kubernetes. Aprenderás cómo empaquetar el código en una imagen Docker, crear los recursos necesarios de K8s (Pod, Deployment, Service) y configurar el acceso desde el exterior.
1. Preparación de la aplicación en Node.js
Para empezar, crearemos una aplicación Express simple. Responderá a solicitudes HTTP y mostrará el nombre del host del contenedor (útil para verificar el balanceo de carga).
1.1. Archivo app.js
const express = require('express');const os = require('os');
const app = express();const PORT = process.env.PORT || 3000;
app.get('/', (req, res) => { res.json({ message: 'Hello from Node.js on Kubernetes!', hostname: os.hostname(), timestamp: new Date().toISOString() });});
app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);});1.2. Archivo package.json
{ "name": "k8s-node-app", "version": "1.0.0", "dependencies": { "express": "^4.18.2" }, "scripts": { "start": "node app.js" }}2. Contenerización: Imagen Docker
Kubernetes trabaja con contenedores. Crearemos un Dockerfile mínimo para nuestra aplicación Node.js. Usaremos la imagen oficial de Node.js y una compilación multi-etapa para optimizar el tamaño.
2.1. Dockerfile
FROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ci --only=production
FROM node:18-alpineWORKDIR /appCOPY --from=builder /app/node_modules ./node_modulesCOPY . .EXPOSE 3000CMD ["node", "app.js"]Construye la imagen y envíala a Docker Hub u otro registro:
docker build -t your-dockerhub/k8s-node-app:v1 .docker push your-dockerhub/k8s-node-app:v13. Despliegue en Kubernetes
Ahora pasemos a lo más importante: la creación de recursos de Kubernetes. Usaremos un Deployment (para gestionar los Pods) y un Service (para el acceso a la red).
3.1. Creación del Deployment
El Deployment garantiza que la cantidad deseada de Pods con tu aplicación esté siempre en ejecució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: your-dockerhub/k8s-node-app:v1 ports: - containerPort: 3000 env: - name: PORT value: "3000" resources: requests: memory: "64Mi" cpu: "100m" limits: memory: "128Mi" cpu: "200m"3.2. Creación del Service
El Service proporciona una dirección IP estable y un nombre DNS para acceder a los Pods. Crea service.yaml:
apiVersion: v1kind: Servicemetadata: name: node-app-servicespec: selector: app: node-app ports: - protocol: TCP port: 80 targetPort: 3000 type: ClusterIP3.3. Ejecución en el clúster
Ejecuta los comandos (asegúrate de tener kubectl configurado y acceso al clúster):
kubectl apply -f deployment.yamlkubectl app