نشر Kotlin على Kubernetes: دليل أساسي للمبتدئين
\n\nأصبح Kubernetes (K8s) المعيار الفعلي لتنسيق الحاويات في التطوير الحديث. إذا كنت تكتب بلغة Kotlin، سواء كان ذلك خلفية (باك إند) باستخدام Spring Boot، أو خدمة مصغرة باستخدام Ktor، أو تطبيق وحدة تحكم، فإن القدرة على نشره في مجموعة Kubernetes هي مهارة بالغة الأهمية. في هذا الدليل، سننتقل من تطبيق Kotlin بسيط إلى بود (Pod) عامل في المجموعة. المادة موجهة للمبتدئين: لا توجد مواضيع معقدة مثل Service Mesh أو Helm - فقط الأساسيات.
\n\n1. تحضير تطبيق Kotlin للحاويات
\n\nقبل التفكير في Kubernetes، نحتاج إلى حزم تطبيقنا في صورة Docker. لننظر في مثال لواجهة برمجة تطبيقات REST بسيطة باستخدام Ktor - وهو إطار عمل خفيف الوزن مثالي للخدمات المصغرة.
\n\nلننشئ ملف build.gradle.kts مع الحد الأدنى من التبعيات:
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لنكتب تطبيقًا بسيطًا يستجيب لطلبات 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\nيستمع التطبيق على المنفذ 8080. من المهم تذكر ذلك - سنستخدم هذا المنفذ في ملف Dockerfile والمانيفستات.
\n\n2. إنشاء صورة Docker
\n\nلبناء الصورة، سنحتاج إلى Dockerfile. أفضل ممارسة هي استخدام بناء متعدد المراحل (multi-stage build) لجعل الصورة النهائية صغيرة الحجم قدر الإمكان.
\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\nلنبن الصورة ونرفعها إلى السجل (على سبيل المثال، Docker Hub):
\n\ndocker build -t yourusername/kotlin-k8s-demo:v1 .\ndocker push yourusername/kotlin-k8s-demo:v1\n\nإذا لم يكن لديك وصول إلى السجل، يمكنك استخدام minikube وتحميل الصورة محليًا باستخدام الأمر minikube image load.
3. المانيفستات الأساسية لـ Kubernetes
\n\nالآن ننتقل إلى الجزء الأكثر إثارة للاهتمام - كتابة مانيفستات YAML لنشر التطبيق في المجموعة. سنحتاج إلى كائنين أساسيين: Deployment (يدير نسخ البودات) و Service (يوفر الوصول إلى البودات).
3.1 Deployment
\n\nيصف Deployment الحالة المرغوبة للبودات: الصورة التي سيتم استخدامها، عدد النسخ، المنافذ التي سيتم فتحها.
\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