Job
負責處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個Pod
成功結束。
而CronJob
則就是在Job
上加上了時間調度。
一、job
用Job
這個資源對象來創建一個任務,我們定一個Job
來執行一個倒計時的任務,定義YAML
文件
apiVersion: batch/v1 kind: Job metadata: name: job-demo spec: template: metadata: name: job-demo spec: restartPolicy: Never containers: - name: counter image: busybox command: - "bin/sh" - "-c" - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
查看運行日志
#kubectl describe jobs job-demo Name: job-demo Namespace: default Selector: controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e Labels: controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e job-name=job-demo Pods Statuses: 1 Running / 0 Succeeded / 2 Failed Pod Template: Labels: controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e job-name=job-demo Containers: counter: Image: busybox Port: <none> Host Port: <none> Command: bin/bash -c for i in 9 8 7 6 5 4 3 2 1; do echo $i; done Environment: <none> Mounts: <none> Volumes: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 60s job-controller Created pod: job-demo-d26wx Normal SuccessfulCreate 42s job-controller Created pod: job-demo-tm896 Normal SuccessfulCreate 2s job-controller Created pod: job-demo-wpbcs
https://kubernetes.io/zh/docs/concepts/workloads/controllers/job/ 官網
注意Job
的RestartPolicy
僅支持Never
和OnFailure
兩種,不支持Always
,我們知道Job
就相當於來執行一個批處理任務,執行完就結束了,如果支持Always
的話是不是就陷入了死循環了?
二、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列要運行的命令
現在,我們用CronJob
來管理我們上面的Job
任務,
我們這里的Kind
是CronJob
了,要注意的是.spec.schedule
字段是必須填寫的,用來指定任務運行的周期,格式就和crontab
一樣,另外一個字段是.spec.jobTemplate
, 用來指定需要運行的任務,格式當然和Job
是一致的。還有一些值得我們關注的字段.spec.successfulJobsHistoryLimit
和.spec.failedJobsHistoryLimit
,表示歷史限制,是可選的字段。它們指定了可以保留多少完成和失敗的Job
,默認沒有限制,所有成功和失敗的Job
都會被保留。然而,當運行一個Cron Job
時,Job
可以很快就堆積很多,所以一般推薦設置這兩個字段的值。如果設置限制的值為 0,那么相關類型的Job
完成后將不會被保留.
apiVersion: batch/v1beta1 kind: CronJob metadata: name: hello spec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: containers: - name: hello image: busybox args: - /bin/sh - -c - date; echo Hello from the Kubernetes cluster restartPolicy: OnFailure
查看cronjob
# kubectl get cronjob hello NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello */1 * * * * False 0 51s 3m25s # kubectl get pod NAME READY STATUS RESTARTS AGE hello-1606739520-d67pb 0/1 Completed 0 87s hello-1606739580-cpfbp 0/1 Completed 0 27s # kubectl logs hello-1606739580-cpfbp Mon Nov 30 12:33:25 UTC 2020 Hello from the Kubernetes cluster
https://kubernetes.io/zh/docs/tasks/job/automated-tasks-with-cron-jobs/ 使用 CronJob 運行自動化任務
當然,也可以用kubectl run
來創建一個CronJob
:
kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster" $ kubectl get cronjob NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE hello */1 * * * * False 0 <none> $ kubectl get jobs NAME DESIRED SUCCESSFUL AGE hello-1202039034 1 1 49s $ pods=$(kubectl get pods --selector=job-name=hello-1202039034 --output=jsonpath={.items..metadata.name} -a) $ kubectl logs $pods Mon Aug 29 21:34:09 UTC 2016 Hello from the Kubernetes cluster