Despliegue de Kotlin en Kubernetes: guía básica para principiantes

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 para principiantes

\n\n

Kubernetes (K8s) se ha convertido en el estándar de facto para la orquestación de contenedores en el desarrollo moderno. Si programas en Kotlin, ya sea un backend con Spring Boot, un microservicio con Ktor o una aplicación de consola, saber cómo desplegarlo en un clúster de Kubernetes es una habilidad críticamente importante. En esta guía, recorreremos el camino desde una aplicación simple de Kotlin hasta un pod en funcionamiento en el clúster. El material está diseñado para principiantes: nada de temas complejos como Service Mesh o Helm, solo lo básico.

\n\n

1. Preparación de la aplicación Kotlin para la contenerización

\n\n

Antes de pensar en Kubernetes, debemos empaquetar nuestra aplicación en una imagen Docker. Consideremos el ejemplo de una API REST simple con Ktor, un framework ligero ideal para microservicios.

\n\n

Creemos el archivo build.gradle.kts con las dependencias mínimas:

\n\n
plugins {\n    kotlin("jvm") version "1.9.0"\n    application\n}\n\napplication {\n    mainClass.set("com.example.AppKt")\n}\n\ndependencies {\n    implementation("io.ktor:ktor-server-netty:2.3.0")\n    implementation("io.ktor:ktor-server-content-negotiation:2.3.0")\n    implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.0")\n}
\n\n

Escribamos una aplicación simple que responda a solicitudes GET:

\n\n
// src/main/kotlin/com/example/App.kt\npackage 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.http.*\n\nfun main() {\n    embeddedServer(Netty, port = 8080) {\n        routing {\n            get("/") {\n                call.respondText("¡Hola desde Kotlin en Kubernetes!", ContentType.Text.Plain)\n            }\n        }\n    }.start(wait = true)\n}
\n\n

La aplicación escucha en el puerto 8080. Es importante recordar esto, ya que usaremos este puerto en el Dockerfile y en los manifiestos.

\n\n

2. Creación de la imagen Docker

\n\n

Para construir la imagen, necesitamos un Dockerfile. La mejor práctica es usar una compilación multi-etapa para que la imagen final sea de tamaño mínimo.

\n\n
FROM gradle:7.6-jdk17 AS build\nWORKDIR /app\nCOPY build.gradle.kts settings.gradle.kts ./\nCOPY src ./src\nRUN gradle build --no-daemon\n\nFROM openjdk:17-jre-slim\nWORKDIR /app\nCOPY --from=build /app/build/libs/*.jar app.jar\nEXPOSE 8080\nENTRYPOINT ["java", "-jar", "app.jar"]
\n\n

Construyamos la imagen y subámosla a un registro (por ejemplo, Docker Hub):

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

Si no tienes acceso a un registro, puedes usar minikube y cargar la imagen localmente con el comando minikube image load.

\n\n

3. Manifiestos básicos de Kubernetes

\n\n

Ahora pasemos a la parte más interesante: escribir los manifiestos YAML para desplegar la aplicación en el clúster. Necesitaremos dos objetos básicos: Deployment (gestiona las réplicas de los pods) y Service (proporciona acceso a los pods).

\n\n

3.1 Deployment

\n\n

El Deployment describe el estado deseado de los pods: qué imagen usar, cuántas réplicas, qué puertos abrir.

\n\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: tunombredeusuario/kotlin-k8s-demo:v1\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: /\n            port: 8080\n          initialDelaySeconds: 10\n          periodSeconds: 5\n        readinessProbe:\n          httpGet:\n                

Blogs

Book Recommendations