مقدمة: لماذا Kubernetes لمطور Java؟
تتجاوز تطوير Java الحديثة بشكل متزايد مجرد تشغيل ملفات JAR على الخادم. تؤدي البنية الخدمية المصغرة، والحاجة إلى التوسع الأفقي، وتحمل الأخطاء إلى استخدام الحاويات ومنسقيها. أصبح Kubernetes (K8s) المعيار الفعلي لإدارة التطبيقات المحوسبة. في هذا الدليل، سنشرح كيفية نشر تطبيق Java نموذجي (مثل Spring Boot) في مجموعة Kubernetes. ستتعلم كيفية حزم التطبيق في صورة Docker، وإنشاء البيانات اللازمة، وتشغيله.
1. تحضير تطبيق Java وبناء صورة Docker
قبل الوصول إلى Kubernetes، يجب حزم تطبيق Java في حاوية. لننظر في مثال بسيط على Spring Boot.
1.1. مثال على تطبيق Java
لننشئ وحدة تحكم REST بسيطة تعيد إصدار التطبيق:
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication@RestControllerpublic class App { public static void main(String[] args) { SpringApplication.run(App.class, args); }
@GetMapping("/") public String home() { return "Java App running on Kubernetes v1.0"; }}1.2. إنشاء Dockerfile
لتطبيقات Java، من الأفضل استخدام بناء متعدد المراحل (multi-stage build) لتقليل حجم الصورة النهائية:
FROM maven:3.8.6-eclipse-temurin-17 AS builderWORKDIR /appCOPY pom.xml .RUN mvn dependency:go-offline -BCOPY src ./srcRUN mvn package -DskipTests
FROM eclipse-temurin:17-jre-alpineWORKDIR /appCOPY --from=builder /app/target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]1.3. بناء الصورة ونشرها
قم ببناء الصورة وإرسالها إلى السجل (مثل Docker Hub):
docker build -t yourusername/java-k8s-demo:1.0 .docker push yourusername/java-k8s-demo:1.02. كائنات Kubernetes الأساسية لنشر Java
لنشر تطبيق Java، ستحتاج إلى موردين على الأقل: Deployment (يدير النسخ والتحديثات) و Service (يوفر الوصول الشبكي).
2.1. بيان Deployment
أنشئ ملف deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: java-app labels: app: java-appspec: replicas: 2 selector: matchLabels: app: java-app template: metadata: labels: app: java-app spec: containers: - name: java-app image: yourusername/java-k8s-demo:1.0 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هام: بالنسبة لـ Spring Boot، استخدم Actuator لفحوصات الصحة. حدد requests و limits لتوزيع الموارد بشكل صحيح بواسطة Kubernetes.
2.2. بيان Service
أنشئ service.yaml للوصول الداخلي إلى البودات:
apiVersion: v1kind: Servicemetadata: name: java-app-servicespec: selector: app: java-app ports: - protocol: TCP port