Job/CronJob

131 阅读4分钟

离线业务

Deployment,StatefulSet,DaemonSet他们编排的对象都是在线业务,比如nginx,mysql服务器这些,一旦运行起来基本都是一直运行直到宕机。

但是有一类作业是离线业务,这种业务再计算完成后直接退出。

如果此时依然用Deployment部署的话,这个pod会在计算结束后退出,然后被Deployment Controller不断地重启。

Job

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

Job特点如下

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

Job配置模板

apiVersion: batch/v1 # 版本号
kind: Job # 类型       
metadata: # 元数据
  name: # rs名称 
  namespace: # 所属命名空间 
  labels: #标签
    controller: job
spec: # 详情描述
  completions: 1 # 指定job需要成功运行Pods的次数。默认值: 1
  parallelism: 1 # 指定job在任一时刻应该并发运行Pods的数量。默认值: 1
  activeDeadlineSeconds: 30 # 指定job可运行的时间期限,超过时间还未结束,系统将会尝试进行终止。
  backoffLimit: 6 # 指定job失败后进行重试的次数。默认是6
  manualSelector: true # 是否可以使用selector选择器选择pod,默认是false
  selector: # 选择器,通过它指定该控制器管理哪些pod
    matchLabels:      # Labels匹配规则
      app: counter-pod
    matchExpressions: # Expressions匹配规则
      - {key: app, operator: In, values: [counter-pod]}
  template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
    metadata:
      labels:
        app: counter-pod
    spec:
      restartPolicy: Never # 重启策略只能设置为Never或者OnFailure
      containers:
      - name: counter
        image: busybox:1.30
        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,failed次数不变
  • Never,则job会在pod出现故障时创建新的pod,并且故障pod不会消失,也不会重启,failed次数加1
  • Always,一直重启,所以不能设置为Always

Job示例

apiVersion: batch/v1
kind: Job
metadata:
  name: count-job
spec:
  template:
    spec:
      containers:
      - name: count
        image: busybox
        command: ["bin/sh","-c","for i in 5 4 3 2 1; do echo $i;sleep 3;done"]
      restartPolicy: Never
  backoffLimit: 4
root@k8s-master:~# kubectl get job -o wide
NAME        COMPLETIONS   DURATION   AGE   CONTAINERS   IMAGES    SELECTOR
count-job   0/1           7s         7s    count        busybox   batch.kubernetes.io/controller-uid=2c6e143a-719b-4c83-8d1d-0245a2d766e8
kubectl get job -o wide 

在Job运行时,pod是Running状态,运行结束后,pod会进入Completed状态

root@k8s-master:~# kubectl get pod -o wide
NAME                                 READY   STATUS      RESTARTS   AGE     IP               NODE          NOMINATED NODE   READINESS GATES
count-job-x7vgw                      0/1     Completed   0          2m28s   10.244.126.26    k8s-worker2   <none>           <none>

可以通过kubectl logs查看pod的日志

root@k8s-master:~# kubectl logs count-job-x7vgw
5
4
3
2
1

CronJob

CronJob控制器以 Job控制器资源为其管控对象,并借助它管理pod资源对象,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。也就是说,CronJob可以在特定的时间点(反复的)去运行job任务。

image-20240116143429699

CronJob示例

设置每1分钟执行一次job,job的配置在spec.jobTemplate部分

command报错的话要加/bin/sh

apiVersion: batch/v1
kind: CronJob
metadata:
  name: count-cronjob
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    metadata:
    spec:
      template:
        spec:
          restartPolicy: Never
          containers:
          - name: counter
            image: busybox
            command: ["bin/sh","-c","for i in 1 2 3 4 5; do echo hello,$i;sleep 3;done"]

cron表达式说明

schedule: cron表达式,用于指定任务的执行时间
 */1    *      *    *     *
 <分钟> <小时> <> <月份> <星期>
  • 分钟,值从0到59
  • 小时,值从0到23
  • 日,值从1到31
  • 月,值从1到12
  • 星期,值从0到6, 0代表星期日
  • 多个时间可以用逗号隔开;范围可以用连字符给出;*可以作为通配符;/表示每...

concurrencyPolicy选项配置说明

concurrencyPolicy:
 Allow:   允许Jobs并发运行(默认)
 Forbid:  禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行
 Replace: 替换,取消当前正在运行的作业并用新作业替换它
root@k8s-master:~# kubectl get cronjobs
NAME            SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
count-cronjob   */1 * * * *   False     0        52s             77s

会发现每隔一分钟就创建一个pod来执行任务

root@k8s-master:~# kubectl get job -o wide
NAME                     COMPLETIONS   DURATION   AGE   CONTAINERS   IMAGES    SELECTOR
count-cronjob-28423131   1/1           19s        56s   counter      busybox   batch.kubernetes.io/controller-uid=f6ff56e2-e11a-420c-a8bc-9454da3f5305
root@k8s-master:~# kubectl get job -o wide
NAME                     COMPLETIONS   DURATION   AGE   CONTAINERS   IMAGES    SELECTOR
count-cronjob-28423131   1/1           19s        91s   counter      busybox   batch.kubernetes.io/controller-uid=f6ff56e2-e11a-420c-a8bc-9454da3f5305
count-cronjob-28423132   0/1           31s        31s   counter      busybox   batch.kubernetes.io/controller-uid=b469beaf-053f-4a69-b5b1-0d3146edd9ad