Job
我們在日常的工作中經常都會遇到一些需要進行批量數據處理和分析的需求,當然也會有按時間來進行調度的工作,在Kubernetes集群中為我們提供了Job和CronJob兩種資源對象來應對這種需求。
Job負責處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束。而CronJob則就是在Job上加上了時間調度。
apiVersion: batch/v1
kind: Job
metadata:
labels:
job-name: echo
name: echo
namespace: default
spec:
suspend: true # 1.21+
ttlSecondsAfterFinished: 100 # Job在執行結束之后(狀態為completed或Failed)自動清理。設置為0表示執行結束立即刪除,不設置則不會清除,需要開啟TTLAfterFinished特性
backoffLimit: 4 # 如果任務執行失敗,失敗多少次后不再執行
completions: 1 # 有多少個Pod執行成功,認為任務是成功的,為空默認和parallelism數值一樣
parallelism: 1 # 并行執行任務的數量,如果parallelism數值大于未完成任務數,只會創建未完成的數量;比如completions是4,并發是3,第一次會創建3個Pod執行任務,第二次只會創建一個Pod執行任務
template:
spec:
containers:
- command:
- echo
- Hello, Job
image: registry.cn-beijing.aliyuncs.com/dotbalo/busybox
imagePullPolicy: Always
name: echo
resources: {}
restartPolicy: Never
CronJob
CronJob其實就是在Job的基礎上加上了時間調度,我們可以:在給定的時間點運行一個任務,也可以周期性地在給定時間點運行。這個實際上和Linux中的crontab就非常類似了。
一個CronJob對象其實就對應crontab文件中的一行,它根據配置的時間格式周期性地運行一個Job,格式和crontab也是一樣的。
crontab的格式如下:
分 小時 日 月 周 要運行的命令 第1列分鐘(0~59) 第2列小時(0~23) 第3列日(1~31) 第4列月(1~12) 第5列星期(0~7)(0和7表示星期天) 第6列要運行的命令
apiVersion: batch/v1beta1 # batch/v1beta1 #1.21+ batch/v1
kind: CronJob
metadata:
labels:
run: hello
name: hello
namespace: default
spec:
concurrencyPolicy: Allow # 并發調度策略。可選參數如下
# Allow:允許同時運行多個任務。
# Forbid:不允許并發運行,如果之前的任務尚未完成,新的任務不會被創建。
# Replace:如果之前的任務尚未完成,新的任務會替換的之前的任務。
failedJobsHistoryLimit: 1 # 保留多少失敗的任務
jobTemplate:
metadata:
spec:
template:
metadata:
labels:
run: hello
spec:
containers:
- args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
image: registry.cn-beijing.aliyuncs.com/dotbalo/busybox
imagePullPolicy: Always
name: hello
resources: {}
restartPolicy: OnFailure # 重啟策略,和Pod一致
securityContext: {}
schedule: '*/1 * * * *' # 調度周期,和Linux一致,分別是分時日月周。
successfulJobsHistoryLimit: 3 # 保留多少已完成的任務,按需配置
suspend: false # 如果設置為true,則暫停后續的任務,默認為false。