Despliegue de Kotlin en Kubernetes: guía básica en la práctica
\n\nEl desarrollo moderno cada vez más requiere no solo escribir código de calidad, sino también su correcto despliegue. Kubernetes se ha convertido en el estándar de facto para la orquestación de contenedores. En esta guía, veremos cómo empaquetar una aplicación Kotlin en un contenedor Docker y desplegarla en un clúster de Kubernetes. Obtendrá manifiestos listos y ejemplos prácticos en Kotlin (usando el framework Ktor).
\n\n1. Preparación de la aplicación Kotlin
\n\nPara la demostración, tomaremos una API REST simple en Ktor. Asegúrese de tener configurado Gradle (o Maven) con el plugin application.
Ejemplo de build.gradle.kts:
plugins {\n kotlin("jvm") version "1.9.22"\n application\n id("com.github.johnrengelman.shadow") version "8.1.1"\n}\n\napplication {\n mainClass.set("com.example.ApplicationKt")\n}\n\ndependencies {\n implementation("io.ktor:ktor-server-netty:2.3.7")\n implementation("io.ktor:ktor-server-content-negotiation:2.3.7")\n implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")\n}\n\nEl endpoint más simple (src/main/kotlin/com/example/Application.kt):
package com.example\n\nimport io.ktor.server.engine.*\nimport io.ktor.server.netty.*\nimport io.ktor.server.routing.*\nimport io.ktor.server.response.*\nimport io.ktor.serialization.kotlinx.json.*\nimport io.ktor.server.plugins.contentnegotiation.*\n\nfun main() {\n embeddedServer(Netty, port = 8080) {\n install(ContentNegotiation) {\n json()\n }\n routing {\n get("/") {\n call.respond(mapOf("message" to "Hello from Kotlin on K8s!"))\n }\n get("/health") {\n call.respond(mapOf("status" to "UP"))\n }\n }\n }.start(wait = true)\n}\n\nConstruya el fat JAR con el comando:
\n./gradlew shadowJar\n\nEl JAR listo aparecerá en build/libs/.
2. Creación de la imagen Docker
\n\nCree un archivo Dockerfile en la raíz del proyecto:
FROM openjdk:17-jdk-slim\n\nWORKDIR /app\n\nCOPY build/libs/*-all.jar app.jar\n\nEXPOSE 8080\n\nENTRYPOINT ["java", "-jar", "app.jar"]\n\nConstruya la imagen y envíela a un registro (por ejemplo, Docker Hub):
\ndocker build -t tuusuario/kotlin-k8s-demo:v1 .\ndocker push tuusuario/kotlin-k8s-demo:v1\n\nAsegúrese de reemplazar tuusuario con su nombre de usuario en Docker Hub o especifique la dirección de un registro privado.
3. Manifiestos de Kubernetes
\n\nPara el despliegue necesitaremos dos archivos YAML: Deployment (gestiona los pods) y Service (abre el acceso).
\n\n3.1. Deployment (deployment.yaml)
\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: kotlin-app\nspec:\n replicas: 2\n selector:\n matchLabels:\n app: kotlin-app\n template:\n metadata:\n labels:\n app: kotlin-app\n spec:\n containers:\n - name: kotlin-app\n image: tuusuario/kotlin-k8s-demo:v1\n ports:\n - containerPort: 8080\n livenessProbe:\n httpGet:\n path: /health\n port: 8080\n initialDelaySeconds: 5\n periodSeconds: 10\n readinessProbe:\n httpGet:\n path: /health\n port: 8080\n initialDelaySeconds: 3\n periodSeconds: 5\n\n3.2. Service (service.yaml)
\napiVersion: v1\nkind: Service\nmetadata:\n name: kotlin-app-service\nspec:\n selector:\n app: kotlin-app\n ports:\n - port: 80\n targetPort: 8080\n type: LoadBalancer\n\nAplique los manifiestos:
\nkubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\n\nVerifique el estado:
\nkubectl get pods\nkubectl