Kubernetes 那些事 — CronJob

Andy Chen
Andy的技術分享blog
5 min readMar 10, 2020

--

前言

今天要介紹的內容不一定適用於每位讀者,不一定每位讀者都會用到這個功能,但因為 K8s 也有提供這種功能所以就想說介紹給讀者了,今天要介紹的是 K8s 的排程工具:CronJob

什麼是 CronJob?

看到 Cron 應該就知道這個跟時間任務管理有關,而 Job 是任務,所以 CronJob 就是在規定時間要執行的任務,也就是大家俗稱的排程。

還記得筆者在介紹 K8s 的時候一直強調一句話:Pod 是 K8s 中用來執行的最小單位,CronJob 在 K8s 中也是要運行的,所以可想而知 CronJob 一定也會產生相對應的 Pod,所以一樣也會吃到機器的資源,所以讀者在設定 CronJob 的時候也要小心不要一次創立太多 Job 進而導致資源不足。

Cron 格式

在開始介紹 CronJob 的寫法之前筆者想介紹一下 Cron 格式,K8s 的 CronJob 寫法必須要遵從 Cron 格式,這樣才能在正確的時間點執行任務,而 Cron 格式也很簡單,整體寫法長得像這樣: * * * * *

這邊筆者一一解釋每個 * 代表的內容。

  1. 第一個星號代表的是分鐘(0 ~ 59)
  2. 第二個星號代表的是小時(0 ~ 23)
  3. 第三個星號代表的是日(1 ~ 31)
  4. 第四個星號代表的是月(1 ~ 12)
  5. 第五個星號代表的是星期(0 ~ 7),其中星期日可用 0 或 7 表示,畢竟有些人覺得星期日是一週的第一天但有些人覺得星期日是一週的最後一天XD

假如今天每 3 小時要做一次任務,一般來說寫法會長這樣: * 0, 3, 6, 9, 12, 15, 18, 21, 24 * * * ,這樣真的太累了,所以可以直接在小時的星號那邊加個 /3 就代表每 3 小時要做一次任務,寫法會像這樣: * */3 * * *

CronJob 寫法

接下來就用一個簡單的例子示範 CronJob 的寫法。

apiVersion: batch/v1beta1 
kind: CronJob
metadata:
name: helloworld
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: helloworld
image: debian
command: ["echo", "helloworld"]
restartPolicy: OnFailure

一樣先從 spec 開始看 CronJob 的內部詳細任務。

  • schedule

代表這個任務要在哪些時間點開始動作,這邊要寫上符合 Cron 格式的時間,以筆者的範例來解釋就是每分鐘都要執行一次。

  • jobTemplate

代表要做的任務是什麼,裡面的描述就會跟 Pod 的描述檔一樣,畢竟想在 K8s 中執行就必須要建立一個 Pod 出來。

接下來就是描述 Pod 的運行內容了,相信從 Replication Controller 的文章看到現在的讀者應該對底下的 template都不陌生,這邊的 template就是為了描述 Pod ,而筆者為了方便示範所以就讓 Pod 內的 container 運行 Debian 這個作業系統,並在裡面印出 helloworld。

CronJob 建立

建立方法一樣用 apply 的參數建立。

建立完一樣可以用 get 的參數查看建立好的 CronJob,還記得筆者上面說的嗎?由於這些任務都要在 K8s 中運行,所以每個任務都會是一個 Pod,這邊一樣可以用 get 的參數查看 Pod 的建立狀況。

想知道目前 CronJob 有多少個任務可以用 get jobs 的方式查看,筆者後面加個 --watch 是為了監測是否有在規定的時間點建立一個新的任務。

最後想知道這些任務到底做了什麼可以用 log 這個參數。

最後想一次刪掉全部的任務就把 CronJob 刪除即可。

小結

今天介紹了 CronJob,雖然市面上有非常多可以進行排程的套件,像 celery 等等,不過假如只是簡單的排程應用的話,讀者不妨可以考慮用看看 K8s 的 CronJob,也方便管理每個任務的狀態。

--

--

Andy Chen
Andy的技術分享blog

嗨嗨我是Andy,用嘴巴工作的工程師😂,喜歡學習不同領域的內容,專長為網頁開發,歡迎大家跟我聊技術~