משימות Cron

‫CronJobs זמין לכולם (GA) ב-Google Kubernetes Engine ‏ (GKE) מגרסה 1.21 ואילך. במאמר הזה מוסבר איך להריץ CronJobs ב-GKE. משימות Cron הן תכונה מובנית של Kubernetes. פרטים נוספים זמינים במסמכי העזרה של Kubernetes בנושא CronJobs.

סקירה כללית

משימות Cron יוצרות משימות ב-Kubernetes לפי לוח זמנים חוזר. משימות Cron מאפשרות להפוך משימות קבועות לאוטומטיות, כמו גיבויים, יצירת דוחות, שליחת אימיילים או משימות ניקוי.

משימות Cron נוצרות, מנוהלות, משנות את הגודל שלהן ונמחקות באותו אופן כמו משימות. המספר המדויק של אובייקטים מסוג Job שנוצרים תלוי בכמה גורמים. מידע נוסף זמין במאמר בנושא מגבלות של CronJob.

מידע נוסף על משימות זמין במאמר בנושא הרצת משימה.

לפני שמתחילים

לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:

  • מפעילים את ממשק Google Kubernetes Engine API.
  • הפעלת Google Kubernetes Engine API
  • כדי להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את gcloud CLI. אם התקנתם בעבר את ה-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, המשמעות היא 'כל יום ראשון חמישי'.

הגדרת הפעולות שמשימת ה-CronJob תבצע

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

כדי לבדוק את ההגדרה של משימת Cron, משתמשים בפקודה 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 מוחק את המשימות המשויכות ומונע הפעלה של משימות חדשות.

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