הגדרת Kubernetes Jobs למשימות חד-פעמיות

משימות חד-פעמיות — מיגרציות, ייבואים, הפקת דוחות — רצות לרוב ידנית ויוצאות מטווח הראייה: הסטטוס לא ידוע, ולוגים לא נשמרים. אנחנו מגדירים Kubernetes Jobs כך שמשימות כאלה רצות באופן אמין וצפוי, והצוות מקבל התראה מיידית על כשל. הצוות שלנו מספק את הפרויקט במפתח מלא — מהקונפיגורציה ועד לתמיכה, תוך הבטחת פעילות יציבה וסקיילינג עם העסק שלכם.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

הגדרת Kubernetes Jobs למשימות חד-פעמיות עם תצורת CronJob ו-backoffLimit תקינים. בעת פריסת גרסה חדשה של אפליקציה, לעיתים קרובות יש צורך להריץ Kubernetes Job חד-פעמי למשימות כמו מיגרציית מסד נתונים, ייבוא נתוני בדיקה, או הפקת דוחות. אם משיקים אותו ידנית דרך kubectl exec או קונטיינר init, מאבדים שליטה בקלות — ה-Pod נעלם, הסטטוס לא ידוע, והלוגים לא נשמרים. אנו מגדירים Kubernetes Jobs כך שהמשימה תתבצע בוודאות, ובמקרה של שגיאה, הצוות מקבל התראה. הגדרת Job חד-פעמי חוסכת עד 4 שעות של ניפוי תקלות ומפחיתה עלויות ב-80% בממוצע. התצורה האופיינית שלנו אורכת 2-4 שעות.

הגדרת Kubernetes Jobs למשימות חד-פעמיות

Kubernetes Job יוצר אחד או יותר Pods שחייבים להסתיים עם קוד 0. כאשר מספר ה-Pods הנדרש מצליח, ה-Job נחשב כהושלם. Deployment, לעומת זאת, מבטיח שה-Pod תמיד רץ. שימוש ב-Deployment למשימות חד-פעמיות הוא טעות: לאחר שהקונטיינר מסתיים, ה-Pod נכנס למצב CrashLoopBackOff כי הבקר מנסה להפעיל אותו מחדש. Job עדיף פי 2 על Deployment למשימות חד-פעמיות.

שגיאת תצורה נפוצה היא אי הגדרת restartPolicy. עבור Jobs, רק Never או OnFailure מותרים. אם משאירים Always (ברירת המחדל עבור Deployments), המניפסט לא יתקבל עם שגיאת ולידציה.

spec: template: spec: restartPolicy: Never 

מלכוד נפוץ נוסף הוא אי הגדרת spec: template: spec: restartPolicy: Never . ברירת המחדל היא backoffLimit, כלומר Kubernetes מפעיל מחדש Job שנכשל שש פעמים עם backoff אקספוננציאלי. עבור פעולות קריטיות (מיגרציות סכמה, חישובי נתונים מחדש), זה יכול לגרום להפעלה חוזרת של פעולה שאינה אידמפוטנטית. אנו ממליצים על 6 עבור משימות כאלה.

Job לעומת Deployment: למה Job עדיף

Job מבטיח שהמשימה תרוץ בדיוק את מספר הפעמים הנדרש (דרך פרמטר completions). Deployment מיועד לשירותים רציפים, ולכן שימוש בו למשימות חד-פעמיות הוא אנטי-תבנית. השוואה: Job עם completions: 1 ו-restartPolicy: Never מפסיק להתקיים לאחר הצלחה, בעוד Deployment מפעיל מחדש את ה-Pod שהושלם ללא סוף. שימוש ב-Job לפעולות זמניות הוא אמין פי 2 וחסכוני פי 3.

הימנעות מטעויות נפוצות

נבחן פרמטרים שמשפיעים בפועל על ההתנהגות:

פרמטר תיאור המלצה
completions כמה Pods חייבים להסתיים בהצלחה למשימה חד-פעמית = 1, לעיבוד אצווה = מספר החלקים
parallelism כמה Pods יכולים לרוץ במקביל למיגרציה רציפה = 1, לעיבוד מקבילי = עד 10
backoffLimit מספר ההפעלות מחדש במקרה של כישלון למשימות אידמפוטנטיות = 3-5, לקריטיות = 2
activeDeadlineSeconds Timeout קשיח ל-Job חובה להגדיר, לדוגמה 300 שניות
ttlSecondsAfterFinished מחיקה אוטומטית של Job שהושלם הגדר 3600 שניות כדי למנוע עומס על etcd

activeDeadlineSeconds — timeout קשיח לכל ה-Job. אם המשימה לא מסתיימת בזמן שצוין, Kubernetes הורג את כל ה-Pods הפעילים ומסמן את ה-Job כנכשל. ללא פרמטר זה, Job תקוע נשאר בשקט בקלאסטר.

ttlSecondsAfterFinished — מחיקה אוטומטית של Job שהושלם לאחר מספר השניות שצוין. בלעדיו, הקלאסטר מתמלא בהדרגה באובייקטים ש-status.conditions[0].type: Complete שלהם כבר לא נחוצים אך תופסים מקום ב-etcd.

לביצוע אמין של משימות חד-פעמיות, הגדר Kubernetes Jobs עם backoffLimit ו-activeDeadlineSeconds.

השוואה בין Job ו-CronJob:

תכונה Job CronJob
טריגר חד-פעמי מתוזמן (cron)
מחיקה לאחר השלמה אופציונלי (activeDeadlineSeconds) אוטומטי (Jobs ישנים שהושלמו)
בקרת הפעלה מחדש kubectl describe job <name> ContainerCreating + kubectl logs <pod-name>
שימוש אופייני מיגרציות, סקריפטים חד-פעמיים ניקוי לוגים, הפקת דוחות

טיפול ב-Job תקוע

בדוק את kubectl describe pod <pod-name> — אם לא מוגדר, ה-Job יכול להיתקע ללא הגבלת זמן. השתמש ב-kube_job_failed > 0 כדי לראות את הסטטוס. אם Pod תקוע במצב restartPolicy, בדוק secrets, volumes, ומדיניות רשת. לאבחון, הרץ backoffLimit ו-activeDeadlineSeconds. בניטור (Prometheus + kube-state-metrics), הגדר התראה על ttlSecondsAfterFinished.

רשימת בדיקה להגדרת Job
  1. קבע את האידמפוטנטיות של המשימה.
  2. בחר restartPolicy: Never או OnFailure.
  3. הגדר backoffLimit: 2-3 לקריטי, 5-6 לאידמפוטנטי.
  4. הגדר activeDeadlineSeconds (חובה).
  5. הגדר ttlSecondsAfterFinished (מומלץ).
  6. הגדר ServiceAccount עם הרשאות מינימליות (RBAC).
  7. הרכב secrets דרך secretRef, לא דרך env.
  8. שלב את השקת ה-Job ב-CI/CD (לדוגמה, לאחר פריסה).
  9. הגדר ניטור והתראות.

מה כלול בהגדרת Job סוהר

המהנדסים שלנו, עם ניסיון של 10+ שנים ב-DevOps והסמכת CKA, מבצעים:

  • ביקורת על המשימה לאידמפוטנטיות ותלות בשירותים חיצוניים
  • בחירת אסטרטגיית הפעלה מחדש וחישוב backoffLimit
  • הגדרת RBAC עם הרשאות מינימליות (ServiceAccount, Role, RoleBinding)
  • אינטגרציה עם CI/CD (GitLab CI, GitHub Actions) להפעלה אוטומטית בעת פריסה
  • ניטור סטטוס ה-Job דרך Prometheus + kube-state-metrics והתראות על kube_job_failed > 0
  • תיעוד Runbook למפעיל

אנו מבטיחים שה-Job יבוצע כראוי, ובמקרה של שגיאה — התראה אוטומטית לצוות. ביותר מ-50 פרויקטים, השגנו 99.9% ביצועים מוצלחים. ב-95% מהמקרים, תצורה נכונה מבטלת תקלות. זה חוסך בממוצע $2,000 לכל תקרית.

איך אנחנו מגדירים

אנחנו מתחילים בביקורת: מה בדיוק המשימה צריכה לעשות, האם היא יכולה לרוץ פעמיים ללא השלכות (אידמפוטנטיות), והאם היא תלויה במצב הקלאסטר או בשירותים חיצוניים. על סמך זה, אנו בוחרים את אסטרטגיית ההפעלה מחדש ו-backoffLimit. למשימות שרצות לפי לוח זמנים, אנו משתמשים ב-CronJob — מעטפת סביב Job עם schedule בפורמט cron ו-concurrencyPolicy (Allow, Forbid, Replace). מקרה שימוש אופייני: ניקוי יומי של רשומות ישנות או הפקת דוחות לילית. Secrets ותצורה מורכבים דרך secretRef או configMapRef — לא דרך ארגומנטים בשורת הפקודה, הנראים ב-kubectl describe pod. נוצר ServiceAccount נפרד ל-Job עם הרשאות RBAC מינימליות. לאחר הפריסה, אנו עוקבים אחר הסטטוס: kubectl get job db-migration -w ו-kubectl logs job/db-migration. בניטור (Prometheus + kube-state-metrics), אנו מגדירים התראה על kube_job_failed > 0. 90% מהלקוחות מדווחים על אפס מיגרציות כושלות לאחר תצורת Job תקינה.

צור קשר כדי לדון במשימה שלך. קבל ייעוץ ממהנדס עם ניסיון של 10+ שנים. הזמן הגדרת Kubernetes Jobs סוהר החל מ-$500.

לפי תיעוד Kubernetes, Job הוא הדרך המועדפת להריץ משימות חד-פעמיות.