依排程執行服務指令
從現有服務建立排程工作,指定時區與重疊策略,並查看每次執行的結果。
開啟服務的 設定 → 排程工作,按 新增排程工作,填入指令、cron 排程與時區,再 檢查變更。每次執行會啟動新的容器,原服務繼續運作。
- 專案內已有持續執行的服務,例如 Deployment。排程工作從它複製容器設定,所以不能從 Job 或 CronJob 建立。
- 有修改服務及建立 CronJob 的權限。要手動執行,也需要建立 Job 的權限。
- 來源映像檔有
/bin/sh,而且包含要執行的程式。任務的指令透過/bin/sh -c執行。
建立排程工作
Section titled “建立排程工作”選擇指令與來源容器
Section titled “選擇指令與來源容器”開啟應用程式服務,進入 設定 → 排程工作,按 新增排程工作。
在 指令 填入映像檔內可執行的指令,例如應用程式已有的 npm run cleanup。工作目錄沿用來源容器的設定。指令要使用的程式與檔案都要存在於映像檔或掛載的磁碟區。
服務有多個一般容器時,在 要複製的容器 選擇包含指令的容器。每個排程工作只複製其中一個,來源服務的其他容器不會一起啟動。
填入 cron 與時區
Section titled “填入 cron 與時區”在 排程 填入五個欄位,依序為「分、時、日、月、星期」。例如:
| 排程 | 指定時區中的執行時間 |
|---|---|
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 顯示這種排程。
選擇重疊與保留方式
Section titled “選擇重疊與保留方式”確認 名稱:最多 52 個字元,使用小寫字母、數字與連字號,開頭和結尾須為字母或數字。
在 上一次還在執行時 選擇:
| 選項 | 到達下一個排程時間時的處理 |
|---|---|
| 略過這次 | 上一次尚未結束時,不啟動這次排程,預設選項。 |
| 兩次同時執行 | 允許多次工作同時執行。 |
| 停止上一次,改跑這次 | 停止尚未完成的工作,改啟動新工作。 |
設定 保留的成功紀錄 與 保留的失敗紀錄,範圍為 0 到 100。預設保留成功 3 次、失敗 1 次。保留 0 次時,完成後的工作紀錄也會清除。
按 檢查變更,核對來源服務、容器、映像檔、指令、排程、時區與重疊策略,再套用。原服務不會因為建立排程工作而重新啟動。
工作建立後,可從來源服務 排程工作 的清單開啟,或從專案服務清單找到它。
立即執行並查看結果
Section titled “立即執行並查看結果”開啟排程工作的 概覽,在 執行紀錄 按 立即執行,檢查變更後套用。這會新增一次 Job,排程時間保持原樣。手動執行的紀錄會標示 手動執行。
立即執行 也照 上一次還在執行時 的設定處理:
- 略過這次:上一次還在執行時,按鈕無法使用,游標停在上面會說明原因。
- 停止上一次,改跑這次:檢查畫面會列出哪幾次執行會先停止。
- 兩次同時執行:直接再建立一個 Job。
在 執行紀錄 等待 成功 或 失敗。有讀取日誌權限且該次 Pod 仍存在時,按該列 日誌 查看輸出。再到應用程式確認結果,例如報表是否產生。
來源服務更新後,排程工作用哪個版本
Section titled “來源服務更新後,排程工作用哪個版本”建立時會複製來源容器的映像檔、環境變數設定、工作目錄、資源、安全性與磁碟區掛載,也保留執行身分、映像檔下載機密與節點放置設定。連接埠與健康檢查不會帶入。
之後來源服務換映像檔,排程工作仍用建立時複製的映像檔。要一起更新工作,開啟排程工作的 設定,切換 YAML,按 編輯,更新 spec.jobTemplate.spec.template.spec.containers 中相應容器的 image,再 檢查變更。
環境變數的明文值也是建立時的副本。指向機密或設定檔的參照則沿用原本物件,每次啟動新容器時讀取當時的值。修改共用物件時,要把排程工作也算進影響範圍。
修改或暫停排程
Section titled “修改或暫停排程”開啟排程工作的 設定 → 排程,修改 排程、時區、指令、上一次還在執行時、保留的成功紀錄 或 保留的失敗紀錄,再按 檢查變更 後套用。新設定從下一次執行開始生效,正在執行的那次會繼續。從 新增排程工作 建立的工作才有 指令 欄位。
要暫停自動排程,在 概覽 的 執行紀錄 旁按 暫停,檢查後套用。暫停後 立即執行 仍可使用。要恢復,按同一位置的 恢復。
排程工作建立後,執行紀錄 會列出每次執行,標示 成功 或 失敗。用 kubectl 查看:
kubectl -n shop get cronjob nightly-reportkubectl -n shop get jobs -l app.kubernetes.io/name=nightly-reportkubectl -n shop logs job/<Job 名稱>CronJob 的 SCHEDULE 和 TIMEZONE 是你填的值,SUSPEND 在暫停時是 True,LAST SCHEDULE 是上次執行距今多久。每次執行是一個 Job,STATUS 是 Complete 表示成功,Failed 表示失敗。手動執行的 Job 名稱是 <排程工作名稱>-manual-<時間>。
用 kubectl 做同樣的事
Section titled “用 kubectl 做同樣的事”排程工作就是一個 CronJob。下面的 YAML 等於從服務 web 建立 nightly-report,每天台灣時間 03:00 執行 npm run report:
apiVersion: batch/v1kind: CronJobmetadata: name: nightly-report labels: app.kubernetes.io/name: nightly-report zeabur.com/task-of: webspec: 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 的日誌。 |
刪除排程工作
Section titled “刪除排程工作”在排程工作右上角 更多 → 刪除服務,檢查刪除清單後套用。CronJob 刪除後,它擁有的執行紀錄與 Pod 也會一起清除,來源服務仍保留。
只想停止自動執行,按 暫停 就好,不必刪除。