Kubernetes jobs主要是針對短時和批量的工作負載。它是為了結束而運作的,而不是像deployment、replicasets、replication controllers和DaemonSets等其他對象那樣持續運作。
本文将介紹如何建立Kubernetes jobs和cronjobs,以及一些小技巧。
Kubernetes Jobs會一直運作到Job中指定的任務完成。也就是說,如果pods給出退出代碼0,那麼Job就會退出。而在正常的Kubernetes中,無論退出代碼是什麼,deployment對象在終止或出現錯誤時都會建立新的pod,以保持deployment的理想狀态。
在job運作過程中,如果托管pod的節點發生故障,Job pod将被自動重新安排到另一個節點。
對于Kubernetes Jobs最好的用例實踐是:
批處理任務:比如說你想每天運作一次批處理任務,或者在指定日程中運作。它可能是像從存儲庫或資料庫中讀取檔案那樣,将它們配置設定給一個服務來處理檔案。
運維/ad-hoc任務:比如你想要運作一個腳本/代碼,該腳本/代碼會運作一個資料庫清理活動,甚至備份一個Kubernetes叢集。
在本例中,我們将使用Ubuntu 容器來運作一個帶有for循環的shell腳本,并根據你傳遞給容器的參數來呼應消息。這個參數是一個數字,決定shell腳本循環應該運作多少次。
例如,如果你傳遞了參數100,那麼shell腳本将呼應消息100次然後容器将會退出。
你可以通路以下連結檢視Dockerfile和shell腳本:
https://github.com/devopscube/Kubernetes-jobs-example/tree/master/Docker
我們先從一個簡單設定的job開始。
Step1:使用自定義的Docker鏡像建立一個job.yaml檔案,指令參數為100。100将會作為參數傳遞給docker ENTRYPOINT腳本。
Step2 :使用kubectl建立一個job.yaml檔案的job
Step3:使用kubectl檢查job的狀态
Step4:使用kubectl擷取pod清單
Step5:使用kubectl擷取job pod 日志。使用你在輸出中看到的Pod名稱替換原本的Pod名稱。

當一個job被部署後,你可以讓它在多個Pod上并行運作。例如,在一個job中如果你想要運作6個 pods,同時并行運作2個pods,你需要添加以下2個參數到你的job manifets中:
以下是帶有那些參數的manifest:
你不能從一個job manifest檔案中建立多個job,因為Kubernetes會報錯,說存在一個同名的job。為了規避這個問題,你可以在中繼資料中添加 generateName 名稱參數。
例如:
在上方示例中,每次你運作該manifest,job将以kube-job-作為字首,後面跟着一個随機字元串來建立。
如果你想按照特定的時間表運作批處理job,例如,每2個小時運作一次。你可以用cron表達式建立一個Kubernetes cronjob。Job會按照你在job中提到的時間表自動啟動。
下面我們将介紹如何指定一個cron計劃,你可以使用crontab生成器(https://crontab-generator.org/)來生成自己的時間計劃。
下圖顯示了Kubernetes cronjob schedule文法。
如果我們以cronjob的形式每15分鐘運作一次我們之前的job,manifest應該如下所示。建立一個名為cron-job.yaml的檔案,并複制以下manifest:
讓我們使用kubectl部署cronjob。
<code>kubectl create -f cron-job.yaml</code>
列出cronjobs:
你可以列出cronjob pod并從處于運作狀态或完成狀态的pods中擷取日志來檢查Cronjob日志。
在某些情況下,你可能希望以臨時的方式執行cronjob。你可以通過從現有的cronjob建立一個job來實作。
例如,如果你想手動觸發一個cronjob,我們應該這樣做:
--from=cronjob/kubernetes-cron-job将複制cronjob模闆并建立一個名為manual-cron-job的job。
根據你的需求,你還可以使用kubernetes jobs/cronjobs的幾個關鍵參數:
failedJobHistoryLimit &
successfulJobsHistoryLimit:根據你提供的保留數量删除失敗和成功的job曆史記錄。當你嘗試列出job時,這對于減少所有失敗的條目非常有用。例如:
backoffLimit:如果你的Pod失敗,重試的總次數。
activeDeadlineSeconds:如果你想對cronjob的運作時間進行硬性限制,可以使用此參數。例如,如果你想隻運作1分鐘的cronjob,你可以将其設定為60。
通過本文我們了解了建立Job以及Cron Job的步驟并且一些詳細的配置過程和關鍵參數,希望藉由本文可以幫助你開始上手了解K8S Job和Cron Job,輕松搞定批處理任務!
原文連結: https://devopscube.com/create-kubernetes-jobs-cron-jobs/