在 Kubernetes 中運行 Cron 作業
一、簡介
在本教程中,我們將了解如何在 Kubernetes 中運行 cron 作業。
2. 什麼是 Cron 作業?
對於背景, cron 作業是指按計劃重複的任何任務。 Unix 和大多數相關操作系統都提供了一些 cron 作業功能。
cron 作業的典型用例是定期自動執行重要任務。例如:
- 清理磁盤空間
- 備份文件或目錄
- 生成指標或報告
Cron 作業按計劃運行。使用標準符號,我們可以定義範圍廣泛的調度來執行作業:
- 每晚 10:00 PM
- 每個月的第一天早上 6:00
- 每天上午 8:00 和下午 6:00
- 每個星期二早上 7:00
3. 在 Kubernetes 中定義 Cron 作業
從 1.21 版本開始,Kubernetes 為 cron 作業提供一流的支持。首先,讓我們看一下如何定義一個 cron 作業以及如何設置它的時間表。
3.1。定義 Cron 作業
Kubernetes 中的 Cron 作業類似於其他工作負載,例如部署或守護程序集。事實上,用於定義 cron 作業的 YAML 看起來非常相似:
apiVersion: batch/v1
kind: CronJob
metadata:
name: cleanup-job
spec:
schedule: "0 2 * * *"
concurrencyPolicy: Allow
suspend: false
successfulJobsHistoryLimit: 10
failedJobsHistoryLimit: 3
startingDeadlineSeconds: 60
jobTemplate:
spec:
template:
spec:
containers:
- name: cleanup-job
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/rm
- -f
- /tmp/*
restartPolicy: OnFailure
上面的 YAML 定義了一個每天凌晨 2:00 運行的 cron 作業,並從 temp 目錄中清理文件。
如前所述,用於 cron 作業的 YAML 與 Kubernetes 中的其他工作負載幾乎相同。事實上,配置的jobTemplate
部分與部署、副本集和其他類型的工作負載相同。
主要區別在於 cron 作業規範包含用於定義 cron 作業執行行為的附加字段:
-
schedule
:必填字段,使用標準 cron 語法指定 cron 作業計劃。 -
concurrencyPolicy
:指定如何處理並發作業的可選字段。默認值為Allow
,這意味著可以同時運行多個作業。其他可能的值是Forbid
(不允許)或Replace
(新作業將替換任何正在運行的作業)。 -
suspend
:可選字段,指定是否應跳過作業的未來執行。默認為false
。 -
successfulJobsHistoryLimit
:可選字段,指定要在歷史記錄中跟踪多少成功執行。默認值為 3。 -
failedJobsHistoryLimit
:可選字段,指定要在歷史記錄中跟踪多少次失敗的執行。默認值為 1。 -
startingDeadlineSeconds
: 可選字段,指定作業在被視為失敗之前允許錯過其預定開始時間的秒數。默認設置是不強制執行任何此類截止日期。
請注意,只有一個字段schedule
是必需的。稍後我們將仔細研究這個領域。
3.2.管理 Cron 作業
現在我們已經了解瞭如何定義 cron 作業,讓我們看看如何在 Kubernetes 中管理它們。
首先,假設我們將 cron 作業 YAML 定義放入名為cronjob.yaml
的文件中。然後我們可以使用kubelet
命令創建 cron 作業:
kubelet create -f /path/to/cronjob.yaml
此外,我們可以使用以下命令列出所有 cron 作業:
kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cleanup-job * 2 * * * False 0 15s 32s
我們還可以使用describe
命令查看特定 cron 作業的詳細信息,包括運行歷史記錄:
kubectl describe cronjob hello
Name: cleanup-job
Namespace: default
Labels: <none>
Annotations: <none>
Schedule: * 2 * * *
Concurrency Policy: Allow
Suspend: False
Successful Job History Limit: 3
Failed Job History Limit: 1
Starting Deadline Seconds: <unset>
Selector: <unset>
Parallelism: <unset>
Completions: <unset>
Pod Template:
Labels: <none>
Containers:
hello:
Image: busybox:1.28
Port: <none>
Host Port: <none>
Command:
/bin/rm
-f
/tmp/*
Environment: <none>
Mounts: <none>
Volumes: <none>
Last Schedule Time: Mon, 30 May 2022 02:00:00 -0600
Active Jobs: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 16m cronjob-controller Created job cleanup-job-27565242
Normal SawCompletedJob 16m cronjob-controller Saw completed job: cleanup-job-27565242, status: Complete
最後,當我們不再需要 cron 作業時,我們可以使用以下命令將其刪除:
kubectl delete cronjob cleanup-job
3.3. Cron 調度語法
cron 作業調度語法包含五個用空格分隔的參數。每個參數可以是星號或數字。
參數的順序與傳統的 Unix cron 語法相同。從左到右的字段具有以下含義和可能的值:
- 分鐘 (0 – 59)
- 小時 (0 – 23)
- 月份中的某天 (1 – 31)
- 月 (1 – 12)
- 星期幾(0 - 6)
請注意,對於 Day of Month 參數,一些系統將 0 視為星期日,而其他系統將其視為星期一。
除了上面確定的可能值之外,任何參數也可以是星號,這意味著它適用於該字段的所有可能值。
讓我們看一些例子。首先,我們可以安排一個作業在每天早上 8:00 運行:
0 8 * * *
讓我們看看每週二下午 5:00 運行作業的計劃參數:
0 17 * * 2
最後,讓我們看看如何在每個月的第 15 天每隔一小時的 30 分鐘運行作業:
30 0,2,4,6,8,10,12,14,16,18,20,22 15 * *
請注意,上述時間表也可以使用跳過語法進行簡化:
30 0-23/2 15 * *
3.4.特殊的 Cron 作業條目
除了標準的調度語法之外,cron 作業還可以使用一些特殊的標識符來指定它們的調度:
- @yearly / @annually – 每年 1 月 1 日午夜運行一份工作
- @monthly – 在每個月的第一天午夜運行一項工作
- @weekly – 每週週日午夜運行一項工作
- @daily / @midnight – 每天午夜運行一項工作
- @hourly – 在每天的每個小時開始運行作業
3.5. Cron 作業時區
默認情況下,所有 Kubernetes cron 作業都在控制管理器的時區運行。在某些情況下,可以使用變量CRON_TZ
或TZ
指定特定時區。但是,這不受官方支持。這些變量被視為內部實現細節,因此可能會在沒有警告的情況下進行更改。
從 Kubernetes 1.24 版開始,可以將時區指定為 cron 作業規範的一部分:
spec:
schedule: "0 2 * * *"
timeZone: "GMT"
timeZone
字段可以是任何有效的時區標識符。
由於此功能仍處於試驗階段,我們必須先啟用CronJobTimeZone
功能門,然後才能使用它。
4。結論
Cron 作業是重複執行重要係統任務的好方法。
在本文中,我們研究瞭如何在 Kubernetes 集群中利用 cron 作業。首先,我們看到了定義 cron 作業所需的 YAML,以及如何使用kubectl
命令管理其生命週期。最後,我們研究了定義他們的日程安排以及如何處理時區的各種方法。