משימות Cron

‫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, אפשר לציין את הפרמטרים הבאים:

הגדרת הזמן שבו משימת ה-Cron תפעל

בשדה spec.schedule מוגדר מתי ובאיזו תדירות יופעל CronJob, באמצעות פורמט crontab סטנדרטי של Unix. כל השעות ב-CronJob הן לפי שעון UTC. יש חמישה שדות שמופרדים ברווחים. השדות האלה מייצגים את הנתונים הבאים:

  1. דקות (בין 0 ל-59)
  2. שעות (בין 0 ל-23)
  3. היום בחודש (בין 1 ל-31)
  4. חודש (בין 1 ל-12)
  5. יום בשבוע (בין 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 מוחק את המשימות המשויכות ומונע הפעלה של משימות חדשות.

המאמרים הבאים