K8S實(shí)戰(zhàn)(八)| Job 和 CronJob

前言

容器分為兩類

  1. 在線業(yè)務(wù) - 服務(wù)類容器

     需要持續(xù)不中斷的提供服務(wù),容器需要一直運(yùn)行
    
  2. 離線業(yè)務(wù) - 工作類容器

     一般執(zhí)行一次性任務(wù),比如統(tǒng)計(jì)日志數(shù)據(jù)等,運(yùn)行完成后容器即可關(guān)閉
    

更新歷史

Job

cat job.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: job-test
spec:
  template:
    metadata:
      name: job-test
    spec:
      containers:
      - name: test-job
        image: busybox
        command: ["echo", "test job!"]
      restartPolicy: Never

參數(shù)
restartPolicy 只能是 Never 或者 onFailure

啟動(dòng)

[root@master01 ~]# kubectl apply -f job.yaml 
job.batch/job-test created

運(yùn)行狀態(tài)

[root@master01 ~]# kubectl get pod
NAME             READY   STATUS              RESTARTS   AGE
job-test-t2gbw   0/1     ContainerCreating   0          12s

[root@master01 ~]# kubectl get pod
NAME             READY   STATUS      RESTARTS   AGE
job-test-t2gbw   0/1     Completed   0          24s

查看運(yùn)行結(jié)果

[root@master01 ~]# kubectl logs job-test-t2gbw
test job!

Job 執(zhí)行失敗如何處理

將 command 胡亂設(shè)置導(dǎo)致 job 無(wú)法成功啟動(dòng)

    command: ["echo123", "test job!"]
  restartPolicy: Never   

當(dāng) restartPolicy: Never 時(shí),可以看到 k8s 在不斷的開(kāi)新的 pod
但不會(huì)讓它一直開(kāi)下去,默認(rèn)參數(shù) spec.backoffLimit: 6 會(huì)進(jìn)行阻止

[root@master01 ~]# kubectl get pod
NAME             READY   STATUS               RESTARTS   AGE
job-test-2zrt4   0/1     ContainerCannotRun   0          87s
job-test-5z884   0/1     ContainerCannotRun   0          77s
job-test-cxgmm   0/1     ContainerCannotRun   0          107s
job-test-nt9gt   0/1     ContainerCannotRun   0          57s
job-test-wxv7l   0/1     ContainerCreating    0          17s

當(dāng) restartPolicy: OnFailure 時(shí),k8s 不開(kāi)新 pod,只會(huì)不斷重啟 pod

[root@master01 ~]# kubectl get pod
NAME             READY   STATUS             RESTARTS   AGE
job-test-bd695   0/1     CrashLoopBackOff   4          3m15s

如果 job 沒(méi)有報(bào)錯(cuò),但是它一直不結(jié)束怎么辦?

參數(shù) spec.activeDeadlineSeconds: 100 會(huì)在 100s 后將 Job 中所有 Pod 進(jìn)行關(guān)閉
此時(shí) Pod 關(guān)閉狀態(tài)為 reason: DeadlineExceeded

并行 Job

cat job.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: job-test
spec:
  parallelism: 2
  ......

參數(shù)
parallelism: 2 僅允許最多兩個(gè) Pod 同時(shí)運(yùn)行

查看運(yùn)行情況

[root@master01 ~]# kubectl get pod
NAME             READY   STATUS              RESTARTS   AGE
job-test-6ttz9   0/1     ContainerCreating   0          8s
job-test-mknjc   0/1     ContainerCreating   0          8s

[root@master01 ~]# kubectl get pod
NAME             READY   STATUS      RESTARTS   AGE
job-test-6ttz9   0/1     Completed   0          68s
job-test-mknjc   0/1     Completed   0          68s

[root@master01 ~]# kubectl get job
NAME       COMPLETIONS   DURATION   AGE
job-test   0/1 of 2      10s        10s
[root@master01 ~]# kubectl get job
NAME       COMPLETIONS   DURATION   AGE
job-test   2/1 of 2      19s        66s

增加參數(shù) completions

apiVersion: batch/v1
kind: Job
metadata:
  name: job-test
spec:
  parallelism: 2
  completions: 8

參數(shù)
completions: 8 表示至少成功運(yùn)行 8 個(gè) pod
如果不是8個(gè)成功,那么會(huì)根據(jù) restartPolicy 的策略進(jìn)行處理
可以認(rèn)為是一種檢查機(jī)制

查看運(yùn)行情況

[root@master01 ~]# kubectl get pod
NAME             READY   STATUS              RESTARTS   AGE
job-test-6xwpt   0/1     ContainerCreating   0          8s
job-test-grk4q   0/1     ContainerCreating   0          8s
[root@master01 ~]# kubectl get job
NAME       COMPLETIONS   DURATION   AGE
job-test   0/8           11s        11s


[root@master01 ~]# kubectl get job
NAME       COMPLETIONS   DURATION   AGE
job-test   6/8           76s        76s

[root@master01 ~]# kubectl get pod
NAME             READY   STATUS      RESTARTS   AGE
job-test-2jxqx   0/1     Completed   0          28s
job-test-6xwpt   0/1     Completed   0          90s
job-test-gndq7   0/1     Completed   0          70s
job-test-grk4q   0/1     Completed   0          90s
job-test-n96k6   0/1     Completed   0          70s
job-test-np4n7   0/1     Completed   0          49s
job-test-scc9c   0/1     Completed   0          28s
job-test-zcnbp   0/1     Completed   0          49s

[root@master01 ~]# kubectl get job
NAME       COMPLETIONS   DURATION   AGE
job-test   8/8           82s        91s

CronJob

CronJob 會(huì)定時(shí) create 一個(gè) job 對(duì)象

cat cronjob.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command: ["echo","test cron job!"]
          restartPolicy: OnFailure

查看運(yùn)行結(jié)果

[root@master01 ~]# kubectl get cronjob
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        67s             3m45s

[root@master01 ~]# kubectl get jobs
NAME               COMPLETIONS   DURATION   AGE
hello-1595319480   1/1           27s        3m23s
hello-1595319540   1/1           19s        2m23s
hello-1595319600   1/1           24s        83s
hello-1595319660   0/1           22s        22s

[root@master01 ~]# kubectl get pod
NAME                     READY   STATUS              RESTARTS   AGE
hello-1595319480-2kl8h   0/1     Completed           0          3m21s
hello-1595319540-gwthv   0/1     Completed           0          2m21s
hello-1595319600-54548   0/1     Completed           0          81s
hello-1595319660-8xqn6   0/1     ContainerCreating   0          20s

可以看到,就是把前面說(shuō)過(guò)的 Job 對(duì)象進(jìn)行定時(shí)的運(yùn)行。

結(jié)束語(yǔ)

Job/CronJob 控制器可以進(jìn)行離線業(yè)務(wù)的處理,不需要長(zhǎng)期運(yùn)行一個(gè) Pod。

這類控制器管理的 Pod 不對(duì)外提供持續(xù)在線服務(wù),任務(wù)運(yùn)行完成后,即會(huì)將容器進(jìn)行關(guān)閉,可以用于一些定時(shí)數(shù)據(jù)處理類的工作。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容