k8s Job、Cronjob 的使用

Job負責處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束。而CronJob則就是在Job上加上了時間調度。shell

Job

咱們用Job這個資源對象來建立一個任務,咱們定一個Job來執行一個倒計時的任務,定義YAML文件:json

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"

 

注意JobRestartPolicy僅支持NeverOnFailure兩種,不支持Always,咱們知道Job就至關於來執行一個批處理任務,執行完就結束了,若是支持Always的話是否是就陷入了死循環了?api

而後來建立該Job,保存爲job-demo.yamlbash

$ kubectl create -f ./job.yaml
job "job-demo" created 

而後咱們能夠查看當前的Job資源對象:jsonp

$ kubectl get jobs 

注意查看咱們的Pod的狀態,一樣咱們能夠經過kubectl logs來查看當前任務的執行結果。spa

CronJob

CronJob其實就是在Job的基礎上加上了時間調度,咱們能夠:在給定的時間點運行一個任務,也能夠週期性地在給定時間點運行。這個實際上和咱們Linux中的crontab就很是相似了。rest

一個CronJob對象其實就對應中crontab文件中的一行,它根據配置的時間格式週期性地運行一個Job,格式和crontab也是同樣的。code

crontab的格式以下:對象

分 時 日 月 星期 要運行的命令 第1列分鐘0~59 第2列小時0~23) 第3列日1~31 第4列月1~12 第5列星期0~7(0和7表示星期天) 第6列要運行的命令blog

如今,咱們用CronJob來管理咱們上面的Job任務,

apiVersion: batch/v2alpha1
kind: CronJob
metadata:
  name: cronjob-demo
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - name: hello
            image: busybox
            args:
            - "bin/sh"
            - "-c"
            - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"

 

咱們這裏的KindCronJob了,要注意的是.spec.schedule字段是必須填寫的,用來指定任務運行的週期,格式就和crontab同樣,另一個字段是.spec.jobTemplate, 用來指定須要運行的任務,格式固然和Job是一致的。還有一些值得咱們關注的字段.spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit,表示歷史限制,是可選的字段。它們指定了能夠保留多少完成和失敗的Job,默認沒有限制,全部成功和失敗的Job都會被保留。然而,當運行一個Cron Job時,Job能夠很快就堆積不少,因此通常推薦設置這兩個字段的值。若是設置限制的值爲 0,那麼相關類型的Job完成後將不會被保留。

接下來咱們來建立這個cronjob

$ kubectl create -f cronjob-demo.yaml
cronjob "cronjob-demo" created 

固然,也能夠用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
$ kubectl delete cronjob hello
cronjob "hello" deleted

 

一旦再也不須要 Cron Job,簡單地可使用 kubectl 命令刪除它:

$ kubectl delete cronjob hello
cronjob "hello" deleted 

這將會終止正在建立的 Job。然而,運行中的 Job 將不會被終止,不會刪除 Job 或 它們的 Pod。爲了清理那些 Job 和 Pod,須要列出該 Cron Job 建立的所有 Job,而後刪除它們:

$ kubectl get jobs
NAME               DESIRED   SUCCESSFUL   AGE
hello-1201907962   1         1            11m
hello-1202039034   1         1            8m

  

[root@k8s-master01 jobs]# kubectl get cronjobs.batch 
NAME           SCHEDULE      SUSPEND   ACTIVE    LAST SCHEDULE   AGE
cronjob-demo   */1 * * * *   False     1         9s              4m

 

$ kubectl delete jobs hello-1201907962 hello-1202039034 ...
job "hello-1201907962" deleted
job "hello-1202039034" deleted

  

一旦 Job 被刪除,由 Job 建立的 Pod 也會被刪除。注意,全部由名稱爲 「hello」 的 Cron Job 建立的 Job 會之前綴字符串 「hello-」 進行命名。若是想要刪除當前 Namespace 中的全部 Job,能夠經過命令 kubectl delete jobs --all 馬上刪除它們。

相關文章
相關標籤/搜索