Déploiement de Kotlin sur Kubernetes : guide pratique de base
\n\nLe développement moderne exige de plus en plus non seulement l'écriture d'un code de qualité, mais aussi son déploiement judicieux. Kubernetes est devenu le standard de facto pour l'orchestration de conteneurs. Dans ce guide, nous allons voir comment empaqueter une application Kotlin dans un conteneur Docker et la déployer dans un cluster Kubernetes. Vous obtiendrez des manifestes prêts à l'emploi et des exemples pratiques en Kotlin (avec le framework Ktor).
\n\n1. Préparation de l'application Kotlin
\n\nPour la démonstration, prenons une simple API REST avec Ktor. Assurez-vous d'avoir configuré Gradle (ou Maven) avec le plugin application.
Exemple 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\nLe point d'accès le plus 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\nConstruisez le fat JAR avec la commande :
\n./gradlew shadowJar\n\nLe JAR prêt apparaîtra dans build/libs/.
2. Création de l'image Docker
\n\nCréez un fichier Dockerfile à la racine du projet :
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\nConstruisez l'image et envoyez-la dans un registre (par exemple, Docker Hub) :
\ndocker build -t votrenomutilisateur/kotlin-k8s-demo:v1 .\ndocker push votrenomutilisateur/kotlin-k8s-demo:v1\n\nRemplacez impérativement votrenomutilisateur par votre identifiant Docker Hub ou indiquez l'adresse de votre registre privé.
3. Manifestes Kubernetes
\n\nPour le déploiement, nous aurons besoin de deux fichiers YAML : Deployment (gère les pods) et Service (ouvre l'accès).
\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: votrenomutilisateur/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\nAppliquez les manifestes :
\nkubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\n\nVérifiez le statut :
\nkubectl get pods\nkubectl