溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Kubernetes之Job與CronJob

發(fā)布時(shí)間:2020-08-07 04:49:02 來源:網(wǎng)絡(luò) 閱讀:374 作者:筱振 欄目:云計(jì)算

一、Job

(1)Job概述

Job負(fù)責(zé)處理短暫的一次性任務(wù),即僅執(zhí)行一次的任務(wù),它保證批處理任務(wù)的一個(gè)或多個(gè)pod成功結(jié)束。

Kubernetes支持以下幾種Job:

  • 非并行Job:通常創(chuàng)建一個(gè)Pod直到其成功結(jié)束;
  • 固定結(jié)束次數(shù)的Job:在spec字段下添加completions字段。創(chuàng)建多個(gè)Pod,直到滿足completions規(guī)定的數(shù)值。如果不添加的話,默認(rèn)情況下是1個(gè);
  • 帶有工作隊(duì)列的并行Job:在spec字段下添加Parallelism字段。表示幾個(gè)job同時(shí)并行工作。如果不添加的話,默認(rèn)情況下是1個(gè);

根據(jù)可以設(shè)置completions字段、Parallelism字段,可以將Job分為以下幾種:
Kubernetes之Job與CronJob

(2)Job Controller

Job Controller負(fù)責(zé)根據(jù)Job yaml文件中Spec字段定義的內(nèi)容創(chuàng)建Pod,并持續(xù)監(jiān)控Job的狀態(tài),直至其成功結(jié)束。如果失敗,則根據(jù)restartPolicy(只支持OnFailure和Never,不支持Always)決定是否創(chuàng)建新的pod再次重試任務(wù)。

如圖:
Kubernetes之Job與CronJob

(3)應(yīng)用示例

一個(gè)簡單的小示例:

[root@master job]# cat job.yaml 
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo","hello k8s job"]
      restartPolicy: Never
[root@master job]# kubectl apply -f job.yaml            //生成Job資源
[root@master job]# kubectl get job                        //查看Job
NAME       COMPLETIONS   DURATION   AGE
test-job   1/1           2s         5s
[root@master job]# kubectl get pod -o wide      //查看Job運(yùn)行的詳細(xì)信息
NAME             READY   STATUS      RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
test-job-rq9ws   0/1     Completed   0          25s   10.244.1.15   node01   <none>           <none>
[root@master job]# kubectl logs test-job-rq9ws             //查看通過Job生成的Pod的日志信息
hello k8s job
[root@master job]# kubectl delete jobs test-job        
//刪除Job,那么對(duì)應(yīng)的pod也會(huì)被刪除!

(4)提高Job的執(zhí)行效率

一個(gè)簡單的小示例:

[root@master job]# cat job.yaml 
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  parallelism: 2
  completions: 10
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo","hello k8s job"]
      restartPolicy: Never
[root@master job]# kubectl apply -f job.yaml 
[root@master job]# kubectl get job
NAME       COMPLETIONS   DURATION   AGE
test-job   10/10         7s         15s
//可以看出是運(yùn)行了10個(gè)任務(wù)

查看Job運(yùn)行的詳細(xì)信息,如圖:
Kubernetes之Job與CronJob
由這個(gè)示例可以查看:

  • parallelism:表示同時(shí)運(yùn)行多少個(gè)Pod執(zhí)行任務(wù);
  • completions:表示總共需要完成的pod的數(shù)量;

一個(gè)簡單的小示例:

[root@master job]# cat job.yaml 
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  backoffLimit: 5
  activeDeadlineSeconds: 100
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echddddddo","hello k8s job"]
      restartPolicy: Never
[root@master job]# kubectl apply -f job.yaml 
[root@master job]# kubectl get job
NAME       COMPLETIONS   DURATION   AGE
test-job   0/1           2m28s      2m28s
[root@master job]# kubectl get pod 
NAME             READY   STATUS               RESTARTS   AGE
test-job-4lzsc   0/1     ContainerCannotRun   0          111s
test-job-8q659   0/1     ContainerCannotRun   0          2m42s
test-job-hjjbx   0/1     ContainerCannotRun   0          2m41s
test-job-qcf4z   0/1     ContainerCannotRun   0          2m31s

由這個(gè)示例可以看出:

  • backoffLimit:表示出現(xiàn)錯(cuò)誤重試次數(shù);
  • activeDeadlineSeconds:表示Job在集群中存活的時(shí)間;

關(guān)于Job就簡單介紹這么多了!

二、CronJob

CronJob即定時(shí)任務(wù),類似于Linux系統(tǒng)中的crontab,在指定的時(shí)間周期運(yùn)行指定的任務(wù)。

CronJob yaml文件中的spec字段下的schedule是用來定義的時(shí)間間隔的,其用法與crontab一樣(分、時(shí)、日、月、周);jobTemplate字段指定需要運(yùn)行的任務(wù);

在kubernetes 1.15中,使用CronJob需要使用API的batch/v2alpha1這個(gè)版本,但是,kubernetes本身并沒有這個(gè)版本,如下:

[root@master job]# kubectl api-versions | grep batch/v2alpha1

需要進(jìn)行以下操作使Kubernetes群集支持這個(gè)batch/v2alpha1版本,操作如下:

[root@master ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
在spec字段的command字段下添加以下內(nèi)容:
    - --runtime-config=batch/v2alpha1=true
[root@master ~]# systemctl restart kubelet.service
//重啟kubelet服務(wù)
[root@master ~]# kubectl api-versions | grep batch/v2alpha1
batch/v2alpha1

為了防止內(nèi)容添加發(fā)生錯(cuò)誤,附上圖片一張:
Kubernetes之Job與CronJob

(1)應(yīng)用示例

[root@master job]# cat cronjob.yaml 
kind: CronJob
apiVersion: batch/v2alpha1
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command: ["echo","hello cronjob"]
          restartPolicy: Never
[root@master job]# kubectl apply -f cronjob.yaml

查看效果:
Kubernetes之Job與CronJob

這樣測試是沒有問題的,但是如果指定計(jì)劃任務(wù)時(shí),就會(huì)發(fā)現(xiàn)它不會(huì)像預(yù)期的效果一樣!
如下:

[root@master job]# cat cronjob.yaml 
kind: CronJob
apiVersion: batch/v2alpha1
metadata:
  name: hello
spec:
  schedule: "18 16 15 1 3"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command: ["echo","hello cronjob"]
          restartPolicy: Never
[root@master job]# date
2020年 01月 15日 星期三 16:18:48 CST
[root@master job]# kubectl get pod
No resources found.

這個(gè)算是k8s的一個(gè)小問題吧,官方已經(jīng)在緊急修復(fù)這個(gè)問題,相信在以后的新版本,這個(gè)問題是可以解決的吧!

注意,此時(shí)仍然不能正常運(yùn)行指定時(shí)間的job,這時(shí)因?yàn)閗8s官方在cronjob這個(gè)資源對(duì)象的支持中還沒有完善此功能。還待開發(fā)。

CronJob跟Job資源一樣,同樣支持并發(fā)Job參數(shù):parallelism,也支持完成Pod的總數(shù)參數(shù):completions!

關(guān)于CronJob就先簡單介紹這么多!

——————————本文到此結(jié)束,感謝閱讀——————————

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI