Introducción: ¿Por qué Kubernetes para el desarrollador Java?
El desarrollo moderno de Java cada vez va más allá de la simple ejecución de archivos JAR en un servidor. La arquitectura de microservicios, la necesidad de escalado horizontal y la tolerancia a fallos llevan al uso de contenedores y orquestadores. Kubernetes (K8s) se ha convertido en el estándar de facto para la gestión de aplicaciones contenerizadas. En esta guía, analizaremos cómo realizar el despliegue de una aplicación Java típica (por ejemplo, en Spring Boot) en un clúster de Kubernetes. Aprenderá cómo empaquetar la aplicación en una imagen Docker, crear los manifiestos necesarios y ejecutarla.
1. Preparación de la aplicación Java y creación de la imagen Docker
Antes de llegar a Kubernetes, la aplicación Java debe estar empaquetada en un contenedor. Consideremos un ejemplo simple en Spring Boot.
1.1. Ejemplo de aplicación Java
Creemos un controlador REST mínimo que devuelva la versión de la aplicación:
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication@RestControllerpublic class App { public static void main(String[] args) { SpringApplication.run(App.class, args); }
@GetMapping("/") public String home() { return "Java App running on Kubernetes v1.0"; }}1.2. Creación del Dockerfile
Para aplicaciones Java, es óptimo usar la compilación en múltiples etapas (multi-stage build) para reducir el tamaño de la imagen final:
FROM maven:3.8.6-eclipse-temurin-17 AS builderWORKDIR /appCOPY pom.xml .RUN mvn dependency:go-offline -BCOPY src ./srcRUN mvn package -DskipTests
FROM eclipse-temurin:17-jre-alpineWORKDIR /appCOPY --from=builder /app/target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]1.3. Creación y publicación de la imagen
Construya la imagen y envíela a un registro (por ejemplo, Docker Hub):
docker build -t yourusername/java-k8s-demo:1.0 .docker push yourusername/java-k8s-demo:1.02. Objetos principales de Kubernetes para el despliegue de Java
Para el despliegue de una aplicación Java se necesitan al menos dos recursos: Deployment (gestiona réplicas y actualizaciones) y Service (proporciona acceso de red).
2.1. Manifiesto del Deployment
Cree un archivo deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: java-app labels: app: java-appspec: replicas: 2 selector: matchLabels: app: java-app template: metadata: labels: app: java-app spec: containers: - name: java-app image: yourusername/java-k8s-demo:1.0 ports: - containerPort: 8080 resources: requests: memory: "256Mi" cpu: "250m" limits: memory: "512Mi" cpu: "500m" livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 20 periodSeconds: 5Importante: Para Spring Boot, use Actuator para health checks. Especifique requests y limits para que Kubernetes distribuya los recursos correctamente.
2.2. Manifiesto del Service
Cree service.yaml para el acceso interno a los pods:
apiVersion: v1kind: Servicemetadata: name: java-app-servicespec: selector: app: java-app ports: - protocol: TCP port