Despliegue de aplicaciones Java en Kubernetes: desde Dockerfile hasta un servicio en funcionamiento
\n\nEl desarrollo moderno de Java es impensable sin contenerización y orquestación. Kubernetes (K8s) se ha convertido en el estándar para la gestión de microservicios, y saber desplegar aplicaciones Java en un clúster es una habilidad obligatoria para cualquier desarrollador backend. En este artículo, analizaremos en la práctica el ciclo completo de despliegue: desde la construcción de la imagen Docker con la aplicación Java hasta la configuración del balanceo de carga a través de Ingress.
\n\n1. Preparación de la aplicación Java y Dockerfile
\n\nAntes de llegar a Kubernetes, su aplicación Java debe estar empaquetada en una imagen Docker. Consideremos el caso clásico: una aplicación Spring Boot compilada en un archivo JAR.
\n\nCompilación del proyecto
\nSupongamos que tenemos un proyecto que se compila con Maven. Ejecute el comando en la raíz del proyecto:
\nmvn clean package -DskipTests\nComo resultado, en la carpeta target/ aparecerá el archivo my-app-1.0.0.jar.
Creación del Dockerfile
\nPara minimizar el tamaño de la imagen y aumentar la seguridad, utilizamos una compilación en múltiples etapas (multi-stage build).
\n# Stage 1: compilación\nFROM maven:3.8.6-openjdk-17 AS builder\nWORKDIR /app\nCOPY pom.xml .\nRUN mvn dependency:go-offline -B\nCOPY src ./src\nRUN mvn package -DskipTests\n\n# Stage 2: imagen final\nFROM openjdk:17-jdk-slim\nWORKDIR /app\nCOPY --from=builder /app/target/my-app-1.0.0.jar app.jar\nEXPOSE 8080\nENTRYPOINT ["java", "-jar", "app.jar"]\n\nCompilación y publicación de la imagen
\ndocker build -t my-java-app:1.0.0 .\ndocker tag my-java-app:1.0.0 your-dockerhub/my-java-app:1.0.0\ndocker push your-dockerhub/my-java-app:1.0.0\n\n2. Creación de manifiestos de Kubernetes
\n\nKubernetes utiliza un enfoque declarativo. Describiremos el estado deseado del sistema en archivos YAML.
\n\nDeployment — gestión de pods
\nCree el archivo deployment.yaml:
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: java-app-deployment\n labels:\n app: java-app\nspec:\n replicas: 3\n selector:\n matchLabels:\n app: java-app\n template:\n metadata:\n labels:\n app: java-app\n spec:\n containers:\n - name: java-app\n image: your-dockerhub/my-java-app:1.0.0\n ports:\n - containerPort: 8080\n resources:\n requests:\n memory: "256Mi"\n cpu: "250m"\n limits:\n memory: "512Mi"\n cpu: "500m"\n livenessProbe:\n httpGet:\n path: /actuator/health\n port: 8080\n initialDelaySeconds: 30\n periodSeconds: 10\n readinessProbe:\n httpGet:\n path: /actuator/health\n port: 8080\n initialDelaySeconds: 20\n periodSeconds: 5\n\nService — garantizar el acceso
\nCree el archivo service.yaml:
apiVersion: v1\nkind: Service\nmetadata:\n name: java-app-service\nspec:\n selector:\n app: java-app\n ports:\n - protocol: TCP\n port: 80\n targetPort: 8080\n type: ClusterIP\n\nConfigMap — externalización de la configuración
\nPara almacenar variables de entorno, cree configmap.yaml:
apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: app-config\ndata:\n SPRING_PROFILES_ACTIVE: "prod"\n DB_URL: "jdbc:postgresql://postgres-service:5432/mydb"\n\n3. Despliegue en el clúster y verificación
\n\nAhora aplicaremos todos los manifiestos al clúster. Asegúrese de tener configurado kubectl y de estar conectado al contexto correcto.
Aplicación de los manifiestos
\nkubectl apply -f configmap.yaml\nkubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\n\nVerificación del estado
\nkubectl get pods\nkubectl get deployments\nkubectl get services\nDebería