Bereitstellung von Kotlin auf Kubernetes: Ein grundlegender Leitfaden für Anfänger

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Bereitstellung von Kotlin auf Kubernetes: Ein grundlegender Leitfaden für Anfänger

\n\n

Kubernetes (K8s) ist zum De-facto-Standard für die Container-Orchestrierung in der modernen Entwicklung geworden. Wenn Sie in Kotlin schreiben, sei es ein Backend mit Spring Boot, ein Microservice mit Ktor oder eine Konsolenanwendung, ist die Fähigkeit, diese in einem Kubernetes-Cluster bereitzustellen, eine kritisch wichtige Fähigkeit. In diesem Leitfaden gehen wir den Weg von einer einfachen Kotlin-Anwendung bis zu einem laufenden Pod im Cluster. Das Material richtet sich an Anfänger: keine komplexen Themen wie Service Mesh oder Helm – nur die Grundlagen.

\n\n

1. Vorbereitung der Kotlin-Anwendung für die Containerisierung

\n\n

Bevor wir über Kubernetes nachdenken, müssen wir unsere Anwendung in ein Docker-Image verpacken. Betrachten wir ein Beispiel einer einfachen REST-API mit Ktor – einem leichtgewichtigen Framework, das sich ideal für Microservices eignet.

\n\n

Erstellen wir eine Datei build.gradle.kts mit minimalen Abhängigkeiten:

\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

Schreiben wir eine einfache Anwendung, die auf GET-Anfragen antwortet:

\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("Hello from Kotlin on Kubernetes!", ContentType.Text.Plain)\n            }\n        }\n    }.start(wait = true)\n}
\n\n

Die Anwendung lauscht auf Port 8080. Dies ist wichtig zu merken – wir werden diesen Port im Dockerfile und in den Manifesten verwenden.

\n\n

2. Erstellung des Docker-Images

\n\n

Für den Bau des Images benötigen wir ein Dockerfile. Die beste Praxis ist die Verwendung eines Multi-Stage-Builds, damit das endgültige Image minimal in der Größe ist.

\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

Bauen wir das Image und laden es in eine Registry (z. B. Docker Hub) hoch:

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

Wenn Sie keinen Zugriff auf eine Registry haben, können Sie minikube verwenden und das Image lokal mit dem Befehl minikube image load laden.

\n\n

3. Grundlegende Kubernetes-Manifeste

\n\n

Kommen wir nun zum interessantesten Teil – dem Schreiben von YAML-Manifesten für die Bereitstellung der Anwendung im Cluster. Wir benötigen zwei grundlegende Objekte: Deployment (verwaltet die Pod-Replikate) und Service (stellt den Zugriff auf die Pods sicher).

\n\n

3.1 Deployment

\n\n

Das Deployment beschreibt den gewünschten Zustand der Pods: welches Image verwendet werden soll, wie viele Replikate, welche Ports geöffnet werden sollen.

\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: yourusername/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

Buchempfehlungen