Déploiement de Kotlin sur Kubernetes : guide de base
Le développement moderne est impensable sans conteneurisation et orchestration. Kubernetes (K8s) est devenu la norme pour la gestion des microservices, et Kotlin l'un des langages les plus populaires pour créer des applications backend fiables. Dans ce guide, nous allons parcourir le chemin d'une simple application Kotlin jusqu'à son déploiement complet dans un cluster Kubernetes. Vous apprendrez comment empaqueter le code dans une image Docker, rédiger des manifestes et configurer l'accès au service.
1. Préparation de l'application Kotlin
Pour l'exemple, prenons une simple API REST avec Ktor — un framework léger pour Kotlin. Créons le fichier Main.kt :
import io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.routing.*import io.ktor.http.*import io.ktor.server.response.*
fun main() { embeddedServer(Netty, port = 8080) { routing { get("/") { call.respondText("Hello from Kotlin on K8s!", ContentType.Text.Plain) } get("/health") { call.respondText("OK", ContentType.Text.Plain) } } }.start(wait = true)}Ce code démarre un serveur sur le port 8080 avec deux endpoints : la racine et le health check. Assurez-vous que les dépendances Ktor et Netty sont incluses dans build.gradle.kts.
2. Construction de l'image Docker
Pour le déploiement dans Kubernetes, l'application doit être empaquetée dans un conteneur. Créons un Dockerfile à la racine du projet :
FROM gradle:8.5-jdk21 AS buildWORKDIR /appCOPY build.gradle.kts settings.gradle.kts ./COPY src ./srcRUN gradle build --no-daemon
FROM openjdk:21-jdk-slimWORKDIR /appCOPY --from=build /app/build/libs/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]La construction s'effectue en deux étapes : d'abord la compilation avec Gradle, puis la copie du fichier JAR dans une image propre. Construisez l'image avec la commande :
docker build -t my-kotlin-app:1.0 .Pour publier dans un registre (par exemple, Docker Hub), exécutez :
docker tag my-kotlin-app:1.0 yourusername/my-kotlin-app:1.0docker push yourusername/my-kotlin-app:1.03. Manifestes Kubernetes
Créons maintenant les fichiers YAML pour le déploiement dans le cluster. Commençons par deployment.yaml :
apiVersion: apps/v1kind: Deploymentmetadata: name: kotlin-appspec: replicas: 2 selector: matchLabels: app: kotlin-app template: metadata: labels: app: kotlin-app spec: containers: - name: kotlin-app image: yourusername/my-kotlin-app:1.0 ports: - containerPort: 8080 livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 3 periodSeconds: 5Ce manifeste crée deux réplicas de l'application, ajoute des sondes de vivacité et de disponibilité. Ensuite, service.yaml :
apiVersion: v1kind: Servicemetadata: name: kotlin-app-svcspec: selector: app: kotlin-app ports: - port: 80 targetPort: 8080 type: ClusterIPLe service dirige le trafic du port 80 vers le port 8080 du conteneur. Si un accès externe est nécessaire, modifiez le type en NodePort ou LoadBalancer.
4. Configuration d'Ingress et déploiement
Pour le routage des requêtes depuis l'extérieur, utilisez un contrôleur Ingress. Créez ingress.yaml :
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: kotlin-app-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /spec: rules: - host: kotlin.example.com http: