当前位置: 首页 > news >正文

K8s学习笔记(九) job与cronjob - 教程

K8s学习笔记(九) job与cronjob - 教程

在 Kubernetes 中,JobCronJob 是专门用于处理 “任务型工作负载” 的资源对象:

  • Job 用于运行一次性任务(任务完成后自动结束,不会持续运行),比如数据备份、批量计算、初始化数据等。
  • CronJob定时任务的封装(基于时间调度的 Job),类似 Linux 的cron服务,用于周期性执行任务(如每天凌晨清理日志、每小时生成报表)。

1 Job:一次性任务的 “执行者”

Job 的核心目标是:确保任务 “成功完成”(即使节点故障,K8s 也会在其他节点重启任务)。任务完成后,Job 会保留历史 Pod(默认保留 1 个),方便查看执行结果。

1.1 Job 的核心属性(必懂)

定义 Job 时,需要明确 “任务如何执行”“执行多少次”“失败了怎么办”,关键属性如下:

属性名作用示例值
spec.template任务的 Pod 模板(核心!Job 通过创建 Pod 来执行任务,和普通 Pod 定义类似)包含containersimage
spec.completions任务需要 “成功完成” 的总次数(默认 1 次,适合批量任务)3(需成功执行 3 次)
spec.parallelism任务的 “并行度”(同时运行的 Pod 数量,默认 1)2(同时跑 2 个 Pod)
spec.restartPolicy容器失败后的重启策略(Job 只能用OnFailureNever,不能用AlwaysOnFailure(失败后重启容器)
spec.backoffLimit任务失败的 “重试上限”(超过次数则 Job 标记为 Failed,默认 6 次)4(最多重试 4 次)
spec.activeDeadlineSeconds任务的 “超时时间”(超过这个时间,无论是否完成都会终止,单位秒)300(5 分钟超时)

1.2 Job 示例:执行一次 “打印日期” 任务

创建一个简单的 Job,让 Pod 执行date命令(完成后自动退出),YAML 文件(job-demo.yaml):

apiVersion: batch/v1
kind: Job
metadata:
name: date-job  # Job名称
spec:
completions: 1  # 成功完成1次即可
parallelism: 1  # 同时运行1个Pod
backoffLimit: 4  # 最多重试4次
template:
spec:
containers:
- name: date-container
image: busybox:1.35  # 轻量Linux镜像
command: ["date"]  # 执行date命令(输出当前时间后退出)
restartPolicy: OnFailure  # 容器失败时重启(如命令执行出错)
操作与查看:
# 创建Job
kubectl apply -f job-demo.yaml
# 查看Job状态(STATUS为Completed表示成功)
kubectl get job date-job
# 输出示例:
# NAME        COMPLETIONS   DURATION   AGE
# date-job    1/1           3s         10s
# 查看Job创建的Pod(名称格式:Job名-随机字符串)
kubectl get pods --selector=job-name=date-job  # 用标签筛选Job关联的Pod
# 输出示例:
# NAME              READY   STATUS      RESTARTS   AGE
# date-job-8f2x9    0/1     Completed   0          15s
# 查看Pod的执行结果(即date命令的输出)
kubectl logs date-job-8f2x9
# 输出示例:
# Fri Oct  2 12:34:56 UTC 2025

1.3 Job 的生命周期(从创建到结束)

  1. 创建阶段:Job 被提交后,K8s 根据parallelism创建对应数量的 Pod。
  2. 执行阶段:
    • 若 Pod 成功退出(容器 exit code=0),则计数completions加 1;
    • 若 Pod 失败(exit code≠0),根据restartPolicy决定是否重启(OnFailure重启容器,Never重新创建 Pod),直到达到backoffLimitactiveDeadlineSeconds
  3. 结束阶段:当completions达到设定值,Job 状态变为Completed;若超过重试次数或超时,状态变为Failed

2 CronJob:定时任务的 “调度器”

CronJob 本质是 “Job 的调度器”—— 通过时间表达式(类似 Linux 的cron)定期创建 Job,从而实现周期性任务。比如 “每天凌晨 2 点执行数据库备份”“每小时清理临时文件”。

2.1 CronJob 的核心属性(必懂)

CronJob 在 Job 的基础上增加了 “时间调度” 和 “任务并发控制” 的属性,关键配置如下:

属性名作用示例值
spec.schedule定时调度表达式(核心!格式:分 时 日 月 周,和 Linux cron 一致)0 2 * * *(每天凌晨 2 点)
spec.jobTemplate要调度的 Job 模板(定义任务的具体内容,和 Job 的 spec 一致)包含completionstemplate
spec.concurrencyPolicy并发策略(当新任务触发时,旧任务未完成如何处理)Allow(允许并发,默认)、Forbid(禁止,跳过新任务)、Replace(替换,终止旧任务)
spec.startingDeadlineSeconds任务的 “启动截止时间”(若因各种原因未按时启动,超过此时长则视为失败)300(5 分钟内未启动则失败)
spec.successfulJobsHistoryLimit保留 “成功 Job” 的历史记录数量(默认 3 个,超过自动删除)5(保留 5 个成功记录)
spec.failedJobsHistoryLimit保留 “失败 Job” 的历史记录数量(默认 1 个)2(保留 2 个失败记录)
重点:schedule表达式格式(和 Linux cron 一致)

格式:分 时 日 月 周(5 个字段,空格分隔),支持通配符和特殊符号:

  • *:任意值(如* * * * *表示每分钟);
  • ,:枚举(如0 1,3 * * *表示每天 1 点和 3 点);
  • -:范围(如0 9-17 * * 1-5表示工作日 9 点到 17 点每小时 0 分);
  • /:步长(如*/10 * * * *表示每 10 分钟);
  • @yearly/@monthly/@daily/@hourly:快捷方式(如@daily等价于0 0 * * *)。

2.2 CronJob 示例:每分钟打印当前时间

创建一个 CronJob,每分钟执行一次date命令(通过 Job 实现),YAML 文件(cronjob-demo.yaml):

apiVersion: batch/v1
kind: CronJob
metadata:
name: date-cronjob  # CronJob名称
spec:
schedule: "*/1 * * * *"  # 每分钟执行一次
concurrencyPolicy: Allow  # 允许并发(前一个未结束也可启动新的)
startingDeadlineSeconds: 10  # 10秒内未启动则视为失败
successfulJobsHistoryLimit: 2  # 保留2个成功Job记录
failedJobsHistoryLimit: 1  # 保留1个失败Job记录
jobTemplate:  # 要调度的Job模板
spec:
completions: 1
parallelism: 1
backoffLimit: 2
template:
spec:
containers:
- name: date-container
image: busybox:1.35
command: ["date"]
restartPolicy: OnFailure
操作与查看:
# 创建CronJob
kubectl apply -f cronjob-demo.yaml
# 查看CronJob状态
kubectl get cronjob date-cronjob
# 输出示例:
# NAME            SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
# date-cronjob    */1 * * * *   False     0        20s             1m
# 查看CronJob创建的Job(每触发一次生成一个Job)
kubectl get jobs --selector=controller-uid=$(kubectl get cronjob date-cronjob -o jsonpath='{.metadata.uid}')
# 输出示例(每分钟一个Job):
# NAME                     COMPLETIONS   DURATION   AGE
# date-cronjob-28501560    1/1           2s         30s
# date-cronjob-28501561    1/1           2s         24s
# 查看最新Job的Pod日志(取最近的Job名称)
kubectl logs $(kubectl get pods --selector=job-name=date-cronjob-28501561 -o jsonpath='{.items[0].metadata.name}')
# 输出示例:
# Fri Oct  2 12:40:00 UTC 2025

2.3 CronJob 的生命周期(从调度到执行)

  1. 调度阶段:K8s 根据schedule表达式定期检查是否需要触发任务(默认每 10 秒检查一次)。
  2. 启动阶段:若到达调度时间,CronJob 会创建一个 Job;若因节点故障等原因未按时启动,超过startingDeadlineSeconds则本次调度失败。
  3. 执行阶段:新创建的 Job 按自身规则运行(同 Job 的生命周期),CronJob 会根据concurrencyPolicy处理并发任务。
  4. 清理阶段:当历史 Job 数量超过successfulJobsHistoryLimitfailedJobsHistoryLimit时,自动删除旧记录。

4 Job 与 CronJob 的核心区别

维度JobCronJob
任务类型一次性任务(执行一次就结束)定时任务(按时间周期重复执行)
触发方式手动创建后立即执行schedule表达式自动触发
核心配置completionsparallelismschedulejobTemplateconcurrencyPolicy
适用场景数据备份(一次性)、初始化脚本日志清理(每日)、报表生成(每小时)

5 常见问题与排错

  1. Job 一直处于 Active 状态,不结束
    • 原因:Pod 内的容器没有退出(比如命令是tail -f /dev/null这类阻塞进程),导致completions无法达到设定值。
    • 解决:检查容器命令是否会自动退出(exit code=0),或手动删除 Pod 强制结束(kubectl delete pod <pod-name>)。
  2. CronJob 到时间了但没创建 Job
    • 原因 1:schedule表达式错误(比如61 * * * *,分钟不能超过 60)。
    • 原因 2:startingDeadlineSeconds设置过小(比如调度检查延迟了 20 秒,但该值设为 10,导致视为失败)。
    • 排错:kubectl describe cronjob <cronjob-name>,查看Events字段(如 “Error creating job: schedule is invalid”)。
  3. CronJob 创建的 Job 太多,占用资源
    • 解决:减小successfulJobsHistoryLimitfailedJobsHistoryLimit(如设为 1),或定期清理旧 Job(kubectl delete jobs --field-selector status.successful=1)。
  4. Job 的 Pod 反复重启,但一直失败
    • 原因:容器命令执行失败(exit code≠0),且restartPolicy=OnFailure导致不断重启。
    • 解决:kubectl logs <pod-name>查看错误日志,修复命令;或调整backoffLimit限制重试次数。

6 总结

  • Job 是 “一次性任务” 的载体,核心是确保任务成功完成,适合临时执行的脚本、计算等。
  • CronJob 是 “定时任务” 的调度器,通过时间表达式周期性创建 Job,适合重复性任务。
  • 关键是理解:Job 的completions/parallelism控制任务执行次数和并行度;CronJob 的scheduleconcurrencyPolicy控制调度规则和并发行为。
http://www.hskmm.com/?act=detail&tid=33229

相关文章:

  • [HZOI]CSP-S模拟33
  • [PaperReading] VLM2Vec-V2: Advancing Multimodal Embedding for Videos, Images, and Visual Documents
  • ShandongCCPC2024
  • 标悬浮展开多级菜单
  • Nimble:让SwiftObjective-C测试变得更优雅的匹配库 - 指南
  • 2025.10.17总结 - A
  • Ubuntu创建python桌面图标
  • 深入解析Pure恶意软件家族:从RAT到构建器再到开发者
  • Ubuntu上配置Flask应用程序的Nginx和uWSGI
  • 实验一 现代c++基础课程
  • 平均融资利率求法及ORACLE语法解析
  • [Linux]如何列出被软链接的文件,列出被链接位置
  • 10.13课后作业
  • 【Linux】基础 I/O - 指南
  • 不情愿算法学概论
  • DIVCNT
  • 3. JVM 运行时数据区
  • 软工学习日志
  • Pixelium Design:Vue3 的像素风 UI 组件库
  • 修电脑不求人:AI智能修复电脑工具的体验分享
  • 效率与安全双升:AI许可证识别重塑医药行业合规流程
  • Spring BeanPostProcessor 前置处理 afterPropertiesSet BeanPostProcessor 后置处理区别
  • Xcode上编译调试ffmpeg - 详解
  • 最新版Origin 2025b安装包下载及详细安装教程,附永久免费中文汉化破解版Origin安装包
  • 第十七篇
  • 《程序员修炼之道》阅读笔记1
  • Unity3D中定义全局宏(不同于在unity设置中的)
  • AtCoder arc208 总结
  • OOP - 实验一
  • 题解:qoj8329 Excuse