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