نشر تطبيقات Java على Kubernetes: من Dockerfile إلى خدمة عاملة
\n\nتطوير Java الحديث لا يمكن تصوره بدون الحاويات والتنسيق. أصبح Kubernetes (K8s) المعيار لإدارة الخدمات المصغرة، وأصبحت القدرة على نشر تطبيقات Java في المجموعة مهارة إلزامية لمطوري الواجهة الخلفية. في هذه المقالة، سنستعرض عمليًا دورة النشر الكاملة: من بناء صورة Docker مع تطبيق Java إلى إعداد موازنة التحميل عبر Ingress.
\n\n1. تحضير تطبيق Java وملف Dockerfile
\n\nقبل الوصول إلى Kubernetes، يجب حزم تطبيق Java الخاص بك في صورة Docker. لننظر في حالة كلاسيكية - تطبيق على Spring Boot، تم تجميعه في ملف JAR.
\n\nبناء المشروع
\nلنفترض أن لدينا مشروعًا يتم بناؤه عبر Maven. قم بتنفيذ الأمر في جذر المشروع:
\nmvn clean package -DskipTests\nنتيجة لذلك، سيظهر ملف my-app-1.0.0.jar في مجلد target/.
إنشاء Dockerfile
\nلتقليل حجم الصورة وزيادة الأمان، نستخدم البناء متعدد المراحل (multi-stage build).
\n# المرحلة 1: البناء\nFROM maven:3.8.6-openjdk-17 AS builder\nWORKDIR /app\nCOPY pom.xml .\nRUN mvn dependency:go-offline -B\nCOPY src ./src\nRUN mvn package -DskipTests\n\n# المرحلة 2: الصورة النهائية\nFROM openjdk:17-jdk-slim\nWORKDIR /app\nCOPY --from=builder /app/target/my-app-1.0.0.jar app.jar\nEXPOSE 8080\nENTRYPOINT ["java", "-jar", "app.jar"]\n\nبناء الصورة ونشرها
\ndocker build -t my-java-app:1.0.0 .\ndocker tag my-java-app:1.0.0 your-dockerhub/my-java-app:1.0.0\ndocker push your-dockerhub/my-java-app:1.0.0\n\n2. إنشاء ملفات تعريف Kubernetes
\n\nيستخدم Kubernetes نهجًا تصريحيًا. سنصف الحالة المرغوبة للنظام في ملفات YAML.
\n\nDeployment - إدارة البودات
\nقم بإنشاء ملف deployment.yaml:
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: java-app-deployment\n labels:\n app: java-app\nspec:\n replicas: 3\n selector:\n matchLabels:\n app: java-app\n template:\n metadata:\n labels:\n app: java-app\n spec:\n containers:\n - name: java-app\n image: your-dockerhub/my-java-app:1.0.0\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: /actuator/health\n port: 8080\n initialDelaySeconds: 30\n periodSeconds: 10\n readinessProbe:\n httpGet:\n path: /actuator/health\n port: 8080\n initialDelaySeconds: 20\n periodSeconds: 5\n\nService - ضمان الوصول
\nقم بإنشاء ملف service.yaml:
apiVersion: v1\nkind: Service\nmetadata:\n name: java-app-service\nspec:\n selector:\n app: java-app\n ports:\n - protocol: TCP\n port: 80\n targetPort: 8080\n type: ClusterIP\n\nConfigMap - استخراج التكوين
\nلتخزين متغيرات البيئة، قم بإنشاء configmap.yaml:
apiVersion: v1\nkind: ConfigMap\nmetadata:\n name: app-config\ndata:\n SPRING_PROFILES_ACTIVE: "prod"\n DB_URL: "jdbc:postgresql://postgres-service:5432/mydb"\n\n3. النشر في المجموعة والتحقق
\n\nالآن سنطبق جميع الملفات التعريفية على المجموعة. تأكد من أن kubectl مهيأ وأنك متصل بالسياق الصحيح.
تطبيق الملفات التعريفية
\nkubectl apply -f configmap.yaml\nkubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\n\nالتحقق من الحالة
\nkubectl get pods\nkubectl get deployments\nkubectl get services\nيجب أن