【K8s任務】使用 CronJob 運行自動化任務


參考:https://kubernetes.io/zh/docs/tasks/job/automated-tasks-with-cron-jobs/

在Kubernetes v1.21 版本中,CronJob 被提升為通用版本。如果你使用的是舊版本的 Kubernetes,請參考你正在使用的 Kubernetes 版本的文檔,這樣你就能看到准確的信息。舊的 Kubernetes 版本不支持batch/v1 CronJob API。 你可以利用 CronJobs 執行基於時間調度的任務。這些自動化任務和 Linux 或者 Unix 系統的 Cron 任務類似。

CronJobs 在創建周期性以及重復性的任務時很有幫助,例如執行備份操作或者發送郵件。CronJobs 也可以在特定時間調度單個任務,例如你想調度低活躍周期的任務。

CronJobs 有一些限制和特點。 例如,在特定狀況下,同一個 CronJob 可以創建多個任務。 因此,任務應該是冪等的。 查看更多限制,請參考 CronJobs。

創建 CronJob

CronJob 需要一個配置文件。 本例中 CronJob 的.spec 配置文件每分鍾打印出當前時間和一個問好信息:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

想要運行示例的 CronJob,可以下載示例文件並執行命令:

kubectl create -f https://k8s.io/examples/application/job/cronjob.yaml

cronjob.batch/hello created

創建好 CronJob 后,使用下面的命令來獲取其狀態:

kubectl get cronjob hello

輸出類似於:

NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        50s             75s

就像你從命令返回結果看到的那樣,CronJob 還沒有調度或執行任何任務。大約需要一分鍾任務才能創建好。

kubectl get jobs --watch

NAME               COMPLETIONS   DURATION   AGE
hello-4111706356   0/1                      0s
hello-4111706356   0/1           0s         0s
hello-4111706356   1/1           5s         5s

現在你已經看到了一個運行中的任務被 “hello” CronJob 調度。 你可以停止監視這個任務,然后再次查看 CronJob 就能看到它調度任務:

kubectl get cronjob hello

輸出類似於:

NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        50s             75s

你應該能看到 “hello” CronJob 在 LAST-SCHEDULE 聲明的時間點成功的調度了一次任務。 有 0 個活躍的任務意味着任務執行完畢或者執行失敗。

現在,找到最后一次調度任務創建的 Pod 並查看一個 Pod 的標准輸出。請注意任務名稱和 Pod 名稱是不同的。

說明: Job 名稱和 Pod 名稱不同。

# 在你的系統上將 "hello-4111706356" 替換為 Job 名稱
pods=$(kubectl get pods --selector=job-name=hello-4111706356 --output=jsonpath={.items..metadata.name})

查看 Pod 日志:

kubectl logs $pods

Fri Feb 22 11:02:09 UTC 2019
Hello from the Kubernetes cluster

刪除 CronJob

當你不再需要 CronJob 時,可以用 kubectl delete cronjob 刪掉它:

kubectl delete cronjob hello

刪除 CronJob 會清除它創建的所有任務和 Pod,並阻止它創建額外的任務。你可以查閱 垃圾收集。

編寫 CronJob 聲明信息

像 Kubernetes 的其他配置一樣,CronJob 需要 apiVersion、kind、和 metadata 域。 配置文件的一般信息,請參考 部署應用 和 使用 kubectl 管理資源.

CronJob 配置也需要包括 .spec.

說明: 對 CronJob 的所有改動,特別是它的 .spec,只會影響將來的運行實例。

時間安排

.spec.schedule 是 .spec 需要的域。它使用了 Cron 格式串,例如 0 * * * * or @hourly ,作為它的任務被創建和執行的調度時間。

該格式也包含了擴展的 "Vixie cron" 步長值。 FreeBSD 手冊中解釋如下:

步長可被用於范圍組合。范圍后面帶有 /<數字> 可以聲明范圍內的步幅數值。 例如,0-23/2 可被用在小時域來聲明命令在其他數值的小時數執行 ( V7 標准中對應的方法是0,2,4,6,8,10,12,14,16,18,20,22)。 步長也可以放在通配符后面,因此如果你想表達 "每兩小時",就用 */2 。

說明: 調度中的問號 (?) 和星號 * 含義相同,表示給定域的任何可用值。

任務模版

.spec.jobTemplate是任務的模版,它是必須的。它和 Job的語法完全一樣, 除了它是嵌套的沒有 apiVersion 和 kind。 編寫任務的 .spec ,請參考 編寫 Job 的Spec。

開始的最后期限

.spec.startingDeadlineSeconds 域是可選的。 它表示任務如果由於某種原因錯過了調度時間,開始該任務的截止時間的秒數。過了截止時間,CronJob 就不會開始任務。 不滿足這種最后期限的任務會被統計為失敗任務。如果該域沒有聲明,那任務就沒有最后期限。

如果.spec.startingDeadlineSeconds字段被設置(非空),CronJob 控制器會計算從預期創建 Job 到當前時間的時間差。 如果時間差大於該限制,則跳過此次執行。

例如,如果將其設置為 200,則 Job 控制器允許在實際調度之后最多 200 秒內創建 Job。

並發性規則

.spec.concurrencyPolicy 也是可選的。它聲明了 CronJob 創建的任務執行時發生重疊如何處理。 spec 僅能聲明下列規則中的一種:

  • Allow (默認):CronJob 允許並發任務執行。
  • Forbid: CronJob 不允許並發任務執行;如果新任務的執行時間到了而老任務沒有執行完,CronJob 會忽略新任務的執行。
  • Replace:如果新任務的執行時間到了而老任務沒有執行完,CronJob 會用新任務替換當前正在運行的任務。

請注意,並發性規則僅適用於相同 CronJob 創建的任務。如果有多個 CronJob,它們相應的任務總是允許並發執行的。

掛起

.spec.suspend域也是可選的。如果設置為 true ,后續發生的執行都會掛起。 這個設置對已經開始的執行不起作用。默認是關閉的。

注意: 在調度時間內掛起的執行都會被統計為錯過的任務。當 .spec.suspend 從 true 改為 false 時, 且沒有 開始的最后期限,錯過的任務會被立即調度。

任務歷史限制

.spec.successfulJobsHistoryLimit 和 .spec.failedJobsHistoryLimit是可選的。 這兩個字段指定應保留多少已完成和失敗的任務。 默認設置為3和1。限制設置為0代表相應類型的任務完成后不會保留。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM