【Kubernetes】Pod学习(十二)Pod调度:Job和Cronjob

此文为学习《Kubernetes权威指南》的相关笔记

学习笔记:

Job:批处理调度,用于定义并启动一个批处理任务,与RS\RC\Deployment\DaemonSet类似,Job同样作为副本控制器的一种,来控制一组Pod容器,批处理任务的建立目标在于处理一批工作项(work item),在处理完成后,整个批处理任务结束,与其他副本控制器的差别在于:

  • Job所控制的Pod副本短暂运行,且RestartPolicy为Never,当控制的所有Pod副本运行结束后,Job随之结束。
  • Job所控制的Pod副本的工作模式能够实现段多实例并行运算。

K8s在1.5版本之后提供了Cronjob:定时任务,使得让某些批处理任务根据定时反复执行成为可能。

阿里云大学云原生公开课上,对Job给出的介绍如下:

下面是Job和CronJob的运行实例

一、Job运行实例

1、建立配置文件模板job.yaml.txt

Job所在的apiVersion应指定为batch/v1

与RC等副本控制器相同,Job在.spec.template域中定义它控制的Pod属性, restartPolicy域应当设置为Never

在本次Job的定义中,设置每次运行时打印此批处理任务的名称

apiVersion: batch/v1
kind: Job

metadata:
 name: process-item-$ITEM
 labels:
  jobgroup: jobexample
spec:
 template:
  metadata:
   name: jobexample
   labels:
    jobgroup: jobexample
  spec:
   containers:
   - name: c
     image: busybox
     command: ["sh","-c","echo Processing item $ITEM && sleep 5"]
   restartPolicy: Never

扫描二维码关注公众号,回复: 8548104 查看本文章

2、使用模板批量生成配置文件,创建Job

使用shell语言按照模板生成3个item名称不同的Job配置文件到文件夹jobs

# for i in j1 j2 j3; do  cat job.yaml.txt | sed "s/\$ITEM/$i/" > ./jobs/job-$i.yaml; done

如果在-f参数后指定一个文件夹路径而不是文件,K8s将使用路径下所有的yaml文件建立资源对象

# kubectl create -f jobs
job.batch/process-item-j1 created
job.batch/process-item-j2 created
job.batch/process-item-j3 created

3、查看运行情况

查看Job列表,可以看到三个Job建立成功

# kubectl get jobs
NAME              COMPLETIONS   DURATION   AGE
process-item-j1   1/1           21s        3m7s
process-item-j2   1/1           17s        3m7s
process-item-j3   1/1           14s        3m7s

 查看Pod运行日志,可以看到每个Job控制下的Pod都完成了自己的任务

# kubectl logs process-item-j1-hjj79
Processing item j1
]# kubectl logs process-item-j2-5w2bp
Processing item j2
# kubectl logs process-item-j3-2fjbp
Processing item j3

上述实现的是Job Template Expansiton模式,每个work Item对应一个Job实例

二、Job的并行运行

阿里云大学云原生技术公开课的教程中给出了并行运行Job的具体方法

创建Job配置文件paral-job.yaml

 使用completions、parallelism两个量分别指定下属Pod的执行次数和并行执行个数

在Pod的定义中指定30秒后打印当前时间

apiVersion: batch/v1
kind: Job
metadata:
 name: paral-job
spec:
 completions: 8     #执行次数
 parallelism: 2
       #并行个数
 template:
  spec:
   containers:
   - name: param
     image: ubuntu
     imagePullPolicy: IfNotPresent
     command: ["/bin/sh"]
     args: ["-c","sleep 30;date"]
   restartPolicy: OnFailure     

 创建Job后,等待运行完成,查看运行结果

# kubectl get jobs
NAME        COMPLETIONS   DURATION   AGE
paral-job   8/8           2m11s      4m44s

# kubectl get pods
NAME              READY   STATUS      RESTARTS   AGE
paral-job-2qhrl   0/1     Completed   0          2m16s
paral-job-4t5n4   0/1     Completed   0          3m20s
paral-job-5xb96   0/1     Completed   0          3m20s
paral-job-7wbvp   0/1     Completed   0          2m47s
paral-job-m8wqp   0/1     Completed   0          2m48s
paral-job-qzk75   0/1     Completed   0          2m15s
paral-job-rtcnf   0/1     Completed   0          3m54s
paral-job-vv2zp   0/1     Completed   0          3m54s

可以看到,Job下的Pod以两两并行的方式运行了8次

三、CronJob运行实例

1、建立CronJob配置文件并运行

建立配置文件cronjob.yaml

CronJob所在的apiVersion为batch/v1beta1

书上给出的为batch/v1 beta 使用该apiVersion会报错:

error: unable to recognize "cronjob.yaml": no matches for kind "CronJob" in version "batch/v1 beta"

 这明显是K8s版本更替出现的问题

在CronJob的.spec.schedule中可以通过与Linux Cron中相似的表达式去指定定时

这里指定为每1分钟调度一次

在.spec.jobTemplate中可以定义这个CronJob所管理的Job(套娃

在本次的配置中,Job每次被调度运行时,会输出当前被调度的时间

apiVersion: batch/v1beta1
kind: CronJob
metadata:
 name: hello
spec:
 schedule: "*/1 * * * *"
 jobTemplate:
  spec:
   template:
    spec:
     containers:
     - name: hello
       image: busybox
       imagePullPolicy: Never
       args:
       - /bin/sh
       - -c
       - date;echo Hello from the Kubernetes cluster
     restartPolicy: OnFailure

2、创建并查看该CronJob

 创建完成后,查看CronJob列表

在LAST SCHEDULE列中,可以看到每隔一分钟被调度一次的状态

# kubectl get cronjobs
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        20s             4m53s

查看Jobs列表,可以看到每隔1分钟有一个新的Job被调度

# kubectl get jobs
NAME               COMPLETIONS   DURATION   AGE
hello-1576568160   1/1           1s         2m25s
hello-1576568220   1/1           2s         85s
hello-1576568280   1/1           2s         25s

查看Pod列表,可以看到每隔一分钟Job被调度产生一个新的Pod运行

# kubectl get pods
NAME                     READY   STATUS      RESTARTS   AGE
hello-1576568520-vl6h6   0/1     Completed   0          2m28s
hello-1576568580-755gb   0/1     Completed   0          87s
hello-1576568640-52j6b   0/1     Completed   0          27s

查看Pod输出日志,可以看到每个Pod确实是在一分钟的间隔内被相继运行

# kubectl logs hello-1576568580-755gb

Tue Dec 17 07:42:50 UTC 2019

Hello from the Kubernetes cluster

# kubectl logs hello-1576568640-52j6b

Tue Dec 17 07:43:50 UTC 2019

Hello from the Kubernetes cluster

3、删除该CronJob语法如下

# kubectl delete cronjob hello
cronjob.batch "hello" deleted

发布了27 篇原创文章 · 获赞 0 · 访问量 949

猜你喜欢

转载自blog.csdn.net/qq_38093301/article/details/103580789