Google Kubernetes Engine (GKE) 1.21 以上版本已全面支援 CronJobs。本文說明如何在 GKE 中執行 CronJob。CronJob 是 Kubernetes 的內建功能。詳情請參閱 Kubernetes 說明文件中的 CronJob 相關內容。
總覽
CronJob 會依週期性排程建立 Kubernetes Job。您可以使用 CronJob 自動執行一般任務,例如建立備份、製作報表、傳送電子郵件或清理資料。
CronJob 的建立、管理、資源調度和刪除方式都與工作相同。建立的 Job 物件確切數量取決於多項因素。詳情請參閱「CronJob 限制」一節。
如要進一步瞭解工作,請參閱執行工作。
事前準備
開始之前,請確認你已完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update
,取得最新版本。
建立 CronJob
您可以使用資訊清單檔案建立 CronJob。舉例來說,下列 YAML 資訊清單會每分鐘列印目前時間和一個字串,同時保留 CronJob 參數的預設值:
# cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
concurrencyPolicy: Allow
startingDeadlineSeconds: 100
suspend: false
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo "Hello, World!"
restartPolicy: OnFailure
如要建立這個 CronJob,請將 YAML 資訊清單另存為檔案,然後套用至叢集:
kubectl apply -f PATH_TO_FILE
將 PATH_TO_FILE
替換為 YAML 資訊清單的路徑。
設定 CronJob
建立 CronJob 時,您可以指定下列參數:
指定 CronJob 的執行時間
spec.schedule
欄位會使用 Unix 標準 crontab
格式來指定 CronJob 執行的時間和頻率。所有的 CronJob 時間都採用世界標準時間:五個以空格分隔的欄位。這些欄位代表以下內容:
- 分鐘 (0 到 59 之間)
- 小時 (0 到 23 之間)
- 日期 (1 到 31 之間)
- 月份 (1 到 12 之間)
- 星期幾 (0 到 6 之間,從星期日開始)
您可以在任何 spec.schedule
欄位中使用下列特殊字元:
?
是符合單一字元的萬用字元值。*
是符合零個或多個字元的萬用字元值。/
可指定欄位的間隔。例如,如果第一個欄位 (分鐘欄位) 的值為*/5
,表示「每 5 分鐘一次」。 如果第五個欄位 (星期幾欄位) 設為0/5
,則表示「每隔第五個星期日」。
指定 CronJob 的執行內容
spec.jobTemplate
說明 CronJob 的執行內容,包括容器映像檔、容器執行的指令,以及 CronJob 的重新啟動政策。如要進一步瞭解 spec.jobTemplate
中應包含的內容,請參閱 Kubernetes CronJob 說明文件。
指定期限
選用的 startingDeadlineSeconds
欄位可指定如果 CronJob 因任何原因錯過了排定時間,要啟動 CronJob 需要的秒數上限。錯過的 CronJob 會被視為失敗。
如要指定期限,請將 startingDeadlineSeconds
值加到資訊清單檔案中 CronJob 的 spec
欄位。例如,以下資訊清單會指定 CronJob 在 100 秒後啟動:
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
jobTemplate:
spec:
...
指定並行政策
選用的 spec.concurrencyPolicy
欄位可指定如何處理由 CronJob 控制器建立的並行執行工作。如果您沒有設定這個值,系統會預設允許多個並行工作。
concurrencyPolicy
接受下列值:
值 | 意義 |
---|---|
Allow |
允許並行工作。這是目前的預設做法。 |
Forbid |
系統禁止並行工作,必須要等前一個工作完成或逾時後,才能開始執行新工作。 |
Replace |
系統禁止並行工作,舊工作會取消改為執行新工作。 |
暫停後續執行
選用的 spec.suspend
欄位,若設為 true
會阻止新工作執行,但允許目前的工作執行完成。
指定記錄限制
CronJob 每次執行時都會建立一個 Pod。查看 CronJob 記錄中介紹如何查看 CronJob 最近執行的終止狀態以及個別 Pod 的記錄檔。
您可以透過指定 spec.successfulJobsHistoryLimit
和 spec.failedJobsHistoryLimit
的值,來設定要儲存 CronJob 執行成功和失敗的數目。根據預設,successfulJobsHistoryLimit
設為 3,failedJobsHistoryLimit
設為 1。
舉例來說,以下資訊清單會指示 GKE 最多儲存五個 CronJob 執行成功案例,以及最多儲存 10 個 CronJob 執行失敗案例:
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
successfulJobsHistoryLimit: 5
failedJobsHistoryLimit: 10
jobTemplate:
spec:
...
如要停用保留 CronJob 執行成功或失敗的記錄,請將對應的值設為 0
。停用記錄保留功能可能會導致除錯失敗更加困難。舉例來說,下列資訊清單會指示 GKE 只儲存失敗的 CronJob 執行作業:
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
startingDeadlineSeconds: 100
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 10
jobTemplate:
spec:
...
檢查 CronJob
如要檢查 CronJob 的設定,請使用 kubectl describe
:
kubectl describe cronjob CRONJOB_NAME
將 CRONJOB_NAME
替換為要檢查的 CronJob 名稱。
查看 CronJob 記錄
在 Pod 中執行的 CronJob。根據預設,Kubernetes 會保留已終止的 Pod 記錄檔,其中包含 CronJob 最後三次成功執行,以及最近一次失敗的工作。如要變更或停用這些預設值,請變更 CronJob 記錄限制。
如要查看 CronJob 的記錄,首先請列出所有 Pod。已完成的 CronJob 狀態顯示為 Completed
,失敗的工作狀態則為 RunContainerError
、CrashLoopBackOff
或其他表示失敗的狀態。
NAME READY STATUS RESTARTS AGE
hello-1556555640-9bc5r 0/1 Completed 0 3m6s
hello-1556555700-cm6wk 0/1 Completed 0 2m6s
hello-1556555760-62wf5 0/1 Completed 0 66s
hello-1556555820-rl8kl 0/1 Completed 0 5s
hello-failed-1556555820-wrvt2 0/1 RunContainerError 1 5s
如要查看特定 CronJob 的記錄檔,請執行下列指令:
kubectl logs POD_NAME
將 POD_NAME
替換為要檢查的 Pod 名稱。
輸出結果會與下列內容相似:
container_linux.go:247: starting container process caused
"exec: \"/in/sh\": stat /in/sh: no such file or directory"
刪除 CronJob
如要刪除 CronJob,請執行下列指令:
kubectl delete cronjob CRONJOB_NAME
當您刪除 CronJob 時,Kubernetes 垃圾收集器會刪除相關聯的工作,並且不會啟動新工作。
後續步驟
- 請參閱 Kubernetes 說明文件中的 CronJob 相關內容。
- 瞭解如何執行一次性工作。