CKA备考实验 | job

书籍来源:《CKA/CKAD应试指南:从Docker到Kubernetes完全攻略》

一边学习一边整理老师的课程内容及实验笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:CKA备考实验 | 汇总_热爱编程的通信人的博客-CSDN博客


job用于执行一次性任务,比如计算圆周率小数点后200位,运算完成之后就结束了,不用一直运算下去。当创建一个job后,这个job会创建一个pod去完成一个任务,如果pod执行成功了,则此job结束; 如果执行失败,则会新创建一个pod或者重启pod,再次去执行任务。

为了看起来不那么乱,单独创建一个命名空间nsjob,并切换至此命名空间。

##########实操验证##########
[root@vms10 probe]# kubectl create ns nsjob
namespace/nsjob created
[root@vms10 probe]# kubens nsjob
Context "kubernetes-admin@kubernetes" modified.
Active namespace is "nsjob".
[root@vms10 probe]#

把本章所需要的文件全部放在一个单独的目录jobs里,创建jobs目录并进入。

##########实操验证##########
[root@vms10 ~]# mkdir jobs
[root@vms10 ~]# cd jobs/
[root@vms10 jobs]#

创建job

既可以通过命令行的方式创建job,也可以通过yaml文件的力式创建job,建议用命令行的方式生成yaml文件,然后在其基础上进行修改。

命令行创建job的语法如下。

kubectl create job 名字 --image=镜像 -- "命令"

先创建一个名字叫job1的job,所使用的镜像是busybox,此任务里执行命令为"echo hello ; sleep 10"。

步骤1:用命令行创建一个job的yaml文件job1.yaml。

##########实操验证##########
[root@vms10 jobs]# kubectl create job job1 --image=busybox --dry-run=client -o yaml -- sh -c "echo hello &&sleep 10" > job1.yaml
[root@vms10 jobs]#

由此job创建出来的pod,里面运行的是如下命令:先执行echo hello,之后等待10s。整个pod的运行时间就是10s。

步骤2:对刚刚生成的job1.yaml做适当的修改,内容如下。

##########实操验证##########
[root@vms10 jobs]# cat job1.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: job1
spec:
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - command:
        - sh
        - -c
        - echo hello &&sleep 10
        image: busybox
        imagePullPolicy: IfNotPresent
        name: job1
        resources: {}
      restartPolicy: Never
status: {}
[root@vms10 jobs]#

这里imagePullPolicy: IfNotPresent是手动加上去的,注意这里的重启策略。

job的restart策略只能是以下2种。

(1)Never:只要任务没有完成,则新创建pod运行,直到job完成,会产生多个pod。

(2)OnFailure:只要pod没有完成,就会重启pod,重新执行任务。

前面讲pod时,介绍过pod有3种重启策略,但是在job里没有Always这种重启策略。

步骤3:创建job。

##########实操验证##########
[root@vms10 jobs]# kubectl apply -f job1.yaml 
job.batch/job1 created
[root@vms10 jobs]#

步骤4:查看pod状况。

##########实操验证##########
 kubectl get pods
NAME         READY   STATUS    RESTARTS   AGE
job1-4dzjq   1/1     Running   0          5s
[root@vms10 jobs]#

这个pod里的进程只会运行10s,到第11s的时候进程结束,则pod也运行完毕。

步骤5:查看job的运行状态。

##########实操验证##########
[root@vms10 jobs]# kubectl get pods
NAME         READY   STATUS      RESTARTS   AGE
job1-4dzjq   0/1     Completed   0          14s
[root@vms10 jobs]#

在COMPLETIONS列看到的是0/1,说明此job需要正确地完成一次,因为pod正在运行,即任务还没有完成,所以能看到0/1。

步骤6:再次查看pod状况。

##########实操验证##########
[root@vms10 jobs]# kubectl get pods
NAME         READY   STATUS      RESTARTS   AGE
job1-4dzjq   0/1     Completed   0          76s
[root@vms10 jobs]#

因为这里pod中的进程已经正常运行完毕了,状态为Completed。

步骤7:查看job的运行状态。

##########实操验证##########
[root@vms10 jobs]# kubectl get jobs
NAME   COMPLETIONS   DURATION   AGE
job1   1/1           12s        96s
[root@vms10 jobs]#

这里说明,job1需要完成一次,且pod的任务也正确完成了,所以这里显示1/1。

步骤8:删除job1。

##########实操验证##########
[root@vms10 jobs]# kubectl delete -f job1.yaml 
job.batch "job1" deleted
[root@vms10 jobs]#

在job中指定参数

因为job所创建出来的d,其里面的进程是一次性的任务。执行完之后pod就结束了,没有必要一直执行。所以job正确结束之后所创建的pod状态必须要是Completed。

如果job所创建的pod里的进程因为种种原因没有正确执行,就意味着任务没有正确完成,那么就要重复去执行,直到任务完成,即出现状态为Completed的pod。

这里说的job没有正确执行需要重复去执行,到底是通过重启pod还是新创建pod的方式来重新执行任务,就要看在job里所设置的重启策略了。

对于一些任务而言,测试一次成功了,不能算成功,需要测试多次且都成功了,才算是成功。那么可以在定义job时指定相关的参数。

在job的yaml文件里还可以指定以下几个参数。

(1)parallelism:N,并行运行N个pod。

(2)completion:M,job测试多次的话,要有M次要成功才算成功,即要有M个状态为Completed的pod,如果没有就重复执行。

(3)backoffLimit:N,如果job失败,则重试几次。(注:重试时如果并行创建2个pod,则算是重复2次,有时创建的pod会被自动删除。比如总共创建了5个pod,然后自动删除了了2个,我们最终看到的pod数为3,所以不能以最终的pod数计算重试的次数)

这里parallelism的值指的是一次性运行几个pod,这个值不会超过completions的值。

(4)activeDeadlineSeconds:N,job运行的最长时间,单位是秒,超过这个时间不管job有没有完成都会被终止,没完成的pod也会被强制删除,也不会再产生新的pod。

步骤1:修改job1.yaml的内容如下。

##########实操验证##########
[root@vms10 jobs]# cat job1.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: job1
spec:
  parallelism: 3
  completions: 6
  backoffLimit: 4
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - command:
        - sh
        - -c
        - echo hello &&sleep 10
        image: busybox
        imagePullPolicy: IfNotPresent
        name: job1
        resources: {}
      restartPolicy: Never
status: {}
[root@vms10 jobs]#

这里并行设置为3个,要有6个pod处于完成状态才可以。

步骤2:创建job1。

##########实操验证##########
[root@vms10 jobs]# kubectl apply -f job1.yaml 
job.batch/job1 created
[root@vms10 jobs]#

步骤3:查看pod的运行状态。

##########实操验证##########
[root@vms10 jobs]# kubectl get pods
NAME         READY   STATUS    RESTARTS   AGE
job1-4rlbq   1/1     Running   0          7s
job1-m5zxq   1/1     Running   0          7s
job1-x8ps8   1/1     Running   0          7s
[root@vms10 jobs]#

这里一共运行了3个pod,因为我们加了参数parallelism: 3。

步骤4:查看job的运行状态。

##########实操验证##########
[root@vms10 jobs]# kubectl get jobs
NAME   COMPLETIONS   DURATION   AGE
job1   0/6           2s         2s
[root@vms10 jobs]#

因为指定了参数completions: 6,即需要job完成6次,但是现在有3个正在运行,还没有pod执行完成,所以看到的结果是0/6。

步骤5:再次查看pod的运行状态。

##########实操验证##########
[root@vms10 jobs]# kubectl get pods
NAME         READY   STATUS              RESTARTS   AGE
job1-49b4q   0/1     Completed           0          16s
job1-c4gzh   1/1     Running             0          4s
job1-dz6l6   1/1     Running             0          4s
job1-hdqqs   0/1     Completed           0          16s
job1-hrnct   0/1     ContainerCreating   0          1s
job1-vsw5x   0/1     Completed           0          16s
[root@vms10 jobs]#

因为pod里的运行时间是10s,所以现在有3个pod已经运行完毕了,然后再次开启3个pod(因为需要6个,每次运行3个)。

步骤6:再次看下job的运行状态。

##########实操验证##########
[root@vms10 jobs]# kubectl get jobs
NAME   COMPLETIONS   DURATION   AGE
job1   5/6           28s        28s
[root@vms10 jobs]#

可以看到,job需要完成6次,这里已经完成了3个,所以显示的是3/6。

步骤7:等一会之后,再次查看pod的状态。

##########实操验证##########
[root@vms10 jobs]# kubectl get pods
NAME         READY   STATUS      RESTARTS   AGE
job1-49b4q   0/1     Completed   0          2m6s
job1-c4gzh   0/1     Completed   0          114s
job1-dz6l6   0/1     Completed   0          114s
job1-hdqqs   0/1     Completed   0          2m6s
job1-hrnct   0/1     Completed   0          111s
job1-vsw5x   0/1     Completed   0          2m6s
[root@vms10 jobs]#

这里6个pod已经全部运行完毕了,不再产生新的pod,因为completions:6这个条件已经满足了。

步骤8:查看job的运行状态。

##########实操验证##########
[root@vms10 jobs]# kubectl get jobs
NAME   COMPLETIONS   DURATION   AGE
job1   6/6           30s        30s
[root@vms10 jobs]#

这里已经显示为6/6,意思是此job需要完成6次,现在也已经正确地完成了。

步骤9:删除此job。

##########实操验证##########
[root@vms10 jobs]# kubectl delete -f job1.yaml 
job.batch "job1" deleted
[root@vms10 jobs]#

步骤10:修改pod1.yaml的内容如下。

##########实操验证##########
[root@vms10 jobs]# cat job1.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  creationTimestamp: null
  name: job1
spec:
  parallelism: 3
  completions: 6
  backoffLimit: 3
  template:
    metadata:
      creationTimestamp: null
    spec:
      containers:
      - command:
        - sh
        - -c
        - echoX hello &&sleep 10
        image: busybox
        imagePullPolicy: IfNotPresent
        name: job1
        resources: {}
      restartPolicy: Never
status: {}
[root@vms10 jobs]#

这里把容器里的命令误写成了echoX,此容器是不能正确执行的,因为这里重启策略设置的是Never,所以需要重复创建pod来执行此job。

##########实操验证##########
[root@vms10 jobs]# kubectl get pods
NAME         READY   STATUS   RESTARTS   AGE
job1-6vczq   0/1     Error    0          18s
job1-chjlv   0/1     Error    0          16s
job1-hmqct   0/1     Error    0          18s
job1-pnxgd   0/1     Error    0          18s
job1-s46j4   0/1     Error    0          16s
[root@vms10 jobs]#

如果这里重启策略设置的是OnFailure,则不是通过创建pod来解决失败的问题,而是通过重启来解决问题。

步骤11:删除此job。

##########实操验证##########
[root@vms10 jobs]# kubectl delete -f job1.yaml 
job.batch "job1" deleted
[root@vms10 jobs]#

练习:计算圆周率小数点后2000位

前面讲了如何使用job做一次性任务,那么下面练习一下如何使用job计算圆周率小数点后2000位。

##########实操验证##########
[root@vms10 jobs]# kubectl create job job2 --image=perl -- perl -Mbignum=bpi -wle 'print bpi(1000)'
job.batch/job2 created
[root@vms10 jobs]#

注意:这里perl -Mbignum=bpi -wle 'print bpi(2000)'是perl里的命令,不是k8s内容,大家知道即可。

查看pod的运行状况。

##########实操验证##########
[root@vms10 ~]# kubectl get pods
NAME         READY   STATUS      RESTARTS   AGE
job2-wpvpj   0/1     Completed   0          10s
[root@vms10 ~]#

现在还是正在运行的,稍等一会之后,再次查看。

##########实操验证##########
[root@vms10 ~]# kubectl get pods
NAME         READY   STATUS      RESTARTS   AGE
job2-wpvpj   0/1     Completed   0          10s
[root@vms10 ~]#

查看下pod里的输出。

##########实操验证##########
[root@vms10 ~]# kubectl logs job2-wpvpj
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420199
[root@vms10 ~]#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值