跳转到内容
开源

依排程執行服務指令

從現有服務建立排程工作,指定時區與重疊策略,並查看每次執行的結果。

開啟服務的 設定 → 排程工作,按 新增排程工作,填入指令、cron 排程與時區,再 檢查變更。每次執行會啟動新的容器,原服務繼續運作。

  • 專案內已有持續執行的服務,例如 Deployment。排程工作從它複製容器設定,所以不能從 Job 或 CronJob 建立。
  • 有修改服務及建立 CronJob 的權限。要手動執行,也需要建立 Job 的權限。
  • 來源映像檔有 /bin/sh,而且包含要執行的程式。任務的指令透過 /bin/sh -c 執行。

開啟應用程式服務,進入 設定 → 排程工作,按 新增排程工作。

在 指令 填入映像檔內可執行的指令,例如應用程式已有的 npm run cleanup。工作目錄沿用來源容器的設定。指令要使用的程式與檔案都要存在於映像檔或掛載的磁碟區。

服務有多個一般容器時,在 要複製的容器 選擇包含指令的容器。每個排程工作只複製其中一個,來源服務的其他容器不會一起啟動。

在 排程 填入五個欄位,依序為「分、時、日、月、星期」。例如:

排程指定時區中的執行時間
0 3 * * *每天 03:00
*/15 * * * *每 15 分鐘
0 9 * * 1-5每週一到週五 09:00
0 3 * * 0每週日 03:00

時區 預填瀏覽器的時區,建立時寫進 CronJob 的 spec.timeZone。例如要在台灣時間每天凌晨 03:00 執行,填入 0 3 * * *,並確認 時區 是 Asia/Taipei。要使用 UTC 就填 Etc/UTC。

清空 時區 時,CronJob 不會設定 spec.timeZone,執行時間改依 kube-controller-manager 的時區,通常是 UTC,介面也按 UTC 顯示這種排程。

確認 名稱:最多 52 個字元,使用小寫字母、數字與連字號,開頭和結尾須為字母或數字。

在 上一次還在執行時 選擇:

選項到達下一個排程時間時的處理
略過這次上一次尚未結束時,不啟動這次排程,預設選項。
兩次同時執行允許多次工作同時執行。
停止上一次,改跑這次停止尚未完成的工作,改啟動新工作。

設定 保留的成功紀錄 與 保留的失敗紀錄,範圍為 0 到 100。預設保留成功 3 次、失敗 1 次。保留 0 次時,完成後的工作紀錄也會清除。

按 檢查變更,核對來源服務、容器、映像檔、指令、排程、時區與重疊策略,再套用。原服務不會因為建立排程工作而重新啟動。

工作建立後,可從來源服務 排程工作 的清單開啟,或從專案服務清單找到它。

開啟排程工作的 概覽,在 執行紀錄 按 立即執行,檢查變更後套用。這會新增一次 Job,排程時間保持原樣。手動執行的紀錄會標示 手動執行。

立即執行 也照 上一次還在執行時 的設定處理:

  • 略過這次:上一次還在執行時,按鈕無法使用,游標停在上面會說明原因。
  • 停止上一次,改跑這次:檢查畫面會列出哪幾次執行會先停止。
  • 兩次同時執行:直接再建立一個 Job。

在 執行紀錄 等待 成功 或 失敗。有讀取日誌權限且該次 Pod 仍存在時,按該列 日誌 查看輸出。再到應用程式確認結果,例如報表是否產生。

來源服務更新後,排程工作用哪個版本

Section titled “來源服務更新後,排程工作用哪個版本”

建立時會複製來源容器的映像檔、環境變數設定、工作目錄、資源、安全性與磁碟區掛載,也保留執行身分、映像檔下載機密與節點放置設定。連接埠與健康檢查不會帶入。

之後來源服務換映像檔,排程工作仍用建立時複製的映像檔。要一起更新工作,開啟排程工作的 設定,切換 YAML,按 編輯,更新 spec.jobTemplate.spec.template.spec.containers 中相應容器的 image,再 檢查變更。

環境變數的明文值也是建立時的副本。指向機密或設定檔的參照則沿用原本物件,每次啟動新容器時讀取當時的值。修改共用物件時,要把排程工作也算進影響範圍。

開啟排程工作的 設定 → 排程,修改 排程、時區、指令、上一次還在執行時、保留的成功紀錄 或 保留的失敗紀錄,再按 檢查變更 後套用。新設定從下一次執行開始生效,正在執行的那次會繼續。從 新增排程工作 建立的工作才有 指令 欄位。

要暫停自動排程,在 概覽 的 執行紀錄 旁按 暫停,檢查後套用。暫停後 立即執行 仍可使用。要恢復,按同一位置的 恢復。

排程工作建立後,執行紀錄 會列出每次執行,標示 成功 或 失敗。用 kubectl 查看:

kubectl -n shop get cronjob nightly-report
kubectl -n shop get jobs -l app.kubernetes.io/name=nightly-report
kubectl -n shop logs job/<Job 名稱>

CronJob 的 SCHEDULE 和 TIMEZONE 是你填的值,SUSPEND 在暫停時是 True,LAST SCHEDULE 是上次執行距今多久。每次執行是一個 Job,STATUS 是 Complete 表示成功,Failed 表示失敗。手動執行的 Job 名稱是 <排程工作名稱>-manual-<時間>。

排程工作就是一個 CronJob。下面的 YAML 等於從服務 web 建立 nightly-report,每天台灣時間 03:00 執行 npm run report:

apiVersion: batch/v1
kind: CronJob
metadata:
name: nightly-report
labels:
app.kubernetes.io/name: nightly-report
zeabur.com/task-of: web
spec:
schedule: "0 3 * * *"
timeZone: Asia/Taipei
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
metadata:
labels:
app.kubernetes.io/name: nightly-report
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
restartPolicy: Never
containers:
- name: web
image: ghcr.io/acme/web:1.4
command: ["/bin/sh", "-c", "npm run report"]
envFrom:
- secretRef:
name: web-env
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
memory: 256Mi
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: [ALL]
  • 標籤 zeabur.com/task-of 是來源服務的名稱,介面靠它把工作列在來源服務的 排程工作 裡。來源服務有 zeabur.com/group 標籤時,也會一起複製。
  • 容器的 image、env、envFrom、workingDir、imagePullPolicy、resources、securityContext、volumeMounts 從來源容器複製,Pod 的 serviceAccountName、securityContext、imagePullSecrets、nodeSelector、affinity、tolerations 從來源 Pod 複製。有掛載磁碟區時,也複製用到的 volumes。
  • 指令一律寫成 ["/bin/sh", "-c", "<指令>"]。
  • concurrencyPolicy 的 Forbid、Allow、Replace 依序是 略過這次、兩次同時執行、停止上一次,改跑這次。

其他動作:

介面動作kubectl
立即執行kubectl -n shop create job --from=cronjob/nightly-report nightly-report-manual-$(date +%s)
暫停kubectl -n shop patch cronjob nightly-report -p '{"spec":{"suspend":true}}'
恢復kubectl -n shop patch cronjob nightly-report -p '{"spec":{"suspend":false}}'
刪除kubectl -n shop delete cronjob nightly-report

Zeabur 的 立即執行 和 kubectl create job --from 一樣,Job 帶 annotation cronjob.kubernetes.io/instantiate: manual,擁有者是 CronJob。

情況處理方式
找不到 排程工作從持續執行的服務 設定 開啟。Job 與 CronJob 不提供建立另一個排程工作的區段。
建立時拒絕 cron 或時區檢查五個欄位的格式與時區名稱,依叢集回傳的欄位原因修正。
顯示找不到 /bin/sh 或指令改用有 shell 與所需程式的映像檔,並確認指令路徑、工作目錄與使用者權限。
建立時提示每個 Pod 各有磁碟區來源使用的磁碟區來自 StatefulSet 的磁碟區範本,無法直接複製成工作掛載,先安排排程工作可使用的儲存方式。
工作一直等待啟動檢查 部署紀錄 的事件、可用資源與磁碟區掛載,確認沒有來源服務占用造成的限制。
預期時間沒有執行到 設定 → 排程 檢查排程與時區,確認執行紀錄旁沒有顯示 已暫停,以及上一次工作是否仍在執行。
看不到舊的日誌檢查成功與失敗紀錄的保留數量。完成的 Job 與 Pod 清除後,頁面無法再讀取該 Pod 的日誌。

在排程工作右上角 更多 → 刪除服務,檢查刪除清單後套用。CronJob 刪除後,它擁有的執行紀錄與 Pod 也會一起清除,來源服務仍保留。

只想停止自動執行,按 暫停 就好,不必刪除。