掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
CronJob 用于執(zhí)行周期性的動(dòng)作,例如備份、報(bào)告生成等。 這些任務(wù)中的每一個(gè)都應(yīng)該配置為周期性重復(fù)的(例如:每天/每周/每月一次); 你可以定義任務(wù)開(kāi)始執(zhí)行的時(shí)間間隔。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:域名申請(qǐng)、網(wǎng)站空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、大荔網(wǎng)站維護(hù)、網(wǎng)站推廣。
FEATURE STATE: Kubernetes v1.21 [stable]
CronJob 創(chuàng)建基于時(shí)隔重復(fù)調(diào)度的 Jobs。
一個(gè) CronJob 對(duì)象就像 crontab (cron table) 文件中的一行。 它用 Cron 格式進(jìn)行編寫, 并周期性地在給定的調(diào)度時(shí)間執(zhí)行 Job。
所有 CronJob 的 ?
schedule?: 時(shí)間都是基于 kube-controller-manager. 的時(shí)區(qū)。
如果你的控制平面在 Pod 或是裸容器中運(yùn)行了 kube-controller-manager, 那么為該容器所設(shè)置的時(shí)區(qū)將會(huì)決定 Cron Job 的控制器所使用的時(shí)區(qū)。
Kubernetes 項(xiàng)目官方并不支持設(shè)置如 ?
CRON_TZ?或者 ?TZ?等變量。 ?CRON_TZ?或者 ?TZ?是用于解析和計(jì)算下一個(gè) Job 創(chuàng)建時(shí)間所使用的內(nèi)部庫(kù)中一個(gè)實(shí)現(xiàn)細(xì)節(jié)。 不建議在生產(chǎn)集群中使用它。
為 CronJob 資源創(chuàng)建清單時(shí),請(qǐng)確保所提供的名稱是一個(gè)合法的 DNS 子域名. 名稱不能超過(guò) 52 個(gè)字符。 這是因?yàn)?nbsp;CronJob 控制器將自動(dòng)在提供的 Job 名稱后附加 11 個(gè)字符,并且存在一個(gè)限制, 即 Job 名稱的最大長(zhǎng)度不能超過(guò) 63 個(gè)字符。
下面的 CronJob 示例清單會(huì)在每分鐘打印出當(dāng)前時(shí)間和問(wèn)候消息:
apiVersion: batch/v1
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
# ┌───────────── 分鐘 (0 - 59)
# │ ┌───────────── 小時(shí) (0 - 23)
# │ │ ┌───────────── 月的某天 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 周的某天 (0 - 6)(周日到周一;在某些系統(tǒng)上,7 也是星期日)
# │ │ │ │ │ 或者是 sun,mon,tue,web,thu,fri,sat
# │ │ │ │ │
# │ │ │ │ │
# * * * * *
| 輸入 | 描述 | 相當(dāng)于 |
|---|---|---|
| @yearly (or @annually) | 每年 1 月 1 日的午夜運(yùn)行一次 | 0 0 1 1 * |
| @monthly | 每月第一天的午夜運(yùn)行一次 | 0 0 1 * * |
| @weekly | 每周的周日午夜運(yùn)行一次 | 0 0 * * 0 |
| @daily (or @midnight) | 每天午夜運(yùn)行一次 | 0 0 * * * |
| @hourly | 每小時(shí)的開(kāi)始一次 | 0 * * * * |
例如,下面這行指出必須在每個(gè)星期五的午夜以及每個(gè)月 13 號(hào)的午夜開(kāi)始任務(wù):
?0 0 13 * 5 ?
要生成 CronJob 時(shí)間表表達(dá)式,你還可以使用 crontab.guru 之類的 Web 工具。
CronJob 根據(jù)其計(jì)劃編排,在每次該執(zhí)行任務(wù)的時(shí)候大約會(huì)創(chuàng)建一個(gè) Job。 我們之所以說(shuō) "大約",是因?yàn)樵谀承┣闆r下,可能會(huì)創(chuàng)建兩個(gè) Job,或者不會(huì)創(chuàng)建任何 Job。 我們?cè)噲D使這些情況盡量少發(fā)生,但不能完全杜絕。因此,Job 應(yīng)該是 冪等的。
如果 ?startingDeadlineSeconds ?設(shè)置為很大的數(shù)值或未設(shè)置(默認(rèn)),并且 ?concurrencyPolicy ?設(shè)置為 ?Allow?,則作業(yè)將始終至少運(yùn)行一次。
如果 ?
startingDeadlineSeconds?的設(shè)置值低于 10 秒鐘,CronJob 可能無(wú)法被調(diào)度。 這是因?yàn)?nbsp;CronJob 控制器每 10 秒鐘執(zhí)行一次檢查。
對(duì)于每個(gè) CronJob,CronJob 控制器(Controller) 檢查從上一次調(diào)度的時(shí)間點(diǎn)到現(xiàn)在所錯(cuò)過(guò)了調(diào)度次數(shù)。如果錯(cuò)過(guò)的調(diào)度次數(shù)超過(guò) 100 次, 那么它就不會(huì)啟動(dòng)這個(gè)任務(wù),并記錄這個(gè)錯(cuò)誤:
Cannot determine if job needs to be started. Too many missed start time (> 100). Set or decrease .spec.startingDeadlineSeconds or check clock skew.
需要注意的是,如果 ?startingDeadlineSeconds ?字段非空,則控制器會(huì)統(tǒng)計(jì)從 ?startingDeadlineSeconds ?設(shè)置的值到現(xiàn)在而不是從上一個(gè)計(jì)劃時(shí)間到現(xiàn)在錯(cuò)過(guò)了多少次 Job。 例如,如果 ?startingDeadlineSeconds ?是 ?200?,則控制器會(huì)統(tǒng)計(jì)在過(guò)去 200 秒中錯(cuò)過(guò)了多少次 Job。
如果未能在調(diào)度時(shí)間內(nèi)創(chuàng)建 CronJob,則計(jì)為錯(cuò)過(guò)。 例如,如果 ?concurrencyPolicy ?被設(shè)置為 ?Forbid?,并且當(dāng)前有一個(gè)調(diào)度仍在運(yùn)行的情況下, 試圖調(diào)度的 CronJob 將被計(jì)算為錯(cuò)過(guò)。
例如,假設(shè)一個(gè) CronJob 被設(shè)置為從 ?08:30:00? 開(kāi)始每隔一分鐘創(chuàng)建一個(gè)新的 Job, 并且它的 ?startingDeadlineSeconds ?字段未被設(shè)置。如果 CronJob 控制器從 ?08:29:00? 到 ?10:21:00? 終止運(yùn)行,則該 Job 將不會(huì)啟動(dòng),因?yàn)槠溴e(cuò)過(guò)的調(diào)度 次數(shù)超過(guò)了 100。
為了進(jìn)一步闡述這個(gè)概念,假設(shè)將 CronJob 設(shè)置為從 ?08:30:00? 開(kāi)始每隔一分鐘創(chuàng)建一個(gè)新的 Job, 并將其 ?startingDeadlineSeconds ?字段設(shè)置為 200 秒。 如果 CronJob 控制器恰好在與上一個(gè)示例相同的時(shí)間段(?08:29:00? 到 ?10:21:00?)終止運(yùn)行, 則 Job 仍將從 ?10:22:00? 開(kāi)始。 造成這種情況的原因是控制器現(xiàn)在檢查在最近 200 秒(即 3 個(gè)錯(cuò)過(guò)的調(diào)度)中發(fā)生了多少次錯(cuò)過(guò)的 Job 調(diào)度,而不是從現(xiàn)在為止的最后一個(gè)調(diào)度時(shí)間開(kāi)始。
CronJob 僅負(fù)責(zé)創(chuàng)建與其調(diào)度時(shí)間相匹配的 Job,而 Job 又負(fù)責(zé)管理其代表的 Pod。
從 Kubernetes v1.21 版本開(kāi)始,CronJob 控制器的第二個(gè)版本被用作默認(rèn)實(shí)現(xiàn)。 要禁用此默認(rèn) CronJob 控制器而使用原來(lái)的 CronJob 控制器,請(qǐng)?jiān)?nbsp;kube-controller-manager 中設(shè)置特性門控 ?CronJobControllerV2?,將此標(biāo)志設(shè)置為 ?false?。例如:
--feature-gates="CronJobControllerV2=false"

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流