K8S 之 Job/CronJob

摘要

Job 介绍

  • Job 表示一次性任务,运行完成后就会停止。

  • Job 会创建一个或者多个 Pod,并将继续重试 Pod 的执行,直到指定数量的 Pod 成功终止。

  • 随着 Pod 成功结束,Job 跟踪记录成功完成的 Pod 个数。 当数量达到指定的成功个数阈值时,任务(即 Job)结束。

  • 删除 Job 的操作会清除所创建的全部 Pod。 挂起 Job 的操作会删除 Job 的所有活跃 Pod,直到 Job 被再次恢复执行。

Job 创建

  • yaml 文件: job.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: batch/v1                      # API 版本,这里使用 batch/v1,适用于 Job 资源
kind: Job # 资源类型,Job 用于一次性任务,完成后自动退出
metadata:
name: pi # Job 的名称,这里命名为 pi
spec:
ttlSecondsAfterFinished: 100 # Job 完成后,自动删除job的延迟时间,单位为秒。默认不删除
parallelism: 1 # Job 的并发数,默认为1,即一次只能启动一个 Pod
template: # Pod 模板,定义 Job 创建的 Pod 的规范
spec:
containers: # Pod 内的容器列表
- name: pi # 容器名称,用户自定义的名字
image: perl:5.34.0 # 使用的镜像,这里是 Perl 5.34.0 官方镜像
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] # 容器启动时执行的命令,计算并输出圆周率的 2000 位小数
restartPolicy: Never # 重启策略,设置为 Never,表示 Pod 失败时不会自动重启
backoffLimit: 4 # Job 重试次数上限,若失败超过 4 次,则不再重试,Job 状态将标记为 Failed。默认为 6
  • 启动Job

1
kubectl apply -f job.yaml
  • 查看 Job

1
2
3
4
# 查看 Job
kubectl get jobs
# 查看日志,此时会看到输出 圆周率值
kubectl logs jobs/pi
  • 删除 Job

1
2
3
4
kubectl delete jobs/pi

# yaml 删除
kubectl delete -f job.yaml

CronJob 介绍

  • CronJob 通过重复调度启动一次性的 Job。

  • CronJob 用于执行排期操作,例如备份、生成报告等。

  • 一个 CronJob 对象就像 Unix 系统上的 crontab(cron table)文件中的一行。 它用 Cron 格式进行编写, 并周期性地在给定的调度时间执行 Job。

CronJob 示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: batch/v1
kind: CronJob # 创建CronJob
metadata:
name: hello
spec:
schedule: "* * * * *" # 每分钟执行一次,不支持时区设置
successfulJobsHistoryLimit: 3 # 指定要保留多少成功完成的 Job。默认值为 3
failedJobsHistoryLimit: 1 # 指定要保留多少失败完成的 Job。默认值为 1
concurrencyPolicy: Allow # 默认值为 Allow:允许多个 Job 同时运行
# Forbid:不允许多个 Job 同时运行。如果新 Job 的执行时间到了而老 Job 没有执行完,CronJob 会忽略新 Job 的执行。 另请注意,当老 Job 执行完成时,仍然会考虑 .spec.startingDeadlineSeconds,可能会导致新的 Job 执行。
# Replace:如果新 Job 的执行时间到了而老 Job 没有执行完,CronJob 会用新 Job 替换当前正在运行的 Job。
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:1.28
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
  • .spec.schedule 字段是必需的。该字段的值遵循 Cron 语法:

1
2
3
4
5
6
7
8
9
10
11
# ┌───────────── 分钟 (0 - 59)
# │ ┌───────────── 小时 (0 - 23)
# │ │ ┌───────────── 月的某天 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 周的某天 (0 - 6)(周日到周六)
# │ │ │ │ │ 或者是 sun,mon,tue,web,thu,fri,sat
# │ │ │ │ │
# │ │ │ │ │
# * * * * *

# 时间表中的问号 (?) 和星号 * 含义相同,它们用来表示给定字段的任何可用值。
  • 除了标准语法,还可以使用一些类似 @monthly 的宏

输入 描述 等价 Cron 表达式
@yearly@annually 每年 1 月 1 日的午夜运行一次 0 0 1 1 *
@monthly 每月第一天的午夜运行一次 0 0 1 * *
@weekly 每周的周日午夜运行一次 0 0 * * 0
@daily@midnight 每天午夜运行一次 0 0 * * *
@hourly 每小时的开始运行一次 0 * * * *
  • 管理cronjob

1
2
3
4
5
6
7
# 创建cronjob
kubectl create -f cronjob.yaml
# 查看cronjob
kubectl get cronjob hello -o yaml
# 删除cronjob
kubectl delete cronjob hello
k delete -f cronjob.yaml

以下是 Kubernetes 中 Job 和 CronJob 的对比表

特性 Job CronJob
用途 一次性任务,完成即结束 定时周期性任务,按照时间计划定时运行
调度方式 手动创建或由控制器触发 按照 Cron 表达式自动周期性调度
常用场景 数据批处理、数据库迁移、一次性任务 每天备份、定时报告生成、周期性检查
配置关键字段 spec.template spec.schedule(Cron 表达式) + spec.jobTemplate
启动频率 创建后立刻启动一次 根据 schedule 定期启动
并发控制 不支持并发策略 支持 concurrencyPolicy(Allow、Forbid、Replace)
保留历史任务 无保留,任务完成后直接终结 可配置保留成功或失败任务数:successfulJobsHistoryLimitfailedJobsHistoryLimit
失败重试机制 支持 backoffLimitrestartPolicy 同样支持,作用于每次周期性运行产生的 Job 上