نشر Kotlin على Kubernetes: دليل أساسي عملي
أصبح Kubernetes (K8s) المعيار لتنسيق التطبيقات المعبأة في حاويات. إذا كنت تطور تطبيقات خادم بلغة Kotlin (باستخدام Ktor أو Spring Boot أو http4k)، فسيأتي حتماً وقت تحتاج فيه إلى نشرها في الكتلة. في هذا الدليل، سننتقل من تغليف تطبيق Kotlin في صورة Docker إلى تشغيله على Kubernetes باستخدام ConfigMap و Ingress. جميع الأمثلة عملية وجاهزة للتكيف.
1. إعداد تطبيق Kotlin وصورة Docker
كمثال، سنأخذ تطبيقًا بسيطًا على Ktor (يمكن استبداله بأي إطار عمل آخر). سيقوم تطبيقنا بالاستماع على المنفذ 8080 وإرجاع JSON يحتوي على الإصدار.
// src/main/kotlin/com/example/Application.ktimport io.ktor.server.engine.*import io.ktor.server.netty.*import io.ktor.server.routing.*import io.ktor.server.response.*
fun main() { embeddedServer(Netty, port = 8080) { routing { get("/") { call.respond(mapOf("app" to "kotlin-on-k8s", "version" to "1.0.0")) } } }.start(wait = true)}سنقوم بتجميع التطبيق في ملف JAR ضخم باستخدام Gradle (إضافة shadow). بعد التجميع، سننشئ Dockerfile:
# DockerfileFROM openjdk:17-jdk-slimWORKDIR /appCOPY build/libs/app-all.jar app.jarEXPOSE 8080CMD ["java", "-jar", "app.jar"]نقوم ببناء الصورة ودفعها إلى السجل (مثل Docker Hub):
docker build -t youruser/kotlin-app:1.0.0 .docker push youruser/kotlin-app:1.0.02. إنشاء مانيفستات Kubernetes
الآن سنصف الموارد اللازمة للنشر. سننشئ ثلاثة ملفات: deployment.yaml و service.yaml و configmap.yaml.
2.1. ConfigMap للإعدادات
سنقوم بإخراج إعدادات التطبيق (مثل مستوى التسجيل أو سلسلة الاتصال) إلى ConfigMap:
# configmap.yamlapiVersion: v1kind: ConfigMapmetadata: name: app-configdata: LOG_LEVEL: "DEBUG" APP_MODE: "production"2.2. Deployment
في مانيفست Deployment، سنحدد الصورة والمنفذ وعدد النسخ ونمرر المتغيرات من ConfigMap:
# deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata: name: kotlin-appspec: replicas: 2 selector: matchLabels: app: kotlin-app template: metadata: labels: app: kotlin-app spec: containers: - name: app image: youruser/kotlin-app:1.0.0 ports: - containerPort: 8080 envFrom: - configMapRef: name: app-config livenessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 10 periodSeconds: 52.3. Service
سيعمل Service على موازنة حركة المرور بين البودات:
# service.yamlapiVersion: v1kind: Servicemetadata: name: kotlin-app-servicespec: selector: app: kotlin-app ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIP3. النشر في الكتلة وإعداد Ingress
سنطبق المانيفستات:
kubectl apply -f configmap.yamlkubectl apply -f deployment.yamlkubectl apply -f service.yamlنتأكد من أن البودات قيد التشغيل:
kubectl get podskubectl logs <pod-name>الآن، سنجعل التطبيق متاحًا من الخارج. سننشئ Ingress (بافتراض تثبيت Ingress Controller في الكتلة، مثل NGINX):
# ingress.yamlapiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: kotlin-app-ingressspec: rules: - host: kotlin.example.com http: paths: