الفصل 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