昨天跟各位介紹 Kubernetes Job 主要負責的是短時及批量的工作負載。
而今天要介紹的是 Job 的兄弟 CronJob。
Kubernetes CronJob 跟 Job 的工作差不多,比較顯著的差異為 CronJob 主要用於執行週期性的動作,像是:備份、報告生成等。在這些任務中都應該要配置為週期性重複的,例如:每天、每月或每年一次,這些都可以自行定義任務開始執行的時間間隔。
不過這邊有一個需要注意的地方是,如 v1 CronJob API 裡面所述,官方版本並不支援設置時區。 Kubernetes 的官方項目不支持設置像是 CRON_TZ 或是 TZ 等變量。這兩個變量用於解析及計算下一個 Job 創建時間所使用的內部庫中一個實現細節。
以下我們來試著創建一個會在每分鐘打印出當前時間和問候消息的 CronJob :
# test_cronjob.yaml
apiVersion: batch/v1beta
kind: CronJob
metadata:
name: hello
spec:
schedule: "* * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
接著將它創建起來:
kubectl apply -f test_cronjob.yaml
接下來來觀察一下他創建的 Pod :
kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-1663211640-xsx54 0/1 Completed 0 2m19s
hello-1663211700-f49v5 0/1 Completed 0 79s
hello-1663211760-t9xzd 0/1 Completed 0 28s
這邊我們發現他產生了 3 個 pod 來執行我們賦予的工作,過了一陣子再查看一次會發現,原本的 3 個 pod 已不存在,而且又出現 3 個新的 Pod ,這是因為 CronJob 文件裡有一個預設的參數 successfulJobsHistoryLimit ,而這參數所代表的是要保留的成功完成作業數,它的預設值是 3 ,若超過的話,它會自動將舊的 Pod 刪掉。
這時候我們可以看看在這些 Pod 創建期間做了什麼事:
ubuntu@ubuntu-pve:~$ kubectl logs hello-1663211700-f49v5
Thu Sep 15 03:15:15 UTC 2022
Hello from the Kubernetes cluster
根據輸出的結果可以發現它將目前的時間及預設的訊息印出來了,完成了我們所賦予的任務。在接下來的每一分鐘,它都會建立一個新的 Pod 繼續定時完成任務。
那當然,如果要根據自己的需求去定義他的週期的話也可以,只要修改 schedule 裡的 * 字號就可以更動,而每一個位置都代表著不同的時間,
# ┌───────────── 分鐘 (0 - 59)
# │ ┌───────────── 小時 (0 - 23)
# │ │ ┌───────────── 月的某日 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 周的某天 (0 - 6)
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ │
# * * * * *
可以根據上面的規則,去定義自己想要的週期,例如:
每年1 月1 日的午夜運行一次 0011*
每天早上8點運行一次 08***
介紹到這邊,已經把一些基本的 CronJob 介紹完了,如果有讀者想要更深入的研究一些定義的參數的話,不仿可以看看 CronJob 的官方 Documentation。
那今天就先到這邊吧,大家掰掰!