Introducción: ¿Por qué desplegar JavaScript en Kubernetes?
\n\nEl desarrollo web moderno es impensable sin la contenerización. Si escribes en JavaScript (Node.js) y quieres que tu aplicación funcione de manera estable, se escale automáticamente y sea tolerante a fallos — Kubernetes (K8s) se convertirá en tu mejor amigo.
\n\nKubernetes es una plataforma de orquestación de contenedores. Gestiona el despliegue, el escalado y el funcionamiento de tus aplicaciones. En esta guía, analizaremos el despliegue básico de una aplicación simple de Node.js en Kubernetes. Aprenderás cómo empaquetar el código en una imagen Docker, crear un Pod, un Service y un Deployment.
\n\nEl artículo está dirigido a principiantes. Se asume que ya tienes instalados Docker y Minikube (o acceso a un clúster de K8s).
\n\nPaso 1: Preparación de la aplicación Node.js y la imagen Docker
\n\nPara empezar, crearemos una aplicación web simple con Express. Responderá a las solicitudes HTTP.
\n\n1.1. Código de la aplicación (app.js)
\n\nCrea el archivo app.js:
const express = require('express');\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.get('/', (req, res) => {\n res.send('¡Hola desde Kubernetes!');\n});\n\napp.listen(PORT, () => {\n console.log(`Servidor iniciado en el puerto ${PORT}`);\n});\n\n\n1.2. Archivo package.json
\n\nCrea el package.json:
{\n "name": "k8s-node-app",\n "version": "1.0.0",\n "main": "app.js",\n "scripts": {\n "start": "node app.js"\n },\n "dependencies": {\n "express": "^4.18.2"\n }\n}\n\n\n1.3. Dockerfile
\n\nAhora crearemos el Dockerfile para construir la imagen:
FROM node:18-alpine\n\nWORKDIR /usr/src/app\n\nCOPY package*.json ./\nRUN npm install\n\nCOPY . .\n\nEXPOSE 3000\n\nCMD ["node", "app.js"]\n\n\n1.4. Construcción y carga de la imagen
\n\nEjecuta los comandos:
\n\ndocker build -t my-node-app:v1 .\n\n\nSi usas Minikube, construye la imagen dentro de su entorno:
\n\nminikube image build -t my-node-app:v1 .\n\n\nO sube la imagen a Docker Hub / cualquier registry e indícala en el manifiesto.
\n\nPaso 2: Objetos básicos de Kubernetes (Pod, Deployment, Service)
\n\nKubernetes trabaja con objetos. Para el despliegue necesitaremos tres principales:
\n\n- \n
- Pod — la unidad mínima, uno o varios contenedores. \n
- Deployment — gestiona los Pods, proporciona escalado y actualizaciones. \n
- Service — un punto de acceso estable a los Pods (generalmente a través de ClusterIP o NodePort). \n
2.1. Creación del Deployment
\n\nCrea el archivo deployment.yaml:
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: node-app-deployment\nspec:\n replicas: 3\n selector:\n matchLabels:\n app: node-app\n template:\n metadata:\n labels:\n app: node-app\n spec:\n containers:\n - name: node-app\n image: my-node-app:v1\n ports:\n - containerPort: 3000\n env:\n - name: PORT\n value: "3000"\n\n\nExplicación:
\n- \n
replicas: 3— ejecutaremos 3 copias de la aplicación para tolerancia a fallos. \n selectorylabels— vinculan el Deployment con los Pods. \n image— el nombre de tu imagen Docker. \n
2.2. Creación del Service
\n\nCrea el archivo service.yaml para acceder a la aplicación:
apiVersion: v1\nkind: Service\nmetadata:\n name: node-app-service\nspec:\n selector:\n app: node-app\n ports:\n - protocol: TCP\n port: 80\n targetPort: 3000\n type: NodePort\n\n\n¿Qué sucede aquí?
\n- \n
- El Service redirige el tráfico desde el puerto