انتقل إلى المحتوى الرئيسي

الفصل 7.4 - CronJobs

أهداف التعلم​

في نهاية هذا الفصل، ستكون قادرًا على:

  • فهم ما هو CronJob
  • إنشاء وإدارة CronJobs
  • تكوين الجداول باستخدام صيغة cron
  • إدارة المهام المتعددة وفترات الانتظار
  • فهم المناطق الزمنية
  • تنفيذ المهام المجدولة

مقدمة​

يقوم CronJob بإنشاء مهام بشكل متكرر وفقًا لجدول زمني (مثل cron). إنه مثالي للمهام المجدولة: النسخ الاحتياطي، التقارير، التنظيف، إلخ.


ما هو CronJob؟​

يقوم CronJob بإنشاء مهام بشكل متكرر وفقًا لجدول زمني محدد باستخدام صيغة cron.

الخصائص​

  • الجدول الزمني: صيغة cron القياسية
  • قالب المهمة: قالب لإنشاء المهام
  • سياسة التزامن: إدارة المهام المتعددة
  • إيقاف مؤقت: إيقاف مؤقت لـ CronJob

صيغة Cron​

التنسيق​

┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of month (1 - 31)
│ │ │ ┌───────────── month (1 - 12)
│ │ │ │ ┌───────────── day of week (0 - 6) (Sunday to Saturday)
│ │ │ │ │
* * * * *

أمثلة​

الجدول الزمنيالوصف
0 * * * *كل ساعة (الدقيقة 0)
0 2 * * *كل يوم في الساعة 2:00
*/15 * * * *كل 15 دقيقة
0 0 * * 0كل أحد في منتصف الليل
0 9-17 * * 1-5من الاثنين إلى الجمعة، من 9 صباحًا إلى 5 مساءً
0 0 1 * *الأول من كل شهر في منتصف الليل

مثال بسيط​

CronJob بسيط​

apiVersion: batch/v1
kind: CronJob
metadata:
name: hello-cronjob
spec:
schedule: "*/1 * * * *" # كل دقيقة
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.35
command:
- /bin/sh
- -c
- date; echo "Hello from CronJob"
restartPolicy: OnFailure
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1

مثال: النسخ الاحتياطي اليومي​

CronJob للنسخ الاحتياطي​

apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 2 * * *" # كل يوم في الساعة 2:00
timeZone: "America/New_York" # المنطقة الزمنية
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: postgres:14
command:
- /bin/bash
- -c
- |
echo "Starting backup at $(date)"
pg_dump -h postgres-service -U postgres mydb > /backup/backup-$(date +%Y%m%d).sql
gzip /backup/backup-$(date +%Y%m%d).sql
aws s3 cp /backup/backup-$(date +%Y%m%d).sql.gz s3://backups/
echo "Backup completed at $(date)"
env:
- name: PGPASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: password
volumeMounts:
- name: backup-storage
mountPath: /backup
volumes:
- name: backup-storage
emptyDir: {}
restartPolicy: OnFailure
successfulJobsHistoryLimit: 7 # الاحتفاظ بـ 7 نسخ احتياطية ناجحة
failedJobsHistoryLimit: 3 # الاحتفاظ بـ 3 نسخ احتياطية فاشلة

سياسة التزامن​

التحكم في كيفية إدارة المهام المتعددة:

السماح (الافتراضي)​

يسمح بعدة مهام بالتوازي:

apiVersion: batch/v1
kind: CronJob
metadata:
name: allow-concurrent
spec:
schedule: "*/5 * * * *"
concurrencyPolicy: Allow
jobTemplate:
spec:
template:
spec:
containers:
- name: task
image: my-app:1.0
restartPolicy: OnFailure

المنع​

يمنع المهام الجديدة إذا كانت هناك مهمة سابقة لا تزال قيد التنفيذ:

spec:
concurrencyPolicy: Forbid

السلوك: إذا كانت هناك مهمة لا تزال قيد التنفيذ، يتم تجاهل المهمة الجديدة.

الاستبدال​

يستبدل المهمة السابقة بمهمة جديدة:

spec:
concurrencyPolicy: Replace

السلوك: يتم حذف المهمة السابقة وإنشاء مهمة جديدة.


Starting Deadline Seconds​

مهلة لبدء مهمة:

apiVersion: batch/v1
kind: CronJob
metadata:
name: deadline-job
spec:
schedule: "0 * * * *"
startingDeadlineSeconds: 300 # 5 دقائق
jobTemplate:
spec:
template:
spec:
containers:
- name: task
image: my-app:1.0
restartPolicy: OnFailure

السلوك: إذا لم تتمكن المهمة من البدء خلال 5 دقائق، تعتبر مفقودة.


الإيقاف المؤقت​

إيقاف مؤقت لـ CronJob:

apiVersion: batch/v1
kind: CronJob
metadata:
name: suspended-job
spec:
schedule: "0 * * * *"
suspend: true # CronJob موقوف
jobTemplate:
spec:
template:
spec:
containers:
- name: task
image: my-app:1.0
restartPolicy: OnFailure

عبر kubectl:

# إيقاف مؤقت
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":true}}'

# استئناف
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":false}}'

تاريخ المهام​

حد تاريخ المهام الناجحة​

عدد المهام الناجحة للاحتفاظ بها:

spec:
successfulJobsHistoryLimit: 3 # الاحتفاظ بـ 3 مهام ناجحة

حد تاريخ المهام الفاشلة​

عدد المهام الفاشلة للاحتفاظ بها:

spec:
failedJobsHistoryLimit: 1 # الاحتفاظ بمهمة فاشلة واحدة

الفوائد:

  • رؤية سجلات المهام السابقة
  • تصحيح الأخطاء
  • التدقيق والتاريخ

مثال: التنظيف الدوري​

CronJob للتنظيف​

apiVersion: batch/v1
kind: CronJob
metadata:
name: cleanup-old-files
spec:
schedule: "0 3 * * *" # كل يوم في الساعة 3:00
jobTemplate:
spec:
template:
spec:
containers:
- name: cleanup
image: busybox:1.35
command:
- /bin/sh
- -c
- |
echo "Cleaning up files older than 30 days"
find /data -type f -mtime +30 -delete
find /data -type d -empty -delete
echo "Cleanup completed"
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: data-pvc
restartPolicy: OnFailure
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 1

أوامر مفيدة​

الإنشاء والإدارة​

# إنشاء CronJob
kubectl apply -f cronjob.yaml

# عرض CronJobs
kubectl get cronjob
kubectl get cj

# التفاصيل
kubectl describe cronjob daily-backup

# عرض المهام المُنشأة
kubectl get jobs -l app=backup

# عرض الـ Pods
kubectl get pods -l job-name=daily-backup-1234567890

الإيقاف المؤقت/الاستئناف​

# إيقاف مؤقت
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":true}}'

# استئناف
kubectl patch cronjob daily-backup -p '{"spec":{"suspend":false}}'

الحذف​

# حذف CronJob
kubectl delete cronjob daily-backup

# الحذف مع المهام
kubectl delete cronjob daily-backup --cascade=foreground

أفضل الممارسات​

1. الجدول الزمني المناسب​

اختر جدولًا زمنيًا لا يثقل العنقود.

2. سياسة التزامن​

استخدم Forbid لتجنب التعارضات إذا لزم الأمر.

3. فترات الانتظار​

حدد startingDeadlineSeconds و activeDeadlineSeconds في المهمة.

4. حدود التاريخ​

قم بتكوين الحدود لتجنب تراكم المهام.

5. المراقبة​

راقب CronJobs لاكتشاف الإخفاقات.

6. المنطقة الزمنية​

حدد المنطقة الزمنية إذا لزم الأمر باستخدام timeZone.


ملخص​

في هذا الفصل، تعلمت:

CronJob: ينشئ المهام بشكل متكرر وفقًا لجدول زمني
الجدول الزمني: صيغة cron القياسية (الدقيقة، الساعة، اليوم، الشهر، يوم الأسبوع)
سياسة التزامن: السماح، المنع، الاستبدال
مهلة البدء: مهلة لبدء مهمة
الإيقاف المؤقت: إيقاف مؤقت لـ CronJob
تاريخ المهام: حدود للمهام الناجحة/الفاشلة
حالات الاستخدام: النسخ الاحتياطي، التنظيف، التقارير، المهام الدورية
أفضل الممارسات: الجدول الزمني المناسب، فترات الانتظار، المراقبة


الخطوات التالية​

الوحدة 8: Ingress و Load Balancing
المختبر 7.4: التوسع التلقائي مع HPA


تم إنشاء الفصل في: ديسمبر 2024