# Kubernetes的Jobs和CronJobs的使用

# 1 前言

有时项目需要启动仅执行一次的任务,而不是像Web应用一样长期运行。Kubernetes Jobs负责处理任务,保证任务的成功执行,能定义执行次数和并行数等。而CronJobs则加上时间调度,可定时执行。

# 2 Jobs

# 2.1 简单示例

直接上示例:

apiVersion: batch/v1
kind: Job
metadata:
  name: pkslow-job
spec:
  template:
    spec:
      containers:
        - name: busybox
          image: busybox
          command: ['echo', 'www.pkslow.com']
      restartPolicy: Never

上面的功能是打印一行字符串。restartPolicy可以设置为OnFailureNever,不能设置为Always

The Job "pkslow-job" is invalid: spec.template.spec.restartPolicy: Unsupported value: "Always": supported values: "OnFailure", "Never"

执行如下:

$ kubectl apply -f job.yaml 
job.batch/pkslow-job created

$ kubectl get job
NAME         COMPLETIONS   DURATION   AGE
pkslow-job   0/1           8s         8s

# 2.2 设置其它参数

参数spec.completions表示所需要的完成个数,只有完成这么多个才能算整个Job完成。

参数spec.parallelism表示几个Pod并行执行。

添加这两个参数如下:

apiVersion: batch/v1
kind: Job
metadata:
  name: pkslow-job
spec:
  template:
    spec:
      containers:
        - name: busybox
          image: busybox
          command: ['echo', 'www.pkslow.com']
      restartPolicy: Never
  completions: 6
  parallelism: 2

直接更新是不行的,对于同一个Job,这是不可变参数:

$ kubectl apply -f job.yaml 
The Job "pkslow-job" is invalid: spec.completions: Invalid value: 2: field is immutable

先删掉再执行就可以了。

$ kubectl delete -f job.yaml 
job.batch "pkslow-job" deleted

$ kubectl apply -f job.yaml 
job.batch/pkslow-job created

可以看到,会有两个Pod同时运行,最终如果6个都完成,才表示整个Job完成。

更多参数请参考文档:Kubernetes Job (opens new window)

# 3 CronJobs

定时的CronJobs就是在Jobs的基础加上Cron 表达式,示例如下:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: pkslow-cronjob
spec:
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: busybox
              image: busybox
              command: ['echo', 'www.pkslow.com']
          restartPolicy: Never
  schedule: "*/1 * * * *"
  successfulJobsHistoryLimit: 10
  failedJobsHistoryLimit: 5

scheduleCron 表达式

successfulJobsHistoryLimitfailedJobsHistoryLimit设置记录成功或失败任务的个数。

这个会每分钟执行一次,如下:

更多请参考官方文档:https://kubernetes.io/zh/docs/concepts/workloads/controllers/cron-jobs/

# 4 总结

本文主要是简单介绍,提供个yaml模板。


参考资料:

详解 Kubernetes Job 和 CronJob 的实现原理 (opens new window)

Kubernetes: Job 和 CronJob 的实现原理 (opens new window)

上次更新: 2023/8/18 23:39:36