نشر Java على Kubernetes: دليل أساسي
أصبح Kubernetes (K8s) المعيار الفعلي لتنسيق التطبيقات المحوسبة. إذا كنت مطور Java، فإن القدرة على نشر تطبيقاتك في Kubernetes ليست مجرد ميزة إضافية، بل ضرورة في ثقافة DevOps الحديثة. في هذا الدليل، سنمر بالمسار الكامل بدءًا من إنشاء تطبيق Java بسيط وحتى نشره في مجموعة Kubernetes. ستتعلم كيفية حزم التطبيق في صورة Docker، وكتابة البيانات (manifests) اللازمة، وتشغيله في بيئة شبيهة بالإنتاج.
1. تحضير تطبيق Java وصورة Docker
قبل نشر التطبيق في Kubernetes، يجب حوسبته. Docker هو الطريقة القياسية لتغليف تطبيقات Java مع تبعياتها. سننظر في خدمة REST بسيطة على Spring Boot.
سننشئ الفئة HelloController.java:
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;
@RestControllerpublic class HelloController {
@GetMapping("/") public String hello() { return "Hello from Java on Kubernetes!"; }}الآن سننشئ Dockerfile لبناء الصورة. سنستخدم بناء متعدد المراحل (multi-stage build) لتقليل حجم الصورة النهائية:
FROM maven:3.8.5-openjdk-17 AS buildWORKDIR /appCOPY pom.xml .COPY src ./srcRUN mvn clean package -DskipTests
FROM openjdk:17-jdk-slimWORKDIR /appCOPY --from=build /app/target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]قم ببناء الصورة باستخدام الأمر docker build -t my-java-app:latest . وقم بتشغيلها محليًا للتحقق: docker run -p 8080:8080 my-java-app. إذا كان كل شيء يعمل، يمكنك تحميل الصورة إلى السجل (على سبيل المثال، Docker Hub):
docker tag my-java-app:latest yourusername/my-java-app:latestdocker push yourusername/my-java-app:latest2. البيانات (Manifests) الأساسية لـ Kubernetes
للنشر في Kubernetes، ستحتاج إلى موردين على الأقل: Deployment (مسؤول عن إدارة البودات) و Service (يوفر الوصول الشبكي).
أنشئ ملف deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: java-app-deployment labels: app: java-appspec: replicas: 2 selector: matchLabels: app: java-app template: metadata: labels: app: java-app spec: containers: - name: java-app image: yourusername/my-java-app:latest ports: - containerPort: 8080 resources: requests: memory: "256Mi" cpu: "250m" limits: memory: "512Mi" cpu: "500m" livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 20 periodSeconds: 5الآن أنشئ service.yaml لجعل التطبيق متاحًا داخل المجموعة:
apiVersion: v1kind: Servicemetadata: name: java-app-servicespec: selector: app: java-app ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIPإذا كنت بحاجة إلى فتح الوصول من الخارج (على سبيل المثال، للاختبار)، قم بتغيير النوع إلى LoadBalancer أو استخدم NodePort.
3. النشر في المجموعة
تأكد من أن لديك إمكانية الوصول إلى مجموعة Kubernetes (على سبيل المثال، Minikube المحلي أو خدمة سحابية). قم بتطبيق البيانات (manifests):
kubectl apply -f deployment.yamlkubectl apply -f service.yaml