CronJobs


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 時間都採用世界標準時間:五個以空格分隔的欄位。這些欄位代表以下內容:

  1. 分鐘 (0 到 59 之間)
  2. 小時 (0 到 23 之間)
  3. 日期 (1 到 31 之間)
  4. 月份 (1 到 12 之間)
  5. 星期幾 (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.successfulJobsHistoryLimitspec.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,失敗的工作狀態則為 RunContainerErrorCrashLoopBackOff 或其他表示失敗的狀態。

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 垃圾收集器會刪除相關聯的工作,並且不會啟動新工作。

後續步驟