Kubernetes中的Job和CronJob,批量任務執行

咱們常常須要進行批量數據處理和分析,以及按照時間進行調度執行。能夠在Kubenrtes中使用容器技術完成,使用Job和CronJob來執行。這樣,能夠維護較爲乾淨的執行環境,減小不一樣任務工具的相互干擾。同時能夠在集羣上按照任務要求和資源情況進行動態伸縮執行。html

  • 任務主要包含兩種:
    • Job負責批處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束。
    • CronJob是基於調度的Job執行將會自動產生多個job,調度格式參考Linux的cron系統。
  • 執行環境:
    • 不管是job仍是CronJob,執行時都產生一個pod,而後在裏面運行給定的命令
      • 要執行本身的任務,須要一個本身的Docker鏡像和yaml格式的job描述文件。
    • 執行環境是容器隔離的,外部存儲能夠經過pvc/pv等掛載進去,與pod配置參數徹底一致。
    • 任務能夠在整個集羣環境中調度執行,所以:
      • 資源訪問是漂移的,可使用nodeSelector固定要執行的節點

參考:node

一、Job,執行一次任務

Job Spec格式

  • spec.template格式同Pod。
  • RestartPolicy僅支持Never或OnFailure。
  • 單個Pod時,默認Pod成功運行後Job即結束。
  • .spec.completions標誌Job結束須要成功運行的Pod個數,默認爲1。
  • .spec.parallelism標誌並行運行的Pod的個數,默認爲1。
  • spec.activeDeadlineSeconds標誌失敗Pod的重試最大時間,超過這個時間不會繼續重試。

一個簡單的例子:數據庫

apiVersion: batch/v1beta1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      name: pi
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  • 注意,裏面的template配置方法與Deployment配置參數是徹底同樣的,用於生成運行時的pod。能夠在其中指定掛載卷、運行的命令等等。

執行工做任務:json

$ kubectl create -f ./job.yaml
job "pi" created
$ pods=$(kubectl get pods --selector=job-name=pi --output=jsonpath={.items..metadata.name})
$ kubectl logs $pods
3.141592653589793238462643383279502...

 

二、CronJob,週期執行任務

Cron Job 管理基於時間的 Job,即:api

  • 在給定時間點只運行一次。
  • 週期性地在給定時間點運行。

一個 CronJob 對象相似於 crontab (cron table)文件中的一行。併發

典型的用法以下所示:工具

  • 在給定的時間點調度 Job 運行
  • 建立週期性運行的 Job,例如:數據庫備份、發送郵件。

注意:jsonp

  • 預估job的執行時間。給定的間隔通常不該少於該job的執行時間。
  • 若是當前job還沒有結束,達到時間觸發點時,系統仍然會啓動新的任務job。
  • 若是大量job疊加啓動,將會併發訪問系統資源,可能致使系統響應變慢、甚至崩潰。

CronJob Spec

  • .spec.schedule調度,必需字段,指定任務運行週期,格式同 Cronspa

  • .spec.jobTemplateJob 模板,必需字段,指定須要運行的任務,格式同 Job.net

  • .spec.startingDeadlineSeconds :啓動 Job 的期限(秒級別),該字段是可選的。

    • 若是由於任何緣由而錯過了被調度的時間,那麼錯過執行時間的 Job 將被認爲是失敗的。

    • 若是沒有指定,則沒有期限。

  • .spec.concurrencyPolicy併發策略,該字段也是可選的。

    • 它指定了如何處理被 Cron Job 建立的 Job 的併發執行。只容許指定下面策略中的一種。

      • Allow(默認):容許併發運行 Job。

      • Forbid:禁止併發運行,若是前一個尚未完成,則直接跳過下一個。
      • Replace:取消當前正在運行的 Job,用一個新的來替換。
    • 注意,當前策略只能應用於同一個 Cron Job 建立的 Job。若是存在多個 Cron Job,它們建立的 Job 之間老是容許併發運行。

  • .spec.suspend :掛起,該字段也是可選的。

    • 若是設置爲 true,後續全部執行都會被掛起。

    • 它對已經開始執行的 Job 不起做用。默認值爲 false

  • .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

 上面的描述文件指定每分鐘執行一次,輸出一條信息。

啓動任務運行

啓動調度任務:

$ kubectl create -f cronjob.yaml
cronjob "hello" 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

# 注意,刪除cronjob的時候不會自動刪除job,這些job能夠用kubectl delete job來刪除
$ kubectl delete cronjob hello
cronjob "hello" deleted

Cron Job 限制

Cron Job 在每次調度運行時間內「大概」會建立一個 Job 對象。咱們之因此說「大概」 ,是由於在特定的環境下可能會建立兩個 Job,或者一個 Job 都沒建立。咱們嘗試少發生這種狀況,但卻不能徹底避免。所以,建立 Job 操做應該是 冪等的

Job 根據它所建立的 Pod 的並行度,負責重試建立 Pod,並就決定這一組 Pod 的成功或失敗。Cron Job 根本就不會去檢查 Pod。

刪除 Cron Job

一旦再也不須要 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
...

$ 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 馬上刪除它們。

相關文章
相關標籤/搜索