משימות Cron

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

סקירה כללית

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

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

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

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

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

  • מפעילים את ממשק ה-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 מוסבר איך לראות את סטטוס הסיום של ההפעלות האחרונות של CronJob, וגם את היומנים של Pod מסוים.

כדי להגדיר את מספר ההפעלות המוצלחות והנכשלות של 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

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

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