CronJob是一種特殊的工作負載,它並不直接管理任何Pod,而是按照指定的策略定時重複建立多個獨立的Job執行個體並監測它們的狀態。它適用於周期性以及重複性的操作,例如執行備份操作或者發送郵件。通過本文,您可瞭解控制台或kubectl建立CronJob的方式。
本文樣本使用的鏡像為公網鏡像,拉取時叢集或節點需具備公網訪問能力:
為叢集開啟訪問公網的能力(推薦):為叢集所在的VPC建立公網NAT Gateway,叢集中的所有資源均可訪問公網。
為節點分配固定公網IP:擁有公網IP的節點可拉取公網鏡像,但需要為部署工作負載的每個節點都分配公網IP。
建立CronJob
通過控制台建立
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在任務頁面,單擊使用鏡像建立。
在應用基本資料設定精靈頁面,設定應用的基本資料。然後單擊下一步,進入容器配置嚮導頁面。
在基本配置地區的鏡像名稱中輸入
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選擇保持預設勾選,則叢集已擁有公網訪問能力。如果未選擇,請參見為叢集開啟訪問公網的能力。
在進階配置嚮導頁面中,您可配置CronJob的定時與Job配置。在本樣本中,將定時規則設定為每2分鐘執行一次,其餘選項保持預設。然後,單擊最下方的建立。

配置卡片
配置項
說明
定時任務
定時規則
您可以按小時、按天、按星期、按月,或者使用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中的部分功能會使用到註解,您可在使用這些功能時再編輯。
建立完成後,您可在控制台中看到按2分鐘為間隔建立的Job。

通過kubectl建立
建立工作負載前,請確保已通過kubectl串連到叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
複製下方的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執行以下命令建立CronJob。
kubectl apply -f cronjob.yaml預期輸出:
cronjob.batch/example-cronjob created等待約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