نشر تطبيق Kotlin على Kubernetes: دليل أساسي

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

نشر 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.0


2. إنشاء مانيفستات 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: 5


2.3. Service



سيعمل Service على موازنة حركة المرور بين البودات:



# service.yamlapiVersion: v1kind: Servicemetadata:  name: kotlin-app-servicespec:  selector:    app: kotlin-app  ports:    - protocol: TCP      port: 80      targetPort: 8080  type: ClusterIP


3. النشر في الكتلة وإعداد 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:                

المدونات

توصيات الكتب