Kubernetes(K8s)之Job控制器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes(K8s)之Job控制器相关的知识,希望对你有一定的参考价值。

参考技术A

Job控制器用于Pod对象运行一次性任务,容器中的进程在正常运行结束后不会对其进行重启,而是将Pod对象置于"Completed"(完成)状态,若容器中的进程因错误而终止,则需要按照重启策略配置确定是否重启,未运行完成的Pod对象因其所在的节点故障而意外终止后会被调度。
Job控制器的Pod对象的状态转换如下图所示:

有的作业可能需要运行不止一次,用户可以配置它们以串行或者并行的方式运行。

Job控制器的spec字段内嵌的必要字段只有 template ,不需要定义标签选择器,控制器会自动关联,除了这一点与Deployment控制器不同,其它别无二致。

1.创建Job控制器配置清单
使用busybox镜像,然后沉睡120s,完成后即正常退出容器

2.创建Job控制器

3.查看Job控制器及Pod状态

120s后,Job控制器创建的Pod对象完成了任务

查看Job控制器的详细信息
如下 Selector 与 Lables 都是Job控制器自动生成后自动关联,控制器自动生成的 controller-uid-随机字符串 ,控制器携带了后面的字符串是为了防止所管理的Pod发生重合。
下面可以看到Job运行成功后及完成了操作并没有进程重启,这得助于我们设置的 restartPolicy 。

将并行度属性 job.spec.parallelism 的值设置为1,并设置总任务数 job.spec.completions 属性便能够让Job控制器以串行方式运行多任务,下面是一个需要串行5此任务的Job控制器示例:

创建Job控制器

动态监控Pod对象作业的变化

如上,Job控制器需要执行五次任务,每次一个Pod执行一个任务,依次执行,执行成功后的Pod即为完成状态

并行式Job我们只需要修改 job.spec.parallelism 属性与 job.spec.completions 属性即可;
job.spec.parallelism 属性表示了每次启动多少队列执行作业(即为Pod数量)
job.spec.completions 属性表示了作业的总数量

如下示例一个5个作业,同时启动5个队列进行作业。

查看Job控制器运行状态,如下Job控制器中的Pod对象创建时间是一致的。

Job控制器中的Pod运行完成后,将不再占用系统资源,用户可以按照需求保留或使用资源删除命令将Pod删除,不过如果某控制器的容器应用总是无法正常结束运行,而其 restartPolicy 又设置为了重启,则它可能会一直处于不停地重启和错误的循环当中。所幸的是,Job控制器提供了两个属性用于抑制这种情况的发生,具体如下:

例如,下面的配置清单为,表示其失败重试次数为5此,并且如果超出100秒的时间仍然未运行完成,那么则将其终止:

Docker&Kubernetes ❀ Kubernetes集群Pod控制器 - Job

文章目录

1、基本概念与控制器特点


Job:主要用于负责批量处理(一次性处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)任务;

特点如下:

  • 当Job创建的Pod执行成功时,Job将记录为成功结束的Pod数量;
  • 当成功结束的Pod达到指定的数量时,Job将完成执行;

2、资源配置清单


参数查询方法:
[root@master ~]# kubectl explain job

参数汇总梳理:

apiVersion: batch/v1
kind: Job
metadata:
  name: pc-job
  namespace: dev
  labels:
    controller: job 
spec:
  completions: 6                    #指定job需要成功运行Pod的次数,默认值为1
  parallelism: 3                    #指定job在任一时刻应该并发运行pod的数量,默认值为1
  activeDeadlineSeconds: 30         #指定job可运行的时间期限,超过时间未结束系统会尝试终止
  backoffLimit: 6                   #指定job失败后进行重试的次数,默认为6
  manualSelector: true              #是否可以使用selector选择器选择pod,默认为false
  selector:                         #pod选择器,指定控制那些pod
    matchLabels:
      app: count-pod 
    matchExpressions:
    - key: "app"
      operator: In 
      values: ["nginx-pod"]
  template:                         #模板,当副本数量不足时,会根据以下配置创建副本
    metadata:
      labels:
        app: counter-pod
    spec:
      restartPolicy: Never          #重启策略,支持Nerver或OnFailure
      containers:
      - name: counter
        image: busybox:latest
        command: ["/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 2;done"]

重启策略

  • 如果指定为OnFailure,则Job会在Pod出现故障时重启容器,而不是创建Pod,failer次数不会改变;
  • 如果指定为Never,则Job会在Pod出现故障时创建新的Pod,并且故障Pod不会消失,failed次数加1;
  • 如果指定为Always,则一直重启,意味着Job任务会重复执行,因此不能设置为Always;

3、创建控制器


下面主要介绍两个使用,首先使用Job创建单个Pod以观察Pod创建的具体过程,其次创建多个Pod,使其进行并发创建,然后观察创建过程;

3.1 Job控制单个Pod

此实验建议开启三个终端,第一个终端执行调用文件命令,第二个终端监控Job控制器,第三个终端监控Pod;

#创建YAML文件
[root@master ~]# cat pc-job.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  name: pc-job
  namespace: dev
spec:
  manualSelector: true 
  selector:
    matchLabels:
      app: counter-pod 
  template:
    metadata:
      labels:
        app: counter-pod 
    spec:
      restartPolicy: Never
      containers:
      - name: counter
        image: busybox:latest
        command: ["/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 2;done"]
#调用YAML文件
[root@master ~]# kubectl apply -f pc-job.yaml 
job.batch/pc-job created

#监控Job控制器
[root@master ~]# kubectl get job -n dev -w 
NAME     COMPLETIONS   DURATION   AGE
pc-job   0/1                      0s
pc-job   0/1           0s         0s
pc-job   0/1           35s        35s
pc-job   1/1           35s        35s

#监控Pod
NAME           READY   STATUS    RESTARTS   AGE
pc-job-qtw84   0/1     Pending   0          0s
pc-job-qtw84   0/1     Pending   0          0s
pc-job-qtw84   0/1     ContainerCreating   0          0s
pc-job-qtw84   0/1     ContainerCreating   0          1s
pc-job-qtw84   1/1     Running             0          17s
pc-job-qtw84   0/1     Completed           0          35s
pc-job-qtw84   0/1     Completed           0          35s
pc-job-qtw84   0/1     Completed           0          35s

3.2 Job控制多个并发Pod

此实验仍然建议开启三个终端,第一个终端执行调用文件命令,第二个终端监控Job控制器,第三个终端监控Pod;

#创建YAML文件
[root@master ~]# vim pc-job.yam
apiVersion: batch/v1
kind: Job
metadata:
  name: pc-job
  namespace: dev
spec:
  manualSelector: true 
  completions: 6                    #指定job需要成功运行Pod的次数,默认值为1
  parallelism: 3                    #指定job在任一时刻应该并发运行pod的数量,默认值为1
  selector:
    matchLabels:
      app: counter-pod 
  template:
    metadata:
      labels:
        app: counter-pod 
    spec:
      restartPolicy: Never
      containers:
      - name: counter
        image: busybox:latest
        command: ["/bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1;do echo $i;sleep 2;done"]
#调用YAML文件
[root@master ~]# kubectl apply -f pc-job.yaml 
job.batch/pc-job created

#监控Job控制器
[root@master ~]# kubectl get job -n dev -w 
NAME     COMPLETIONS   DURATION   AGE
pc-job   0/6                      0s
pc-job   0/6           0s         0s
pc-job   0/6           35s        35s
pc-job   1/6           35s        35s
pc-job   1/6           36s        36s
pc-job   2/6           36s        36s
pc-job   2/6           52s        52s
pc-job   3/6           52s        52s
pc-job   3/6           71s        71s
pc-job   4/6           71s        71s
pc-job   4/6           71s        71s
pc-job   5/6           71s        71s
pc-job   5/6           87s        87s
pc-job   6/6           87s        87s

#监控Pod
[root@master ~]# kubectl get pod -n dev -w
NAME           READY   STATUS    RESTARTS   AGE
pc-job-jllsm   0/1     Pending   0          0s
pc-job-882tp   0/1     Pending   0          0s
pc-job-xblq4   0/1     Pending   0          0s
#与配置参数符合,一次性创建3个Pod执行Job任务,共6个任务,创建2次
pc-job-882tp   0/1     Pending   0          0s
pc-job-jllsm   0/1     Pending   0          0s
pc-job-xblq4   0/1     Pending   0          0s
pc-job-882tp   0/1     ContainerCreating   0          0s
pc-job-xblq4   0/1     ContainerCreating   0          0s
pc-job-jllsm   0/1     ContainerCreating   0          0s
pc-job-882tp   0/1     ContainerCreating   0          1s
pc-job-jllsm   0/1     ContainerCreating   0          2s
pc-job-xblq4   0/1     ContainerCreating   0          2s
pc-job-882tp   1/1     Running             0          17s
pc-job-jllsm   1/1     Running             0          18s
pc-job-xblq4   1/1     Running             0          34s
pc-job-882tp   0/1     Completed           0          35s
pc-job-8scd8   0/1     Pending             0          0s
pc-job-8scd8   0/1     Pending             0          0s
pc-job-882tp   0/1     Completed           0          35s
pc-job-8scd8   0/1     ContainerCreating   0          0s
pc-job-882tp   0/1     Completed           0          35s
pc-job-jllsm   0/1     Completed           0          36s
pc-job-n8hd9   0/1     Pending             0          0s
pc-job-n8hd9   0/1     Pending             0          0s
pc-job-n8hd9   0/1     ContainerCreating   0          0s
pc-job-jllsm   0/1     Completed           0          36s
pc-job-jllsm   0/1     Completed           0          36s
pc-job-8scd8   0/1     ContainerCreating   0          1s
pc-job-n8hd9   0/1     ContainerCreating   0          1s
pc-job-xblq4   0/1     Completed           0          52s
pc-job-zs97t   0/1     Pending             0          0s
pc-job-xblq4   0/1     Completed           0          52s
pc-job-zs97t   0/1     Pending             0          0s
pc-job-zs97t   0/1     ContainerCreating   0          0s
pc-job-xblq4   0/1     Completed           0          52s
pc-job-8scd8   1/1     Running             0          17s
pc-job-zs97t   0/1     ContainerCreating   0          1s
pc-job-n8hd9   1/1     Running             0          17s
pc-job-zs97t   1/1     Running             0          17s
pc-job-8scd8   0/1     Completed           0          36s
pc-job-8scd8   0/1     Completed           0          36s
pc-job-8scd8   0/1     Completed           0          36s
pc-job-n8hd9   0/1     Completed           0          35s
pc-job-n8hd9   0/1     Completed           0          35s
pc-job-n8hd9   0/1     Completed           0          35s
pc-job-zs97t   0/1     Completed           0          35s
pc-job-zs97t   0/1     Completed           0          35s
pc-job-zs97t   0/1     Completed           0          35s

4、删除控制器


[root@master ~]# kubectl delete -f pc-job.yaml 
job.batch "pc-job" deleted

以上是关于Kubernetes(K8s)之Job控制器的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes(k8s)一次性任务:Job

k8s-pod之Job

k8s安装之heapster与metric

kubernetes对象之Job

kubernetes(k8s)Job 和 Cronjob 的使用

Kubernetes(K8s) kubectl get 常用命令