Kotlin auf Kubernetes bereitstellen: Grundlagenanleitung in der Praxis
\n\nDie moderne Entwicklung erfordert zunehmend nicht nur das Schreiben von qualitativ hochwertigem Code, sondern auch dessen fachgerechte Bereitstellung. Kubernetes hat sich zum De-facto-Standard für die Container-Orchestrierung entwickelt. In dieser Anleitung werden wir durchgehen, wie man eine Kotlin-Anwendung in einen Docker-Container packt und in einem Kubernetes-Cluster bereitstellt. Sie erhalten fertige Manifeste und praktische Beispiele in Kotlin (unter Verwendung des Ktor-Frameworks).
\n\n1. Vorbereitung der Kotlin-Anwendung
\n\nZur Demonstration nehmen wir eine einfache REST-API mit Ktor. Stellen Sie sicher, dass Sie Gradle (oder Maven) mit dem application-Plugin eingerichtet haben.
Beispiel 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\nDer einfachste Endpunkt (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\nErstellen Sie das Fat-JAR mit dem Befehl:
\n./gradlew shadowJar\n\nDas fertige JAR erscheint in build/libs/.
2. Erstellen des Docker-Images
\n\nErstellen Sie eine Datei Dockerfile im Projektstammverzeichnis:
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\nErstellen Sie das Image und senden Sie es an eine Registry (z.B. Docker Hub):
\ndocker build -t yourusername/kotlin-k8s-demo:v1 .\ndocker push yourusername/kotlin-k8s-demo:v1\n\nErsetzen Sie yourusername unbedingt durch Ihren eigenen Login bei Docker Hub oder geben Sie die Adresse einer privaten Registry an.
3. Kubernetes-Manifeste
\n\nFür die Bereitstellung benötigen wir zwei YAML-Dateien: Deployment (verwaltet die Pods) und Service (ermöglicht den Zugriff).
\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: yourusername/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\nWenden Sie die Manifeste an:
\nkubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\n\nÜberprüfen Sie den Status:
\nkubectl get pods\nkubectl