Kubernetes Job 簡介
我們知道 kubernetes 的 deployment 可以生成並管理 Pod ,且盡量維持其狀態為 Running 。但有的時候我們會有只運行一次性任務的需求,這時候就可以使用 kubernetes Job。 Kubernetes Job 主要是針對短時和批量的 workload ,用於處理一次性工作,會創建一個或多個 Pod,並在該工作完成後終止這些 Pod,而不是像 deployment、DaemonSets 那樣持續運行。
Job 及 CronJob 是一組的概念 :
- Job 會保證在它所定義的 Pod 運行一次性任務
- CronJob 有排程的概念,我們可以透過 CronJob 把 Job 中所定義的工作放到排程中
Job 簡介
當 Job 完成時,Kubernetes 會將其狀態更新為 :
若正常運行結束後不會重啟,而會將 Pod 狀態改成 Completed。
若失敗並且已達到指定的重啟配置次數,則 Job 的狀態為 Failed
Kubernetes Job 很適合用於需要處理一次性或排程的情況。 例如 :
- 批次處理
- db data import
以實現更高的可用性和可靠性。
Job YAML 簡單範例
Job YAML 的 .spec 中只有 .spec.template 是必需的。.spec.template 的值是一個 Pod 模板。其定義規範與 Pod 完全相同。以下是一個 Kubernetes Job 的簡單範例 YAML 文件。
apiVersion: batch/v1
kind: Job
metadata:
name: my-job
spec:
template:
spec:
containers:
- name: my-container
image: busybox
command: ['sh','-c','echo Hello']
restartPolicy: Never
其實可以把 Kubernetes Job 看成一個特殊的 deployment, 寫法上並沒有差太多。Job 最終的追求目的是為了結束而運行的,跟 Deployment 追求的是持續運行有著很大的不同。
Job workflow
Kubernetes 中,並沒有自然的支持 Job workflow,會需要其他 CICD 工具輔助。Job 的默認是 parallel 執行 Job ,會同時啟動多個 Pod 來處理 Job 。
如果有按順序執行的任務的需求,有一個不是很正規技巧實現,是使用 Init Containers 來實現任務的順序執行。以下範例:
apiVersion: batch/v1
kind: Job
metadata:
name: sequential-job
spec:
template:
spec:
initContainers:
- name: task-1
image: busybox
command: ['sh', '-c', 'echo job-1']
- name: task-2
image: busybox
command: ['sh', '-c', 'echo job-2']
containers:
- name: job-done
image: busybox
command: ['sh', '-c', 'echo "job-1 and job-2 completed"']
Init Containers 會依次執行,如果某個步驟 Init Container 失敗,整個 Job 就會被終止並且顯示失敗。
使用 Init Containers來實現任務順序執行,我覺得有點不太正規的…