溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

K8S之任務(wù)計(jì)劃Cron Job

發(fā)布時(shí)間:2020-07-10 10:21:05 來源:網(wǎng)絡(luò) 閱讀:1298 作者:breaklinux 欄目:系統(tǒng)運(yùn)維

Cron Job 是什么?

Cron Job 管理基于時(shí)間的 Job,即:

  • 在給定時(shí)間點(diǎn)只運(yùn)行一次

  • 在給定時(shí)間點(diǎn)周期性地運(yùn)行

一個(gè) CronJob 對(duì)象類似于 crontab (cron table)文件中的一行。它根據(jù)指定的預(yù)定計(jì)劃周期性地運(yùn)行一個(gè) Job

注意: 在預(yù)定計(jì)劃中,問號(hào)(?)和星號(hào)(*)的意義是相同的,表示給定字段的取值是任意可用值。

注意: 在 Kubernetes 1.4 版本引入了 ScheduledJob 資源,但從 1.5 版本開始改成了 CronJob。

典型的用法如下所示:

  • 在給定的時(shí)間點(diǎn)調(diào)度 Job 運(yùn)行

  • 創(chuàng)建周期性運(yùn)行的 Job,例如:數(shù)據(jù)庫備份、發(fā)送郵件。

前提條件

當(dāng)使用的 Kubernetes 集群,版本 >= 1.4(對(duì) ScheduledJob),>= 1.5(對(duì) CronJob),當(dāng)啟動(dòng) API Server(參考 為集群開啟或關(guān)閉 API 版本 獲取更多信息)時(shí),通過傳遞選項(xiàng) --runtime-config=batch/v2alpha1=true 可以開啟 batch/v2alpha1 API。

創(chuàng)建 Cron Job

下面是一個(gè) Cron Job 的例子。它會(huì)每分鐘運(yùn)行一個(gè) Job,打印出當(dāng)前時(shí)間并輸出問候語 hello。

% include code.html language=“yaml” file=“cronjob.yaml”ghlink=“/docs/concepts/workloads/controllers/cronjob.yaml” %}

下載并運(yùn)行該示例 Cron Job,然后執(zhí)行如下命令:


$?kubectl?create?-f?./cronjob.yaml?
cronjob?"hello"?created

可選地,使用 kubectl run 創(chuàng)建一個(gè) Cron Job,不需要寫完整的配置:


$?kubectl?run?hello?--schedule="*/1?*?*?*?*"?--restart=OnFailure?--image=busybox?--?/bin/sh?-c?"date;?echo?Hello?from?the?Kubernetes?cluster"?
cronjob?"hello"?created

創(chuàng)建該 Cron Job 之后,通過如下命令獲取它的狀態(tài)信息:

$?kubectl?get?cronjob?hello?
NAME??????SCHEDULE??????SUSPEND???ACTIVE????LAST-SCHEDULE?
hello?????*/1?*?*?*?*???False?????0?????????<none>

如上所示,既沒有 active 的 Job,也沒有被調(diào)度的 Job。

等待并觀察創(chuàng)建的 Job,大約一分鐘時(shí)間:

$?kubectl?get?jobs?--watch?
NAME?????DESIRED???SUCCESSFUL???AGE?
hello-4111706356???1?????????1?????????2s

現(xiàn)在能看到一個(gè)名稱為 hello 的 Job 在運(yùn)行。我們可以停止觀察,并再次獲取該 Job 的狀態(tài)信息:


$?kubectl?get?cronjob?hello?
NAME??????SCHEDULE??????SUSPEND???ACTIVE????LAST-SCHEDULE?
hello?????*/1?*?*?*?*???False?????0??????Mon,?29?Aug?2016?14:34:00?-0700

應(yīng)該能夠看到名稱為 “hello” 的 Job 在 LAST-SCHEDULE 指定的時(shí)間點(diǎn)被調(diào)度了。當(dāng)前存在 0 個(gè)活躍(Active)的 Job,說明該 Job 已經(jīng)被調(diào)度運(yùn)行完成或失敗。

現(xiàn)在,找到最近一次被調(diào)度的 Job 創(chuàng)建的 Pod,能夠看到其中一個(gè) Pod 的標(biāo)準(zhǔn)輸出。注意,Job 名稱和 Pod 名稱是不一樣的。

#?Replace?"hello-4111706356"?with?the?job?name?in?your?system??
$??pods=$(kubectl?get?pods?--selector=job-name=hello-4111706356?--output=jsonpath={.items..metadata.name})?
$?echo?$pods?hello-4111706356-o9qcm?

$?kubectl?logs?pods?
Mon?Aug?29?21:34:09?UTC?2016?
Hello?from?the?Kubernetes?cluster

刪除 Cron Job

一旦不再需要 Cron Job,簡(jiǎn)單地可以使用 kubectl 命令刪除它:

$?kubectl?delete?cronjob?hello?
cronjob?"hello"?deleted

這將會(huì)終止正在創(chuàng)建的 Job。然而,運(yùn)行中的 Job 將不會(huì)被終止,不會(huì)刪除 Job 或 它們的 Pod。為了清理那些 Job 和 Pod,需要列出該 Cron Job 創(chuàng)建的全部 Job,然后刪除它們:

$?kubectl?get?jobs?
NAME???DESIRED???SUCCESSFUL???AGE?hello-1201907962???1?????????1????????????11m?
hello-1202039034???1?????????1????????????8m?...?


$?kubectl?delete?jobs?hello-1201907962?hello-1202039034?...?
job?"hello-1201907962"?deleted?
job?"hello-1202039034"?deleted

一旦 Job 被刪除,由 Job 創(chuàng)建的 Pod 也會(huì)被刪除。注意,所有由名稱為 “hello” 的 Cron Job 創(chuàng)建的 Job 會(huì)以前綴字符串 “hello-” 進(jìn)行命名。如果想要?jiǎng)h除當(dāng)前 Namespace 中的所有 Job,可以通過命令 kubectl delete jobs --all 立刻刪除它們。

Cron Job 限制

Cron Job 在每次調(diào)度運(yùn)行時(shí)間內(nèi) 大概 會(huì)創(chuàng)建一個(gè) Job 對(duì)象。我們之所以說 大概 ,是因?yàn)樵谔囟ǖ沫h(huán)境下可能會(huì)創(chuàng)建兩個(gè) Job,或者一個(gè) Job 都沒創(chuàng)建。我們嘗試少發(fā)生這種情況,但卻不能完全避免。因此,創(chuàng)建 Job 操作應(yīng)該是 _冪等的_。

Job 根據(jù)它所創(chuàng)建的 Pod 的并行度,負(fù)責(zé)重試創(chuàng)建 Pod,并就決定這一組 Pod 的成功或失敗。Cron Job 根本不會(huì)去檢查 Pod。

編寫 Cron Job 規(guī)約

和其它 Kubernetes 配置一樣,Cron Job 需要 apiVersion、 kind、和 metadata 這三個(gè)字段。 關(guān)于如何實(shí)現(xiàn)一個(gè)配置文件的更新信息,參考文檔 部署應(yīng)用、 配置容器 和 使用 kubectl 管理資源。

Cron Job 也需要 .spec 段。

注意: 對(duì)一個(gè) Cron Job 的所有修改,尤其是對(duì)其 .spec 的修改,僅會(huì)在下一次運(yùn)行的時(shí)候生效。

調(diào)度

.spec.schedule.spec 中必需的字段,它的值是 Cron 格式字的符串,例如:0 * * * *,或者 @hourly,根據(jù)指定的調(diào)度時(shí)間 Job 會(huì)被創(chuàng)建和執(zhí)行。

Job 模板

.spec.jobTemplate 是另一個(gè) .spec 中必需的字段。它是 Job 的模板。 除了它可以是嵌套的,并且不具有 apiVersionkind 字段之外,它和 Job 一樣具有完全相同的模式(schema)。 參考 編寫 Job 規(guī)格。

啟動(dòng) Job 的期限(秒級(jí)別)

.spec.startingDeadlineSeconds 字段是可選的。它表示啟動(dòng) Job 的期限(秒級(jí)別),如果因?yàn)槿魏卧蚨e(cuò)過了被調(diào)度的時(shí)間,那么錯(cuò)過執(zhí)行時(shí)間的 Job 將被認(rèn)為是失敗的。如果沒有指定,則沒有期限。

并發(fā)策略

.spec.concurrencyPolicy 字段也是可選的。它指定了如何處理被 Cron Job 創(chuàng)建的 Job 的并發(fā)執(zhí)行。只允許指定下面策略中的一種:

  • Allow(默認(rèn)):允許并發(fā)運(yùn)行 Job

  • Forbid:禁止并發(fā)運(yùn)行,如果前一個(gè)還沒有完成,則直接跳過下一個(gè)

  • Replace:取消當(dāng)前正在運(yùn)行的 Job,用一個(gè)新的來替換

注意,當(dāng)前策略只能應(yīng)用于同一個(gè) Cron Job 創(chuàng)建的 Job。如果存在多個(gè) Cron Job,它們創(chuàng)建的 Job 之間總是允許并發(fā)運(yùn)行。

掛起

.spec.suspend 字段也是可選的。如果設(shè)置為 true,后續(xù)所有執(zhí)行都將被掛起。它對(duì)已經(jīng)開始執(zhí)行的 Job 不起作用。默認(rèn)值為 false。

Job 歷史限制

.spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit 這兩個(gè)字段是可選的。它們指定了可以保留完成和失敗 Job 數(shù)量的限制。

默認(rèn)沒有限制,所有成功和失敗的 Job 都會(huì)被保留。然而,當(dāng)運(yùn)行一個(gè) Cron Job 時(shí),很快就會(huì)堆積很多 Job,推薦設(shè)置這兩個(gè)字段的值。設(shè)置限制值為 0,相關(guān)類型的 Job 完成后將不會(huì)被保留。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI