说明

  • 官方介绍
    jobs

  • 运行一次性容器
    容器按照持续运行的时间可分为两类:

    • 服务类容器
      服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等。
    • 工作类容器
      工作类容器则是一次性任务,比如批处理程序,完成后容器就退出。
      • Kubernetes 的 Deployment、ReplicaSet 和 DaemonSet 都用于管理服务类容器;
      • 对于工作类容器,我们用 Job。
  • RestartPolicy:
    job pod的template的RestartPolicy只能指定Never或OnFailure,当job未完成的情况下:

    • 如果RestartPolicy指定Never,则job会在pod出现故障时创建新的pod,且故障pod不会消失。.status.failed加1。
    • 如果RestartPolicy指定OnFailure,则job会在pod出现故障时其内部重启容器,而不是创建pod。.status.failed不变。
  • 任务主要包含两种:

    • Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。
    • job3是基于调度的Job执行将会自动产生多个job,调度格式参考Linux的cron系统。

环境准备

  • 首先需要有一套集群
[root@master ~]# kubectl get nodes
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   58d   v1.21.0
node1    Ready    <none>   58d   v1.21.0
node2    Ready    <none>   58d   v1.21.0
[root@master ~]# 
  • 然后我们创建一个文件用来放后面的测试文件,创建一个命名空间,后面测试都在这个命名空间做
[root@master ~]# mkdir job
[root@master ~]# cd job/
[root@master job]# kubectl create ns job
namespace/job created
[root@master job]# kubens job
Context "context" modified.
Active namespace is "job".
[root@master job]# 
[root@master job]# kubectl get pods
No resources found in job namespace.
[root@master job]#

job

介绍

  • Job,我们在日常的工作中经常都会遇到一些需要进行批量数据处理和分析的需求,当然也会有按时间来进行调度的工作,在Kubernetes集群中为我们提供了Job和job3两种资源对象来应对这种需求。

  • Job负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。而job3则就是在Job上加上了时间调度。

常用命令

唉 懒得单独列了 直接看下面使用的吧 该用的都用到了 都是kubectl的语法规则 只是换成了job而已。

创建job的yaml文件

  • kubectl create job --help是可以查看帮助的,创建的命令也可以在这里获取到
  • 现在获取一个job1的配置文件
    我们在最后面跟上了一个command,如果不需要,需要将 -- sh -c "date ; sleep 10"全删掉哦
[root@master job]# kubectl create job job1 --image=busybox --dry-run=client -o yaml -- sh -c "date ; sleep 10" > job1.yaml
[root@master job]# ls
job1.yaml
[root@master job]# 

# 增加一行镜像获取规则
[root@master job]# cat job1.yaml
apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: job1
spec:
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - command:
        - sh
        - -c
        - date ; sleep 10
        image: busybox #node节点上得有这个镜像啊
        imagePullPolicy: IfNotPresent
        name: job1
        resources: {}
      #RestartPolicy仅支持Never和OnFailure两种,不支持Always
      restartPolicy: Never
status: {}
[root@master job]#
  • 注意Job的RestartPolicy仅支持Never和OnFailure两种,不支持Always, Job就相当于来执行一个批处理任务,执行完就结束了,如果支持Always的话会陷入了死循环了。
    • Nerver 只要任务没有完成,就会删除pod并新创建pod运行,直到job完成【会产生多个pod】
    • OnFailure 只要pod没有完成,则会重启pod,直到job完成

创建job并常规测试

说明注意看下面

# 创建
[root@master job]# kubectl apply -f job1.yaml
job.batch/job1 created
[root@master job]# 

# 羡慕CompLETIONS是0/1,是因为job还没创建,
#需要等待seelp 10 以后,就是10 秒以后才会创建
[root@master job]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
job1   0/1           5s         5s
[root@master job]# 
[root@master job]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
job1   0/1           11s        11s
[root@master job]# 

# 10秒以后创建了,状态也成0/0了
[root@master job]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
job1   1/1           13s        22s

# 创建成功以后pod状态也就成 completed了【10秒以前状态是Running】,不会再创建了
# 也就是说该pod也就是失效了 可以删除了
[root@master job]# kubectl get pods
NAME         READY   STATUS      RESTARTS   AGE
job1-rll96   0/1     Completed   0          28s
[root@master job]# 
[root@master job]# kubectl delete pod job1-rll96 
pod "job1-rll96" deleted
[root@master job]# 

增加job任务次数测试

主要有3个参数

  • spec:【下面参数是放在spec下面的】

    • backoffLimit: 4
      如果job失败,则重试几次
    • completions: 6
      job结束需要成功运行的Pod个数,即状态为Completed的pod数【也就是job任务总次数】
    • parallelism: 2
      一次性运行N个pod,这个值不会超过completions的值。
  • 现在我们将上面参数加到yaml文件并测试

[root@master job]# cat job2.yaml
apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: job2
spec:
  backoffLimit: 4
  completions: 6
  parallelism: 2
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - command:
        - sh
        - -c
        - date ; sleep 10
        image: busybox
        imagePullPolicy: IfNotPresent
        name: job2
        resources: {}
      restartPolicy: Never
status: {}
[root@master job]# 

# 创建job2,可以看到job2一共有6个任务
[root@master job]# kubectl apply -f job2.yaml
job.batch/job2 created
[root@master job]# 
[root@master job]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
job1   1/1           13s        15m
job2   0/6           5s         5s
[root@master job]# 

# job一次创建2个,可以看到pod确实有2个生成
[root@master job]# kubectl get pods
NAME         READY   STATUS    RESTARTS   AGE
job2-7rp99   1/1     Running   0          11s
job2-xkjd4   1/1     Running   0          11s
[root@master job]# 

# 因为一次执行2个,所以2个执行完呢状态就会为completed了,又会重新生成2个新pod执行
[root@master job]# kubectl get pods
NAME         READY   STATUS      RESTARTS   AGE
job2-7rp99   0/1     Completed   0          22s
job2-fmbdp   1/1     Running     0          8s
job2-kxtqg   1/1     Running     0          8s
job2-xkjd4   0/1     Completed   0          22s
[root@master job]# 
[root@master job]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
job1   1/1           13s        15m
job2   4/6           27s        27s
[root@master job]# 
[root@master job]# kubectl get pods
NAME         READY   STATUS      RESTARTS   AGE
job2-7rp99   0/1     Completed   0          29s
job2-fmbdp   0/1     Completed   0          15s
job2-kxtqg   0/1     Completed   0          15s
job2-nqf48   1/1     Running     0          3s
job2-ttmxb   1/1     Running     0          3s
job2-xkjd4   0/1     Completed   0          29s
[root@master job]# 
[root@master job]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
job1   1/1           13s        15m
job2   4/6           34s        34s

# 直到6个任务分3次执行完且状态全部为completed为止哦。
[root@master job]# kubectl get pods
NAME         READY   STATUS      RESTARTS   AGE
job2-7rp99   0/1     Completed   0          35s
job2-fmbdp   0/1     Completed   0          21s
job2-kxtqg   0/1     Completed   0          21s
job2-nqf48   1/1     Running     0          9s
job2-ttmxb   1/1     Running     0          9s
job2-xkjd4   0/1     Completed   0          35s
[root@master job]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
job1   1/1           13s        15m
job2   6/6           38s        39s
[root@master job]# kubectl get pods
NAME         READY   STATUS      RESTARTS   AGE
job2-7rp99   0/1     Completed   0          41s
job2-fmbdp   0/1     Completed   0          27s
job2-kxtqg   0/1     Completed   0          27s
job2-nqf48   0/1     Completed   0          15s
job2-ttmxb   0/1     Completed   0          15s
job2-xkjd4   0/1     Completed   0          41s
[root@master job]# 

将刚才创建的2个job都删了吧

[root@master job]# kubectl delete jobs.batch job1
job.batch "job1" deleted
[root@master job]# kubectl delete jobs.batch job2
job.batch "job2" deleted
[root@master job]# 
[root@master job]# kubectl get pods
No resources found in job namespace.
[root@master job]# 

RestartPolicy测试

  • 前面说过
    Job的RestartPolicy仅支持Never和OnFailure两种,不支持Always, Job就相当于来执行一个批处理任务,执行完就结束了,如果支持Always的话会陷入了死循环了。

    • Nerver 只要任务没有完成,就会删除pod并新创建pod运行,直到job完成【会产生多个pod】
    • OnFailure 只要pod没有完成,则会重启pod,直到job完成
  • 这2个参数呢,很直观了,一个删除重建,一个重启,我这只以Nerver来测试吧
    首先要直到,什么情况pod才不会完成呢,比如,里面定义的command命令错误,这样的pod就不会成功,job就会认为这个任务是没有完成的。

[root@master job]# cat job2.yaml
apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: job2
spec:
  backoffLimit: 4
  completions: 6
  parallelism: 2
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - command:
        - sh
        - -c
        # 我在下面seelp后面加了个x,没有这个命令的
        - date ; sleepx 10
        image: busybox
        imagePullPolicy: IfNotPresent
        name: job2
        resources: {}
      restartPolicy: Never
status: {}
[root@master job]# 
  • 现在开始测试
[root@master job]# kubectl apply -f job2.yaml
job.batch/job2 created
[root@master job]# 

# 创建成功以后 job状态一直是 0/6 因为不会执行成功的
[root@master job]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
job2   0/6           5s         5s
[root@master job]# 

# pod数量这个就是  backoffLimit: 4 定义的,需要重复4次,一次2个,但状态都会为Error,全是失败的
[root@master job]# kubectl get pods
NAME         READY   STATUS   RESTARTS   AGE
job2-76z75   0/1     Error    0          9s
job2-n52l6   0/1     Error    0          9s
job2-tr59f   0/1     Error    0          6s
job2-trtwd   0/1     Error    0          6s
[root@master job]# 
[root@master job]# kubectl get pods
NAME         READY   STATUS   RESTARTS   AGE
job2-76z75   0/1     Error    0          12s
job2-n52l6   0/1     Error    0          12s
job2-tr59f   0/1     Error    0          9s
job2-trtwd   0/1     Error    0          9s
[root@master job]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
job2   0/6           15s        15s
[root@master job]# kubectl get pods
NAME         READY   STATUS   RESTARTS   AGE
job2-76z75   0/1     Error    0          18s
job2-jn89q   0/1     Error    0          5s
job2-mv6z7   0/1     Error    0          5s
job2-n52l6   0/1     Error    0          18s
job2-tr59f   0/1     Error    0          15s
job2-trtwd   0/1     Error    0          15s
[root@master job]# kubectl get job
NAME   COMPLETIONS   DURATION   AGE
job2   0/6           24s        24s
[root@master job]# kubectl get pods
NAME         READY   STATUS   RESTARTS   AGE
job2-76z75   0/1     Error    0          26s
job2-jn89q   0/1     Error    0          13s
job2-mv6z7   0/1     Error    0          13s
job2-n52l6   0/1     Error    0          26s
job2-tr59f   0/1     Error    0          23s
job2-trtwd   0/1     Error    0          23s


# 理论上,一次2个,重复4次,一共有8次才对,但最终只有6次
# 所以 backoffLimit: 4定义的次数是不准的,这是正常的哈,我们不要去数,不要去较这个真
[root@master job]# kubectl get pods
NAME         READY   STATUS   RESTARTS   AGE
job2-76z75   0/1     Error    0          29s
job2-jn89q   0/1     Error    0          16s
job2-mv6z7   0/1     Error    0          16s
job2-n52l6   0/1     Error    0          29s
job2-tr59f   0/1     Error    0          26s
job2-trtwd   0/1     Error    0          26s

# 可以用这个命令看到详细过程的哈
[root@master job]# kubectl  describe job job2 
Name:           job2
Namespace:      job
Selector:       controller-uid=de313ff4-ec7a-49d8-a719-46e83ad25e4e
Labels:         controller-uid=de313ff4-ec7a-49d8-a719-46e83ad25e4e
                job-name=job2
Annotations:    <none>
Parallelism:    2
Completions:    6
Start Time:     Wed, 08 Sep 2021 12:23:59 +0800
Pods Statuses:  0 Running / 0 Succeeded / 6 Failed
Pod Template:
  Labels:  controller-uid=de313ff4-ec7a-49d8-a719-46e83ad25e4e
           job-name=job2
  Containers:
   job2:
    Image:      busybox
    Port:       <none>
    Host Port:  <none>
    Command:
      sh
      -c
      date ; sleepx 10
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type     Reason                Age    From            Message
  ----     ------                ----   ----            -------
  Normal   SuccessfulCreate      4m10s  job-controller  Created pod: job2-76z75
  Normal   SuccessfulCreate      4m10s  job-controller  Created pod: job2-n52l6
  Normal   SuccessfulCreate      4m7s   job-controller  Created pod: job2-tr59f
  Normal   SuccessfulCreate      4m7s   job-controller  Created pod: job2-trtwd
  Normal   SuccessfulCreate      3m57s  job-controller  Created pod: job2-jn89q
  Normal   SuccessfulCreate      3m57s  job-controller  Created pod: job2-mv6z7
  Warning  BackoffLimitExceeded  2m37s  job-controller  Job has reached the specified backoff limit
[root@master job]# 

将配置sleep改回去【后面如果要测试,怕不知道发生了啥】,并删了这个pod,此致,job就算完成了,下面开始看job3

[root@master job]# kubectl delete job job2 
job.batch "job2" deleted
[root@master job]# 
[root@master job]# kubectl get pods
No resources found in job namespace.
[root@master job]# 

测试【计算圆周率2000位】

perl镜像获取

首先node节点上需要有perl这个镜像,我现在也没有,因为我集群是没有外网的,所以从外面倒过来的,这时候顺便简单重温一下这个镜像过程吧【之前有详细说明的,这就不做详细说明】【perl镜像800M,麻烦不说,还费时间,唉】
在这里插入图片描述
在这里插入图片描述
这推荐一个rz -E命令,贼方便,get起来吧。
在这里插入图片描述
最后呢,在2个node节点导入该包就好了

[root@node1 ~]# rz -E
rz waiting to receive.
 zmodem trl+C ȡ

  100%  862399 KB 15399 KB/s 00:00:56       0 Errors

[root@node1 ~]# scp perl.tar node2:~
The authenticity of host 'node2 (192.168.59.144)' can't be established.
ECDSA key fingerprint is SHA256:+JrT4G9aMhaod/a9gBjUOzX5aONqQ7a4OX0Oj3Z978c.
ECDSA key fingerprint is MD5:7f:4c:cc:5c:10:d2:54:d8:3c:dd:da:39:48:30:12:59.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'node2,192.168.59.144' (ECDSA) to the list of known hosts.
root@node2's password: 
perl.tar                                      100%  842MB  20.5MB/s   00:41    
[root@node1 ~]# 
[root@node1 ~]# docker load -i perl.tar 
4dd0c5812fd4: Loading layer  119.3MB/119.3MB
6680d5caa699: Loading layer  17.18MB/17.18MB
1c721e0a3622: Loading layer  17.87MB/17.87MB
f36cbdef5e3a: Loading layer    150MB/150MB
6db3d1445d34: Loading layer  520.8MB/520.8MB
08180df9d29e: Loading layer  3.584kB/3.584kB
2517a95647ad: Loading layer  57.91MB/57.91MB
Loaded image: perl:latest
[root@node1 ~]# 
[root@node1 ~]# docker images | grep perl
perl                                                              latest     829f8ed1ee63   4 days ago      860MB
[root@node1 ~]# 
[root@node1 ~]# ssh node2
root@node2's password: 
Last login: Thu Sep  2 16:48:37 2021 from 192.168.59.1
[root@node2 ~]# docker load -i perl.tar 
4dd0c5812fd4: Loading layer  119.3MB/119.3MB
6680d5caa699: Loading layer  17.18MB/17.18MB
1c721e0a3622: Loading layer  17.87MB/17.87MB
f36cbdef5e3a: Loading layer    150MB/150MB
6db3d1445d34: Loading layer  520.8MB/520.8MB
08180df9d29e: Loading layer  3.584kB/3.584kB
2517a95647ad: Loading layer  57.91MB/57.91MB
Loaded image: perl:latest
[root@node2 ~]# docker images | grep perl
perl                                                              latest     829f8ed1ee63   4 days ago      860MB
[root@node2 ~]# 

配置文件编辑并测试

[root@master job]# cat job3.yaml
apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: job3
spec:
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - command:
        - sh
        - -c
        - perl -Mbignum=bpi -wle 'print bpi(2000)'
        image: perl
        imagePullPolicy: IfNotPresent
        name: job3
        resources: {}
      restartPolicy: Never
status: {}
[root@master job]# 
[root@master job]# kubectl apply -f job3.yaml 
job.batch/job3 created
[root@master job]# 

# 因为计算任务没完成,所以job是0/1,pod是running
[root@master job]# kubectl get job
NAME      COMPLETIONS   DURATION   AGE
job3   0/1           5s         5s
[root@master job]# kubectl get pods
NAME            READY   STATUS    RESTARTS   AGE
job3-4dn4c   1/1     Running   0          12s

# 计算完成以后,job1/1,pod成了completed
[root@master job]# kubectl get job
NAME      COMPLETIONS   DURATION   AGE
job3   1/1           12s        16s
[root@master job]# 
[root@master job]# kubectl get pods
NAME            READY   STATUS      RESTARTS   AGE
job3-4dn4c   0/1     Completed   0          80s
[root@master job]#

# 我们可以通过日志的方式看输出哦
[root@master job]# kubectl logs job3-4dn4c 
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901
[root@master job]# 

最后删除这个job

[root@master job]# kubectl delete jobs.batch job3
job.batch "job3" deleted
[root@master job]#

Cronjob【cj】

介绍

  • cronjob其实就是在Job的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性地在给定时间点运行。这个实际上和Linux中的crontab就非常类似了。

  • 一个cronjob对象其实就对应crontab文件中的一行,它根据配置的时间格式周期性地运行一个Job,格式和crontab也是一样的。

  • crontab的格式如下:

分 小时 日 月 周 要运行的命令 

#第1列分钟(0~59) 
#第2列小时(0~23) 
#第3列日(1~31) 
#第4列月(1~12) 
#第5列星期(0~7)(0和7表示星期天) 
#第6列要运行的命令
# 不考虑具体时间的话,可以用* 【和linux的crontab一样】

在这里插入图片描述

常用命令

唉 懒得单独列了 直接看下面使用的吧 该用的都用到了 都是kubectl的语法规则 只是换成了cj而已。

创建cj的yaml文件

  • kubectl create cj --help可以查看帮助

  • 下面创建的schedule后面的看不懂就看上面介绍哈,时间规则。【node上需要有busybox镜像哈,没有的先导入】

[root@master job]# kubectl create cronjob mycj --image=busybox --schedule="*/1 * * * *" --dry-run=client -o yaml -- sh -c "date ; sleep 10" > cj1.yaml
[root@master job]# cat cj1.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  creationTimestamp: null
  name: mycj
spec:
  jobTemplate:
    metadata:
      creationTimestamp: null
      name: mycj
    spec:
      template:
        metadata:
          creationTimestamp: null
        spec:
          containers:
          - command:
            - sh
            - -c
            - date ; sleep 10
            image: busybox
            name: mycj
            resources: {}
          restartPolicy: OnFailure
  # */1 其实就是每分钟哈        
  schedule: '*/1 * * * *'
status: {}
[root@master job]#

创建cj并常规测试

编辑文件并创建

[root@master job]# cat cj1.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  creationTimestamp: null
  name: mycj
spec:
  jobTemplate:
    metadata:
      creationTimestamp: null
      name: mycj
    spec:
      template:
        metadata:
          creationTimestamp: null
        spec:
          terminationGracePeriodSeconds: 0
          containers:
          - command:
            - sh
            - -c
            - date ; sleep 10
            image: busybox
            imagePullPolicy: IfNotPresent
            name: mycj
            resources: {}
          restartPolicy: OnFailure
  schedule: '*/1 * * * *'
status: {}
[root@master job]# 
[root@master job]# kubectl apply -f cj1.yaml
cronjob.batch/mycj created
[root@master job]# 

理论上呢,这个会每分钟执行一次,执行一次呢,pod会持续10秒左右

[root@master job]# kubectl get cj
NAME   SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
mycj   */1 * * * *   False     0        <none>          6s
[root@master job]# 
[root@master job]# kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
mycj-27184800-2tq92   1/1     Running   0          5s
[root@master job]# kubectl get cj
NAME   SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
mycj   */1 * * * *   False     1        10s             54s
[root@master job]# kubectl get pods
NAME                  READY   STATUS    RESTARTS   AGE
mycj-27184800-2tq92   1/1     Running   0          12s
[root@master job]#

我们可以新打开一个窗口执行:watch -n 0.5 kubectl get pods【动态查看,0.5秒刷新一次】
理论上会1-2分钟创建一个pod

[root@master job]# watch -n 0.5 kubectl get pods
Every 0.5s: kubectl get pods                            Wed Sep  8 16:03:46 2021

NAME                  READY   STATUS      RESTARTS   AGE        
mycj-27184801-l9dxk   0/1     Completed   0          2m46s       
mycj-27184802-w4ln2   0/1     Completed   0          106s        
mycj-27184803-vftp5   0/1     Completed   0          46s

下面可以看到6分钟了创建第4个pod并在运行

[root@master job]# kubectl get pods
NAME                  READY   STATUS      RESTARTS   AGE
mycj-27184803-vftp5   0/1     Completed   0          3m2s
mycj-27184804-wx6fz   0/1     Completed   0          2m2s
mycj-27184805-5vqlw   0/1     Completed   0          62s
mycj-27184806-vvzbs   1/1     Running     0          2s
[root@master job]# kubectl get cj
NAME   SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
mycj   */1 * * * *   False     1        10s             6m54s
[root@master job]# 

查看详细

[root@master job]# kubectl describe cj mycj 
Name:                          mycj
Namespace:                     job
Labels:                        <none>
Annotations:                   <none>
Schedule:                      */1 * * * *
Concurrency Policy:            Allow
Suspend:                       False
Successful Job History Limit:  3
Failed Job History Limit:      1
Starting Deadline Seconds:     <unset>
Selector:                      <unset>
Parallelism:                   <unset>
Completions:                   <unset>
Pod Template:
  Labels:  <none>
  Containers:
   mycj:
    Image:      busybox
    Port:       <none>
    Host Port:  <none>
    Command:
      sh
      -c
      date ; sleep 10
    Environment:     <none>
    Mounts:          <none>
  Volumes:           <none>
Last Schedule Time:  Wed, 08 Sep 2021 16:08:00 +0800
Active Jobs:         <none>
Events:
  Type    Reason            Age    From                Message
  ----    ------            ----   ----                -------
  Normal  SuccessfulCreate  8m34s  cronjob-controller  Created job mycj-27184800
  Normal  SawCompletedJob   8m22s  cronjob-controller  Saw completed job: mycj-27184800, status: Complete
  Normal  SuccessfulCreate  7m34s  cronjob-controller  Created job mycj-27184801
  Normal  SawCompletedJob   7m22s  cronjob-controller  Saw completed job: mycj-27184801, status: Complete
  Normal  SuccessfulCreate  6m34s  cronjob-controller  Created job mycj-27184802
  Normal  SawCompletedJob   6m22s  cronjob-controller  Saw completed job: mycj-27184802, status: Complete
  Normal  SuccessfulCreate  5m34s  cronjob-controller  Created job mycj-27184803
  Normal  SawCompletedJob   5m23s  cronjob-controller  Saw completed job: mycj-27184803, status: Complete
  Normal  SuccessfulDelete  5m23s  cronjob-controller  Deleted job mycj-27184800
  Normal  SuccessfulCreate  4m34s  cronjob-controller  Created job mycj-27184804
  Normal  SawCompletedJob   4m22s  cronjob-controller  Saw completed job: mycj-27184804, status: Complete
  Normal  SuccessfulDelete  4m22s  cronjob-controller  Deleted job mycj-27184801
  Normal  SuccessfulCreate  3m34s  cronjob-controller  Created job mycj-27184805
  Normal  SawCompletedJob   3m22s  cronjob-controller  Saw completed job: mycj-27184805, status: Complete
  Normal  SuccessfulDelete  3m22s  cronjob-controller  Deleted job mycj-27184802
  Normal  SuccessfulCreate  2m34s  cronjob-controller  Created job mycj-27184806
  Normal  SawCompletedJob   2m22s  cronjob-controller  Saw completed job: mycj-27184806, status: Complete
  Normal  SuccessfulDelete  2m22s  cronjob-controller  Deleted job mycj-27184803
  Normal  SuccessfulCreate  94s    cronjob-controller  Created job mycj-27184807
  Normal  SawCompletedJob   82s    cronjob-controller  Saw completed job: mycj-27184807, status: Complete
  Normal  SuccessfulDelete  82s    cronjob-controller  Deleted job mycj-27184804
  Normal  SuccessfulCreate  34s    cronjob-controller  Created job mycj-27184808
  Normal  SawCompletedJob   22s    cronjob-controller  Saw completed job: mycj-27184808, status: Complete
  Normal  SuccessfulDelete  22s    cronjob-controller  Deleted job mycj-27184805
[root@master job]# 

现在删除这个cj吧

[root@master job]# kubectl delete cj mycj 
cronjob.batch "mycj" deleted
[root@master job]# 
[root@master job]# kubectl get pods
No resources found in job namespace.
[root@master job]# 

指定pod运行时间测试

  • 上面呢,一个pod默认是10秒钟,但因为种种原因,一个pod存在时间可能不止10秒钟,现在呢,我们就指定该pod时间,比如只允许生成的pod运行5秒钟,那么pod到5秒钟的时候就会强制完成【删除】

  • 实现这个呢实际上就是一行参数罢了:activeDeadlineSeconds: 5【5是存在时间,单位是秒】

  • 现在我们修改配置文件并创建该pod

[root@master job]# cat cj2.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  creationTimestamp: null
  name: mycj
spec:
  jobTemplate:
    metadata:
      creationTimestamp: null
      name: mycj
    spec:
      activeDeadlineSeconds: 5
      template:
        metadata:
          creationTimestamp: null
        spec:
          terminationGracePeriodSeconds: 0
          containers:
          - command:
            - sh
            - -c
            - date ; sleep 10
            image: busybox
            imagePullPolicy: IfNotPresent
            name: mycj
            resources: {}
          restartPolicy: OnFailure
  schedule: '*/1 * * * *'
status: {}
[root@master job]# kubectl apply -f cj2.yaml
cronjob.batch/mycj created
[root@master job]# 

加了这个参数创建的cj,可以看到多了一项LAST SCHEOULE,这个呢就是该新一轮pod从创建到删除的时间【可以看到这个时间不会超过1分钟】
但是pod的话只能有5秒,5秒后就删了,所以我们很难看到这个pod的存在
新打开一个窗口执行:watch -n 0.5 kubectl get pods【动态查看,0.5秒刷新一次】在这里面是可以看到pod存在5秒然后被删除的哈

[root@master job]# 
[root@master job]# kubectl get cj
NAME   SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
mycj   */1 * * * *   False     0        <none>          17s
[root@master job]# 
[root@master job]# kubectl get pods
NAME                  READY   STATUS              RESTARTS   AGE
mycj-27184814-6q575   0/1     ContainerCreating   0          0s
[root@master job]# 
[root@master job]# kubectl get cj
NAME   SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
mycj   */1 * * * *   False     0        5s              25s
[root@master job]# 
[root@master job]# kubectl get cj
NAME   SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
mycj   */1 * * * *   False     0        12s             32s
[root@master job]# kubectl get pods
No resources found in job namespace.
[root@master job]# kubectl get cj
NAME   SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
mycj   */1 * * * *   False     0        44s             64s
[root@master job]# kubectl get cj
NAME   SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
mycj   */1 * * * *   False     0        27s             107s
[root@master job]# kubectl get cj
NAME   SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
mycj   */1 * * * *   False     0        49s             2m9s
[root@master job]# kubectl get pods
No resources found in job namespace.
[root@master job]# kubectl get cj
NAME   SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
mycj   */1 * * * *   False     1        0s              2m20s
[root@master job]# kubectl get pods
No resources found in job namespace.
[root@master job]# 

cj的特殊用法【descheduler均衡pod】

  • 场景说明:
    比如,deploy现在有10ge 副本,运行在node1和node2上
    • 问:新增一个node3节点之后,在其他节点运行的pod会被调度到新节点上,以均衡负载吗?
    • 答案:不能 【如果要实现的话,必须先删除node1和node2上的pod】

但是呢,我们可以通过用descheduler来实现这个呢实际上就是使用到了cj
这个流程呢,不算复杂,我不做演示,感兴趣的可以自行测试哦。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐