نشر Kotlin على Kubernetes: دليل أساسي
التطوير الحديث لا يمكن تصوره بدون الحاويات والتنسيق. أصبح Kubernetes (K8s) المعيار لإدارة الخدمات المصغرة، وأصبحت Kotlin واحدة من أكثر اللغات شيوعًا لإنشاء تطبيقات خلفية موثوقة. في هذا الدليل، سننتقل من تطبيق Kotlin بسيط إلى نشره بالكامل في مجموعة Kubernetes. ستتعلم كيفية حزم الكود في صورة Docker، وكتابة المانيفستات، وتهيئة الوصول إلى الخدمة.
1. تحضير تطبيق Kotlin
كمثال، سنأخذ REST API بسيطًا على Ktor — إطار عمل خفيف لـ Kotlin. سننشئ ملف 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)}يقوم هذا الكود بتشغيل خادم على المنفذ 8080 مع نقطتي نهاية: الجذر وفحص الصحة. تأكد من تضمين تبعيات Ktor و Netty في build.gradle.kts.
2. بناء صورة Docker
لنشر التطبيق في Kubernetes، يجب حزمه في حاوية. سننشئ Dockerfile في جذر المشروع:
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"]يتم البناء على مرحلتين: أولاً التجميع باستخدام Gradle، ثم نسخ ملف JAR إلى صورة نظيفة. قم ببناء الصورة بالأمر:
docker build -t my-kotlin-app:1.0 .للنشر في السجل (مثل Docker Hub)، نفذ:
docker tag my-kotlin-app:1.0 yourusername/my-kotlin-app:1.0docker push yourusername/my-kotlin-app:1.03. مانيفستات Kubernetes
الآن سننشئ ملفات YAML للنشر في المجموعة. نبدأ بـ 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: 5يقوم هذا المانيفست بإنشاء نسختين مكررتين من التطبيق، ويضيف فحوصات الحيوية والجاهزية. ثم service.yaml:
apiVersion: v1kind: Servicemetadata: name: kotlin-app-svcspec: selector: app: kotlin-app ports: - port: 80 targetPort: 8080 type: ClusterIPتقوم الخدمة بتوجيه حركة المرور من المنفذ 80 إلى المنفذ 8080 للحاوية. إذا كنت بحاجة إلى وصول خارجي، قم بتغيير النوع إلى NodePort أو LoadBalancer.
4. تهيئة Ingress والنشر
لتوجيه الطلبات من الخارج، نستخدم وحدة تحكم Ingress. أنشئ 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: