نشر Kotlin على Kubernetes: دليل أساسي عملي
\n\nالتطوير الحديث يتطلب بشكل متزايد ليس فقط كتابة كود عالي الجودة، ولكن أيضًا نشره بشكل صحيح. أصبح Kubernetes المعيار الفعلي لتنسيق الحاويات. في هذا الدليل، سنشرح كيفية حزم تطبيق Kotlin في حاوية Docker ونشره في كتلة Kubernetes. ستحصل على مانيفستات جاهزة وأمثلة عملية بلغة Kotlin (باستخدام إطار العمل Ktor).
\n\n1. تحضير تطبيق Kotlin
\n\nللتجربة، سنأخذ واجهة REST API بسيطة على Ktor. تأكد من إعداد Gradle (أو Maven) مع إضافة application.
مثال 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\nأبسط نقطة نهاية (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\nقم ببناء ملف JAR الضخم باستخدام الأمر:
\n./gradlew shadowJar\n\nسيظهر ملف JAR الجاهز في build/libs/.
2. إنشاء صورة Docker
\n\nأنشئ ملف Dockerfile في جذر المشروع:
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\nقم ببناء الصورة وإرسالها إلى السجل (مثل Docker Hub):
\ndocker build -t yourusername/kotlin-k8s-demo:v1 .\ndocker push yourusername/kotlin-k8s-demo:v1\n\nتأكد من استبدال yourusername باسم المستخدم الخاص بك في Docker Hub أو حدد عنوان السجل الخاص.
3. مانيفستات Kubernetes
\n\nللنشر، سنحتاج إلى ملفين YAML: Deployment (يدير البودات) و Service (يفتح الوصول).
\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\nقم بتطبيق المانيفستات:
\nkubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\n\nتحقق من الحالة:
\nkubectl get pods\nkubectl