云原生之 K8S 系列:如何創建 Kubernetes job 和 Cronjobs 入門指南
本kubernetes教程解釋了如何創建kubernetes作業和cronjobs,以及它的基礎知識、用例和一些提示和技巧。
什么是Kubernetes Job?
Kubernetes job和cronjob是Kubernetes對象,主要用于短期和批處理工作負載。
kubernetes作業對象基本上部署了一個pod,但它是為了完成而運行的,而不是像deployment、replicasets、復制控制器和DaemonSets這樣的對象,它們是持續運行的。
這意味著,作業將一直運行,直到作業中指定的任務完成,如果pods給出退出代碼0,則作業將退出。該任務可以是shell腳本執行、API調用或執行數據轉換并將其上傳到云存儲的java python執行。
然而,在正常的Kubernetes部署中,無論退出代碼如何,部署對象都會在終止或拋出錯誤時創建新的pod,以保持部署所需的狀態。
在作業運行期間,如果承載pod的節點失敗,作業pod將自動重新調度到另一個節點。
Kubernetes Jobs和CronJobs用例
Kubernetes作業的最佳用例是:
- 批處理:假設您希望每天運行一次批處理任務,或者在特定的計劃中運行一次。它可以是從存儲或數據庫中讀取文件,并將其提供給服務以處理文件。
- 操作/特別任務:假設您想要運行運行數據庫清理活動的腳本/代碼,或者甚至備份kubernetes集群本身。
在我參與的一個項目中,我們將Kubernetes作業廣泛用于ETL工作負載。
如何創建Kubernetes作業
在這個例子中,我將使用一個Ubuntu容器,它運行一個shell腳本,該腳本有一個for循環,根據您傳遞給容器的參數回顯消息。參數應該是一個數字,決定循環運行的次數以回顯消息。
例如,如果傳遞100作為參數,shell腳本將回顯消息100次,容器將退出。
你可以在這里查看Dockerfile和shell腳本-> kube-job-example Docker configs[1]
讓我們從一個簡單設置的作業開始。
步驟1:創建一個任務。使用我們自定義的Docker映像,以100作為命令參數。值100將作為參數傳遞給docker ENTRYPOINT腳本。
apiVersion: batch/v1
kind: Job
metadata:
name: kubernetes-job-example
labels:
jobgroup: jobexample
spec:
template:
metadata:
name: kubejob
labels:
jobgroup: jobexample
spec:
containers:
- name: c
image: devopscube/kubernetes-job-demo:latest
args: ["100"]
restartPolicy: OnFailure
步驟2:讓我們使用kubectl創建一個Job.yaml文件。Job部署在默認名稱空間中。
kubectl apply -f job.yaml
步驟3:使用kubectl獲取Job的狀態。
kubectl get jobs
步驟4:現在,使用kubectl獲取pod列表。
kubectl get po
步驟5:您可以使用kubectl獲取Job pod日志。將pod名稱替換為您在輸出中看到的pod名稱。
kubectl logs kubernetes-job-example-bc7s9 -f
您應該看到如下所示的輸出。
多個Job Pod和并行性
在部署作業時,您可以讓它在多個具有并行性的pod上運行。
例如,在一個Job中,如果您希望并行運行6個pod和2個pod,則需要將以下兩個參數添加到Job清單中。
completions: 6
parallelism: 2
- completions: 6 指定 job 需要成功運行 Pods 的次數為 6
- parallelism: 3 指定 job 并發運行 Pods 的數量為 3
下面是帶有這些參數的清單文件。
apiVersion: batch/v1
kind: Job
metadata:
name: kubernetes-parallel-job
labels:
jobgroup: jobexample
spec:
completions: 6
parallelism: 2
template:
metadata:
name: kubernetes-parallel-job
labels:
jobgroup: jobexample
spec:
containers:
- name: c
image: devopscube/kubernetes-job-demo:latest
args: ["100"]
restartPolicy: OnFailure
并行pod處理的一個用例是消息隊列上的批處理操作。假設您有一個消息隊列,其中在每天的特定時間要處理數千條消息。
您可以將消息處理代碼作為具有并行性的Job運行,以加快處理速度。盡管所有pod使用相同的消息處理代碼,但每個pod將處理來自隊列的不同消息。
生成Kubernetes Job的隨機名稱
你不能使用單一的Job清單文件創建多個Job。Kubernetes 會拋出一個錯誤,指出已經存在同名的 Job。
為了解決這個問題,你可以在元數據中添加 generateName參數。例如:
apiVersion: batch/v1
kind: Job
metadata:
generateName: kube-job-
labels:
jobgroup: jobexample
在上述示例中,每次運行該清單時,都會創建一個名稱以 kube-job- 為前綴,后跟隨機字符串的 Job。
如何創建 Kubernetes CronJob
如果你想在特定時間表上運行批處理任務,例如每兩小時一次,你可以使用cron表達式創建一個Kubernetes CronJob。該任務將按照你在Job中指定的時間表自動啟動。
以下是如何指定cron時間表。你可以使用crontab生成器來生成你自己的時間表。
schedule: "0,15,30,45 * * * *"
下圖顯示了 Kubernetes CronJob 的調度語法。
如果我們要將之前的Job作為CronJob每15分鐘運行一次,可以使用以下清單。創建一個名為cron-job.yaml的文件,并復制以下清單內容。
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: kubernetes-cron-job
spec:
schedule: "0,15,30,45 * * * *"
jobTemplate:
spec:
template:
metadata:
labels:
app: cron-batch-job
spec:
restartPolicy: OnFailure
containers:
- name: kube-cron-job
image: devopscube/kubernetes-job-demo:latest
args: ["100"]
讓我們使用kubectl部署cronjob。
kubectl create -f cron-job.yaml
列出cronjob:
kubectl get cronjobs
要檢查Cronjob日志,您可以列出Cronjob pod,并從處于運行狀態的pod或已完成的pod中獲取日志。
手動運行Kubernetes CronJob
在某些情況下,您可能希望以臨時方式執行cronjob。您可以通過從現有的cronjob創建一個作業來實現這一點。
例如,如果您希望手動觸發cronjob,那么我們應該這樣做。
kubectl create job --from=cronjob/kubernetes-cron-job manual-cron-job
--from=cronjob/kubernetes-cron-job將復制cronjob模板并創建一個名為manual-cron-job的作業。
幾個關鍵的Kubernetes Job參數
還有一些關鍵參數可以根據需要用于kubernetes Job/cronjobs。讓我們各看一看:
- failedJobHistoryLimit和successfulJobsHistoryLimit:根據您提供的保留數刪除失敗和成功的作業歷史記錄。當您嘗試列出作業時,這對于減少所有失敗的條目非常有用。例如:failedJobHistoryLimit: 5 successfulJobsHistoryLimit: 10
- backoffLimit:如果您的pod失敗,重試的總次數。
- activedeadlinesseconds:如果您想要指定cronjob運行時間的硬限制,可以使用此參數。例如,如果您只想運行cronjob一分鐘,則可以將其設置為60。
總結
Kubernetes Job和CronJob是處理批處理任務和周期性任務的強大工具。通過定義相應的YAML文件,并使用kubectl命令創建和管理這些任務,可以輕松實現復雜的任務調度和執行。希望這篇指南能幫助你快速上手Kubernetes Job和CronJob,提升你的容器編排能力。
Reference:
[1]kube-job-example Docker configs: https://github.com/devopscube/Kubernetes-jobs-example/tree/master/Docker