Déploiement de Kotlin sur Kubernetes : guide de base pour débutants
\n\nKubernetes (K8s) est devenu le standard de facto pour l'orchestration de conteneurs dans le développement moderne. Si vous codez en Kotlin, que ce soit un backend Spring Boot, un microservice Ktor ou une application console, savoir le déployer dans un cluster Kubernetes est une compétence cruciale. Dans ce guide, nous allons parcourir le chemin d'une simple application Kotlin jusqu'à un pod en fonctionnement dans un cluster. Le contenu est conçu pour les débutants : pas de sujets complexes comme Service Mesh ou Helm, seulement les bases.
\n\n1. Préparation de l'application Kotlin pour la conteneurisation
\n\nAvant de penser à Kubernetes, nous devons empaqueter notre application dans une image Docker. Prenons l'exemple d'une API REST simple avec Ktor, un framework léger idéal pour les microservices.
\n\nCréons un fichier build.gradle.kts avec les dépendances minimales :
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Écrivons une application simple qui répond aux requêtes 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("Hello from Kotlin on Kubernetes!", ContentType.Text.Plain)\n }\n }\n }.start(wait = true)\n}\n\nL'application écoute sur le port 8080. C'est important à retenir — nous utiliserons ce port dans le Dockerfile et les manifestes.
\n\n2. Création de l'image Docker
\n\nPour construire l'image, nous avons besoin d'un Dockerfile. La meilleure pratique est d'utiliser une construction multi-étapes pour que l'image finale soit de taille minimale.
\n\nFROM 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\nConstruisons l'image et chargeons-la dans un registre (par exemple, Docker Hub) :
\n\ndocker build -t yourusername/kotlin-k8s-demo:v1 .\ndocker push yourusername/kotlin-k8s-demo:v1\n\nSi vous n'avez pas accès à un registre, vous pouvez utiliser minikube et charger l'image localement avec la commande minikube image load.
3. Manifestes Kubernetes de base
\n\nPassons maintenant à la partie la plus intéressante — la rédaction des manifestes YAML pour déployer l'application dans le cluster. Nous aurons besoin de deux objets de base : Deployment (gère les répliques de pods) et Service (assure l'accès aux pods).
3.1 Deployment
\n\nLe Deployment décrit l'état souhaité des pods : quelle image utiliser, combien de répliques, quels ports ouvrir.
\n\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 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