Despliegue de Kotlin en Kubernetes: guía básica
El desarrollo moderno es impensable sin contenedores y orquestación. Kubernetes (K8s) se ha convertido en el estándar para gestionar microservicios, y Kotlin en uno de los lenguajes más populares para crear aplicaciones backend robustas. En esta guía recorreremos el camino desde una aplicación simple en Kotlin hasta su despliegue completo en un clúster de Kubernetes. Aprenderá cómo empaquetar el código en una imagen Docker, escribir manifiestos y configurar el acceso al servicio.
1. Preparación de la aplicación Kotlin
Como ejemplo, tomaremos una API REST simple con Ktor, un framework ligero para Kotlin. Crearemos el archivo Main.kt:
import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.routing.*import io.ktor.http.*import io.ktor.server.response.*
fun main() { embeddedServer(Netty, port = 8080) { routing { get("/") { call.respondText("Hello from Kotlin on K8s!", ContentType.Text.Plain) } get("/health") { call.respondText("OK", ContentType.Text.Plain) } } }.start(wait = true)}Este código inicia un servidor en el puerto 8080 con dos endpoints: raíz y health check. Asegúrese de que en build.gradle.kts estén incluidas las dependencias de Ktor y Netty.
2. Creación de la imagen Docker
Para el despliegue en Kubernetes, la aplicación debe estar empaquetada en un contenedor. Crearemos un Dockerfile en la raíz del proyecto:
FROM gradle:8.5-jdk21 AS buildWORKDIR /appCOPY build.gradle.kts settings.gradle.kts ./COPY src ./srcRUN gradle build --no-daemon
FROM openjdk:21-jdk-slimWORKDIR /appCOPY --from=build /app/build/libs/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]La compilación se realiza en dos etapas: primero la compilación con Gradle, luego la copia del archivo JAR a una imagen limpia. Construya la imagen con el comando:
docker build -t my-kotlin-app:1.0 .Para publicar en un registro (por ejemplo, Docker Hub), ejecute:
docker tag my-kotlin-app:1.0 yourusername/my-kotlin-app:1.0docker push yourusername/my-kotlin-app:1.03. Manifiestos de Kubernetes
Ahora crearemos los archivos YAML para el despliegue en el clúster. Empezamos con deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: kotlin-appspec: replicas: 2 selector: matchLabels: app: kotlin-app template: metadata: labels: app: kotlin-app spec: containers: - name: kotlin-app image: yourusername/my-kotlin-app:1.0 ports: - containerPort: 8080 livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 3 periodSeconds: 5Este manifiesto crea dos réplicas de la aplicación, añade comprobaciones de actividad y disponibilidad. A continuación, service.yaml:
apiVersion: v1kind: Servicemetadata: name: kotlin-app-svcspec: selector: app: kotlin-app ports: - port: 80 targetPort: 8080 type: ClusterIPEl servicio dirige el tráfico del puerto 80 al puerto 8080 del contenedor. Si necesita acceso externo, cambie el tipo a NodePort o LoadBalancer.
4. Configuración de Ingress y despliegue
Para el enrutamiento de solicitudes externas, utilizamos un controlador Ingress. Cree ingress.yaml:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: kotlin-app-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /spec: rules: - host: kotlin.example.com http:```