⒈簡介:
Kubernetes的Job資源在創建時會立即運行pod。但是許多批處理任務需要在特定的時間運行,或者在指定的時間間隔內重復運行。在Linux和類UNIX操作系統中,這些任務通常被稱為cron任務。Kubernetes也支持這種任務。
Kubernetes中的cron任務通過創建 CronJob資源進行配置。運行任務的時間表以知名的cron格式指定,所以如果你熟悉常規cron任務,你將在幾秒鍾內了解Kubernetes的CronJob。
在配置的時間,Kubernetes將根據在CronJob對象中配置的Job模板創建Job資源。創建Job資源時,將根據任務的pod模板創建並啟動一個或多個pod副本。
⒉定義(創建)CronJob
apiVersion: batch/v1beta1 #指定當前描述文件遵循batch/v1beta1版本的KubernetesAPI kind: CronJob #我們在描述一個CronJob metadata: name: batch-job-every-fifteen-minutes #指定CronJob的名稱 spec: #當沒有指定pod選擇器時它將根據pod模板中的標簽創建 schedule: "0,15,30,45 * * * *" #這項工作應該每天在每小時0、15、30和45分鍾運行 jobTemplate: #創建新pod所使用的pod模板 spec: template: #此CronJob創建Job資源會用到的模板 metadata: labels: app: periodic-batch-job spec: restartPolicy: OnFailure #Job不能使用Always作為默認的重新啟動策略 containers: - name: main image: fanqisoft/batch-job ports: - containerPort: 8080
時間表從左到右包含以下五個條目:
·分鍾
·小時
·每月中的第幾天
·月
·星期幾
在該示例中,每15分鍾運行一次任務因此schedule字段的值應該是“0,15,30,45****”這意味着每小時的0、15、30和45分鍾(第一個星號),每月的每一天(第二個星號),每月(第三個星號)和每周的每一天(第四個星號)。
相反,如果你希望每隔30分鍾運行一次,但僅在每月的第一天運行,則應將計划設置為“0,30*1**”,並且如果你希望它每個星期天的3AM運行,將它設置為“03**0”(最后一個零代表星期天)。
⒊計划任務的運行方式
在計划的時間內,CronJob資源會創建Job資源,然后Job創建pod。
可能發生Job或pod創建並運行得相對較晚的情況。你可能對這項工作有很高的要求,任務開始不能落后於預定的時間過多。在這種情況下,可以通過指定CronJob規范中的startingDeadlineseconds字段來指定截止日期。
apiVersion: batch/v1beta1 #指定當前描述文件遵循batch/v1beta1版本的KubernetesAPI kind: CronJob #我們在描述一個CronJob metadata: name: batch-job-every-fifteen-minutes #指定CronJob的名稱 spec: #當沒有指定pod選擇器時它將根據pod模板中的標簽創建 schedule: "0,15,30,45 * * * *" #這項工作應該每天在每小時0、15、30和45分鍾運行 startingDeadlineSeconds: 15 #pod最遲必須在預定時間后15秒開始運行 jobTemplate: #創建新pod所使用的pod模板 spec: template: #此CronJob創建Job資源會用到的模板 metadata: labels: app: periodic-batch-job spec: restartPolicy: OnFailure #Job不能使用Always作為默認的重新啟動策略 containers: - name: main image: fanqisoft/batch-job ports: - containerPort: 8080
在上面的例子中,工作運行的時間應該是10:30:00。如果因為任何原因10:30:15不啟動,任務將不會運行,並將顯示為Failed。
在正常情況下,CronJob總是為計划中配置的每個執行創建一個Job,但可能會同時創建兩個Job,或者根本沒有創建。為了解決第一個問題,你的任務應該是冪等的(多次而不是一次運行不會得到不希望的結果)。對於第二個問題,請確保下一個任務運行完成本應該由上一次的(錯過的)運行完成的任何工作。