CronJobs זמין לכלל המשתמשים (GA) ב-Google Kubernetes Engine (GKE) מגרסה 1.21 ואילך. במאמר הזה מוסבר איך להריץ CronJobs ב-GKE. משימות Cron הן תכונה מובנית של Kubernetes. פרטים נוספים זמינים במסמכי העזרה של Kubernetes בנושא CronJobs.
סקירה כללית
משימות Cron יוצרות משימות ב-Kubernetes לפי לוח זמנים חוזר. משימות Cron מאפשרות להפוך משימות קבועות לאוטומטיות, כמו גיבויים, יצירת דוחות, שליחת אימיילים או משימות ניקוי.
משימות Cron נוצרות, מנוהלות, מורחבות ונמחקות באותו אופן כמו משימות. מספר אובייקטי המשרה שנוצרים תלוי בכמה גורמים. מידע נוסף זמין במאמר בנושא מגבלות של CronJob.
מידע נוסף על Jobs זמין במאמר בנושא הרצת Job.
לפני שמתחילים
לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את ממשק ה-API של Google Kubernetes Engine. הפעלת Google Kubernetes Engine API
- אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה
gcloud components updateכדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.
יצירת משימת Cron
אפשר ליצור CronJob באמצעות קובץ מניפסט. לדוגמה, מניפסט ה-YAML הבא מדפיס את השעה הנוכחית ומחרוזת פעם בדקה, תוך שמירה על ערכי ברירת המחדל של פרמטרים של CronJob:
# cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
concurrencyPolicy: Allow
startingDeadlineSeconds: 100
suspend: false
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo "Hello, World!"
restartPolicy: OnFailure
כדי ליצור את CronJob הזה, שומרים את מניפסט ה-YAML בקובץ ומחילים אותו על האשכול:
kubectl apply -f PATH_TO_FILE
מחליפים את הערך ב-PATH_TO_FILE בנתיב למניפסט YAML.
הגדרת CronJob
כשיוצרים CronJob, אפשר לציין את הפרמטרים הבאים:
- כשהמשימה CronJob פועלת
- מה עושה משימת CronJob
- המועד האחרון להפעלת CronJob
- האם מותר להריץ משימות מקבילות עבור CronJob
- האם משרות חדשות מושעות
- כמה הפעלות של CronJob נשמרות בהיסטוריה
הגדרת הזמן שבו משימת ה-Cron תפעל
בשדה spec.schedule מוגדר מתי ובאיזו תדירות יופעל CronJob, באמצעות פורמט crontab סטנדרטי של Unix. כל השעות ב-CronJob הן לפי שעון UTC. יש חמישה שדות שמופרדים ברווחים.
השדות האלה מייצגים את הנתונים הבאים:
- דקות (בין 0 ל-59)
- שעות (בין 0 ל-23)
- היום בחודש (בין 1 ל-31)
- חודש (בין 1 ל-12)
- יום בשבוע (בין 0 ל-6, מתחיל ביום ראשון)
אפשר להשתמש בתווים המיוחדים הבאים בכל אחד מהשדות של spec.schedule:
-
?הוא תו כללי לחיפוש שמתאים לתו יחיד. -
*הוא ערך כללי שמתאים לאפס תווים או יותר. -
/מאפשר לציין מרווח לשדה. לדוגמה, אם הערך בשדה הראשון (השדה של הדקות) הוא*/5, המשמעות היא "כל 5 דקות". אם השדה החמישי (השדה של היום בשבוע) מוגדר ל-0/5, המשמעות היא 'כל יום ראשון חמישי'.
קביעת הפעולות שמשימת ה-Cron תבצע
הקטע spec.jobTemplate מתאר מה עושה CronJob, כולל תמונות הקונטיינר שלו, הפקודות שהקונטיינרים מבצעים ומדיניות ההפעלה מחדש של CronJob. פרטים נוספים על מה צריך לכלול ב-spec.jobTemplate זמינים במסמכי התיעוד של Kubernetes CronJob.
ציון מועד אחרון
השדה האופציונלי startingDeadlineSeconds מציין את מספר השניות המקסימלי שנדרש ל-CronJob כדי להתחיל אם הוא פספס את הזמן המתוזמן שלו מסיבה כלשהי. משימות Cron שלא בוצעו נחשבות ככשלים.
כדי לציין מועד אחרון, מוסיפים את הערך startingDeadlineSeconds לשדה spec של CronJob בקובץ המניפסט. לדוגמה, במניפסט הבא מצוין של-CronJob יש 100 שניות להתחיל:
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
jobTemplate:
spec:
...
ציון מדיניות לגבי פעולות שמתבצעות בו-זמנית
בשדה האופציונלי spec.concurrencyPolicy מציינים איך לטפל בהפעלות מקבילות של משימה שנוצרה על ידי בקר CronJob. אם לא מגדירים ערך, המערכת מאפשרת כברירת מחדל כמה עבודות בו-זמנית.
concurrencyPolicy מקבל את הערכים הבאים:
| ערך | משמעות |
|---|---|
Allow |
מותר להפעיל כמה עבודות בו-זמנית. (זוהי ברירת המחדל) |
Forbid |
אסור להפעיל משימות במקביל, ומשימות חדשות לא יכולות להתחיל עד שהמשימות הקודמות יסתיימו או יגיעו לזמן קצוב לתפוגה. |
Replace |
אסור להריץ משימות בו-זמנית, ומשימות ישנות מבוטלות לטובת משימות חדשות. |
השעיית ההרצות הבאות
השדה האופציונלי spec.suspend, כשמוגדר בו הערך true, מונע הפעלה של משימות חדשות, אבל מאפשר להשלים את ההרצות הנוכחיות.
ציון מגבלות על היסטוריה
משימת Cron יוצרת Pod בכל פעם שהיא מופעלת. הסבר על צפייה בסטטוס הסיום של ההרצות האחרונות של CronJob, וגם ביומנים של Pod מסוים, מופיע במאמר צפייה בהיסטוריה של CronJob.
אפשר להגדיר את מספר ההפעלות המוצלחות והנכשלות של CronJob שנשמרות על ידי ציון ערכים ל-spec.successfulJobsHistoryLimit ול-spec.failedJobsHistoryLimit. כברירת מחדל, successfulJobsHistoryLimit מוגדר ל-3 ו-failedJobsHistoryLimit מוגדר ל-1.
לדוגמה, המניפסט הבא מורה ל-GKE לשמור עד חמש הרצות מוצלחות של CronJob ועד 10 הרצות שנכשלו של CronJob:
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
successfulJobsHistoryLimit: 5
failedJobsHistoryLimit: 10
jobTemplate:
spec:
...
כדי להשבית את השמירה של היסטוריית ההפעלה של CronJob מוצלחת או כושלת, צריך להגדיר את הערך המתאים ל-0. השבתת השמירה של היסטוריית הפעילות עלולה להקשות על איתור באגים של כשלים. לדוגמה, המניפסט הבא מורה ל-GKE לשמור רק את ההפעלות שנכשלו של CronJob:
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 10
jobTemplate:
spec:
...
בדיקת משימת Cron
כדי לבדוק את ההגדרה של CronJob, משתמשים בפקודה kubectl describe:
kubectl describe cronjob CRONJOB_NAME
מחליפים את CRONJOB_NAME בשם של CronJob שרוצים לבדוק.
הצגת ההיסטוריה של CronJob
משימת CronJob רצה בתוך Pod. כברירת מחדל, Kubernetes שומר את היומנים של Pods שהופסקו, שמייצגים את שלוש ההפעלות האחרונות של CronJob שהצליחו ואת ה-Job האחרון שנכשל. אפשר לשנות או להשבית את הגדרות ברירת המחדל האלה על ידי שינוי המגבלות של היסטוריית CronJob.
כדי לראות את ההיסטוריה של CronJob, קודם צריך לרשום את כל ה-Pods. משימות Cron שהושלמו מוצגות עם הסטטוס Completed, ומשימות שנכשלו מוצגות עם הסטטוס RunContainerError, CrashLoopBackOff או סטטוס אחר שמציין כשל.
NAME READY STATUS RESTARTS AGE
hello-1556555640-9bc5r 0/1 Completed 0 3m6s
hello-1556555700-cm6wk 0/1 Completed 0 2m6s
hello-1556555760-62wf5 0/1 Completed 0 66s
hello-1556555820-rl8kl 0/1 Completed 0 5s
hello-failed-1556555820-wrvt2 0/1 RunContainerError 1 5s
כדי לראות את היומנים של CronJob ספציפי, מריצים את הפקודה הבאה:
kubectl logs POD_NAME
מחליפים את POD_NAME בשם של ה-Pod שרוצים לבדוק.
הפלט אמור להיראות כך:
container_linux.go:247: starting container process caused
"exec: \"/in/sh\": stat /in/sh: no such file or directory"
מחיקת משימת Cron
כדי למחוק CronJob, מריצים את הפקודה הבאה:
kubectl delete cronjob CRONJOB_NAME
כשמוחקים CronJob, כלי איסוף הגרוטאות של Kubernetes מוחק את המשימות המשויכות ומונע הפעלה של משימות חדשות.