Despliegue de una aplicación Kotlin en Kubernetes: guía paso a paso

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Despliegue de Kotlin en Kubernetes: guía básica en la práctica

\n\n

El 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\n

1. Preparación de la aplicación Kotlin

\n\n

Para la demostración, tomaremos una API REST simple en Ktor. Asegúrese de tener configurado Gradle (o Maven) con el plugin application.

\n\n

Ejemplo de build.gradle.kts:

\n
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\n

El endpoint más simple (src/main/kotlin/com/example/Application.kt):

\n
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\n

Construya el fat JAR con el comando:

\n
./gradlew shadowJar
\n\n

El JAR listo aparecerá en build/libs/.

\n\n

2. Creación de la imagen Docker

\n\n

Cree un archivo Dockerfile en la raíz del proyecto:

\n
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\n

Construya la imagen y envíela a un registro (por ejemplo, Docker Hub):

\n
docker build -t tuusuario/kotlin-k8s-demo:v1 .\ndocker push tuusuario/kotlin-k8s-demo:v1
\n\n

Asegúrese de reemplazar tuusuario con su nombre de usuario en Docker Hub o especifique la dirección de un registro privado.

\n\n

3. Manifiestos de Kubernetes

\n\n

Para el despliegue necesitaremos dos archivos YAML: Deployment (gestiona los pods) y Service (abre el acceso).

\n\n

3.1. Deployment (deployment.yaml)

\n
apiVersion: 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\n

3.2. Service (service.yaml)

\n
apiVersion: 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\n

Aplique los manifiestos:

\n
kubectl apply -f deployment.yaml\nkubectl apply -f service.yaml
\n\n

Verifique el estado:

\n
kubectl get pods\nkubectl                

Blogs

Book Recommendations