全部產品
Search
文件中心

Container Service for Kubernetes:建立定時任務工作負載CronJob

更新時間:Jun 21, 2025

CronJob是一種特殊的工作負載,它並不直接管理任何Pod,而是按照指定的策略定時重複建立多個獨立的Job執行個體並監測它們的狀態。它適用於周期性以及重複性的操作,例如執行備份操作或者發送郵件。通過本文,您可瞭解控制台或kubectl建立CronJob的方式。

重要

本文樣本使用的鏡像為公網鏡像,拉取時叢集或節點需具備公網訪問能力:

  • 為叢集開啟訪問公網的能力(推薦):為叢集所在的VPC建立公網NAT Gateway,叢集中的所有資源均可訪問公網。

  • 為節點分配固定公網IP:擁有公網IP的節點可拉取公網鏡像,但需要為部署工作負載的每個節點都分配公網IP。

建立CronJob

通過控制台建立

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 定時任務

  3. 任務頁面,單擊使用鏡像建立

  4. 應用基本資料設定精靈頁面,設定應用的基本資料。然後單擊下一步,進入容器配置嚮導頁面。

  5. 基本配置地區的鏡像名稱中輸入registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest,在生命週期地區的啟動執行 > 命令中輸入/bin/sh參數中輸入["-c", "echo 'starting...'; COUNTER=0; while [ $COUNTER -lt 5 ]; do sleep 2; COUNTER=$((COUNTER+1)); echo $COUNTER; done; echo 'finished'; exit 0"],如下圖所示。然後單擊下一步,進入進階設定精靈頁面。

    重要

    拉取registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest鏡像前,您需要為叢集開啟公網訪問能力。如果您在建立叢集時,為專用網路配置SNAT選擇保持預設勾選,則叢集已擁有公網訪問能力。如果未選擇,請參見為叢集開啟訪問公網的能力

    image.png

  6. 進階配置嚮導頁面中,您可配置CronJob的定時與Job配置。在本樣本中,將定時規則設定為每2分鐘執行一次,其餘選項保持預設。然後,單擊最下方的建立

    image.png

    配置卡片

    配置項

    說明

    定時任務

    定時規則

    您可以按小時、按天、按星期、按月,或者使用Cron運算式設定定時規則。

    關於更多Cron運算式說明,請參見Cron Expressions

    並發策略

    當前Job未完成時,是否可以建立新Job。

    • Forbid:跳過當次的新Job建立,適用於Job有明確運行順序或互相依賴的情境。

    • Allow:允許並發運行,直接建立新Job,適用於Job之間不互相影響的情境。

    • Replace:終止當前Job並建立新Job,適用於需要最新執行結果的情境。

    任務記錄

    CronJob保留的成功與失敗的Job執行個體數量,以避免過多記錄佔用資源。

    • 保留成功任務數:保留多少最新的成功Job執行個體。

    • 保留失敗任務數:保留多少最新的失敗Job執行個體。

    任務設定

    成功啟動並執行Pod數

    jobTemplate.spec.completions,指定進入完成狀態的Pod數量。

    並行啟動並執行Pod數

    jobTemplate.spec.parallelism,同時啟動並執行Pod數量。

    逾時時間

    jobTemplate.spec.activeDeadlineSeconds,單個Job的最大已耗用時間。Job已耗用時間超過此值後立即停止,不論是否完成。適用於有強制時效性要求或可能陷入無限迴圈的任務。預設值為600,單位秒(s)。

    重試次數

    jobTemplate.spec.backoffLimit:Pod失敗後的最大重試次數,是所有Pod失敗次數的總和。預設值為6

    重啟策略

    jobTemplate.spec.template.spec.restartPolicy,Pod失敗後的重啟策略。

    • 不重啟:Pod中的容器異常退出後,嘗試原地重啟Pod(不建立 Pod)。重啟不計入spec.backoffLimit

    • 失敗時:Pod失敗後,建立新Pod進行替換。

    標籤和註解

    Pod標籤

    為該工作負載所屬的每個Pod添加標籤(Label)。叢集中包括工作負載、Service在內的各種資源會通過標籤與Pod進行匹配。ACK為Pod預設添加格式為app:(應用程式名稱)的標籤。

    Pod註解

    為該工作負載所屬的每個Pod添加註解(Annotation)。ACK中的部分功能會使用到註解,您可在使用這些功能時再編輯。

  7. 建立完成後,您可在控制台中看到按2分鐘為間隔建立的Job。

    image.png

通過kubectl建立

重要

建立工作負載前,請確保已通過kubectl串連到叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集

  1. 複製下方的YAML檔案,並儲存到cronjob.yaml中。CronJob的jobTemplate.spec部分格式與Job的spec相同,下方使用了建立任務工作負載Job中的Job樣本。

    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: example-cronjob
      labels:
        app: cronjob
    spec:
      schedule: "*/2 * * * *" # 每2分鐘運行一次
      concurrencyPolicy: Forbid # 禁止並發執行
      successfulJobsHistoryLimit: 3 # 保留最近3個成功完成的 Job
      failedJobsHistoryLimit: 2     # 保留最近2個失敗的 Job
      jobTemplate:
        spec:
          completions: 1 # 兩個Pod完成後停止Job
          parallelism: 1 # 同時只運行一個Pod
          template:
            spec:
              containers:
              - name: counter
                image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
                command: 
                - /bin/sh
                - -c
                - |
                  echo "starting...";
                  COUNTER=0;
                  while [ $COUNTER -lt 5 ]; do
                    sleep 2;
                    COUNTER=$((COUNTER+1));
                    echo "${COUNTER}";
                  done;
                  echo "finished";
                  exit 0
              restartPolicy: Never # 不重啟Pod
  2. 執行以下命令建立CronJob。

    kubectl apply -f cronjob.yaml

    預期輸出:

    cronjob.batch/example-cronjob created
  3. 等待約10分鐘後,執行以下命令查看Job執行情況。

    kubectl get job

    預期輸出:

    NAME                       STATUS     COMPLETIONS   DURATION   AGE
    example-cronjob-2901**22   Complete   2/2           31s        5m13s
    example-cronjob-2901**23   Complete   2/2           31s        3m13s
    example-cronjob-2901**24   Complete   2/2           26s        73s

相關文檔