尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

# Kubernetes(K8s)笔记Day13 :工作负载资源概述与 Job (CronJob)控制器

# Kubernetes(K8s)笔记Day13 :工作负载资源概述与 Job (CronJob)控制器 一、Kubernetes 工作负载资源概述Kubernetes 提供若干种内置的工作负载资源控制器用于管理不同场景下的 Pod工作负载资源适用场景核心特点Deployment无状态应用如 Web 服务、API 网关Pod 相互等价可随时替换支持滚动更新和回滚StatefulSet有状态应用如数据库、消息队列Pod 有固定身份和独立存储启停有序DaemonSet节点级支撑服务如日志采集、网络插件每个节点上运行且仅运行一个 Pod 副本Job一次性任务如数据迁移、批量计算Pod 运行完成后自动退出不再重启CronJob定时任务如定期备份、定时报表按照 Cron 表达式周期性地创建 Job核心概念工作负载资源本质上就是控制器Controller Pod 模板。控制器负责根据 Pod 模板创建和管理 Pod 的生命周期。二、Job一次性任务2.1 什么是 JobJob是 Kubernetes 中用于管理一次性任务的控制器。它创建一个或多个 Pod并确保指定数量的 Pod 成功完成执行。核心特点特点说明一次性执行Job 创建的 Pod 在任务完成后会退出状态变为Completed而不是像 Deployment 那样持续运行自动重启如果 Pod 失败或被删除Job 控制器会自动创建一个新的 Pod 继续执行直到任务成功完成适用场景批处理任务、数据迁移、报表生成、计算任务等只需要执行一次的场景Job 与普通 Pod 的区别对比维度普通 PodJob 管理的 Pod退出后行为退出后不再处理除非设置restartPolicy失败后会重试直到成功或达到重试上限管理方式独立存在需手动管理由 Job 控制器自动管理生命周期适用场景持续运行的服务执行完即结束的一次性任务2.2 Job 示例一简单的批处理任务下面是一个简单的 Job 示例它会在 Pod 中执行一条命令输出信息并等待 15 秒后退出。# job1.yamlapiVersion:batch/v1kind:Jobmetadata:name:process-itemlabels:jobgroup:jobexamplespec:template:metadata:name:jobexamplelabels:jobgroup:jobexamplespec:containers:-name:cimage:docker.io/library/busybox:1.28imagePullPolicy:IfNotPresentcommand:[sh,-c,echo Processing item sleep 15]restartPolicy:Never# ⚠️ Job 中不能使用 Always这个pod的作用是输出Processing item等待15秒之后自动退出参数解析字段说明apiVersion: batch/v1Job 资源所属的 API 组和版本kind: Job资源类型为 Jobmetadata.nameJob 的名称spec.templatePod 模板定义要运行的 Pod 规格spec.template.spec.containers容器定义指定镜像和要执行的命令spec.template.spec.restartPolicy重启策略Job 中必须设置为Never或OnFailure不能使用默认的AlwaysrestartPolicy在 Job 中的说明重启策略行为NeverPod 失败后Job 控制器会创建新的 Pod来重试OnFailurePod 失败后原地重启容器不创建新 PodAlwaysJob 中不可用会导致 Job 无法正常完成为什么这里没有标签选择器因为 Job 采用“命令式创建 属主引用”的强绑定方式控制器创建 Pod 后立即记录引用后续通过 ownerReferences 通过kubectl describe pod xxx 命令查看追踪 Pod 的生命周期操作命令# 创建 Job[roothd1 k8s]# kubectl apply -f job1.yaml# 查看 Job 状态[roothd1 k8s]# kubectl get jobNAME COMPLETIONS DURATION AGE process-item1/1 16s 20s# 查看 Pod任务完成后状态为 Completed[roothd1 k8s]# kubectl get pod | grep processprocess-item-9wq4m0/1 Completed020s# 查看 Pod 日志输出命令执行结果[roothd1 k8s]# kubectl logs process-item-9wq4mProcessing item#这个语法也有相同的效果只是用的是job的名称[roothd1 k8s]# kubectl logs job/process-itemProcessing item2.3 Job 示例二计算 π 到小数点后 2000 位这是一个稍微复杂的 Job 示例它使用 Perl 镜像计算 π 的值并打印结果。# job2.yamlapiVersion:batch/v1kind:Jobmetadata:name:pispec:template:spec:containers:-name:piimage:docker.io/library/perl:5.34.0imagePullPolicy:IfNotPresentcommand:[perl,-Mbignumbpi,-wle,print bpi(2000)]restartPolicy:NeverbackoffLimit:4新增参数解析字段说明backoffLimit: 4重试次数限制Pod 失败后最多重试 4 次。如果所有尝试都失败Job 状态变为Failed。默认值为 6操作命令# 创建 Job[roothd1 k8s]# kubectl apply -f job2.yaml# 查看 Job 控制器[roothd1 k8s]# kubectl get job piNAME COMPLETIONS DURATION AGE pi1/1 12s 30s# 查看 Job 的日志通过 job 名称直接查看[roothd1 k8s]# kubectl logs job/pi3.14159265358979323846264338327950288419716939937510...2.4 Job 的其他常用配置配置项说明示例completions指定需要成功完成的 Pod 数量并行场景completions: 5表示需要 5 个 Pod 成功完成parallelism指定同时运行的 Pod 数量上限parallelism: 2表示最多同时运行 2 个 PodactiveDeadlineSecondsJob 的最长运行时间超时则标记失败activeDeadlineSeconds: 300表示 5 分钟超时backoffLimit失败重试次数上限backoffLimit: 4三、CronJob定时任务3.1 什么是 CronJobCronJob是 Kubernetes 中用于管理定时任务的控制器。它根据指定的时间表Cron 表达式周期性地创建 Job类似于 Linux 系统中的crontab。核心特点特点说明周期性执行按照 Cron 表达式在指定的时间点自动创建 Job自动清理可以配置保留历史 Job 的数量自动清理旧的 Job适用场景定期备份、定时报表生成、数据清理、定时同步等3.2 Cron 表达式格式说明CronJob 使用标准的 Cron 表达式格式为分钟 小时 日 月 星期字段取值范围说明分钟0-59每小时的第几分钟小时0-23每天的第几小时日1-31每月的第几天月1-12每年的第几月星期0-60星期日每周的第几天常见 Cron 表达式示例表达式含义* * * * *每分钟执行一次0 * * * *每小时整点执行一次每小时的 0 分0 0 * * *每天午夜0:00执行一次0 2 * * *每天凌晨 2:00 执行一次0 0 * * 0每周日凌晨 0:00 执行一次0 0 1 * *每月 1 日凌晨 0:00 执行一次*/5 * * * *每 5 分钟执行一次0 9-17 * * *每天 9:00 到 17:00 之间每小时执行一次3.3 CronJob 示例每分钟打印时间下面是一个完整的 CronJob 示例它会在每分钟执行一次打印当前时间和问候信息。# cronjob.yamlapiVersion:batch/v1kind:CronJobmetadata:name:hellospec:schedule:* * * * *#调度时间表Cron 表达式指定何时触发任务jobTemplate:#Job 模板定义每次触发时创建的 Job 规格spec:#Job 的规格template:spec:containers:-name:helloimage:docker.io/library/busybox:1.28imagePullPolicy:IfNotPresentcommand:-/bin/sh--c-date; echo Hello from the Kubernetes clusterrestartPolicy:OnFailure可以观测到cronjob与job的语法基本一致只是包裹了一层调度时间表schedule并且将基本job的配置放到了jobTemplate下。CronJob 中restartPolicy的选择在 CronJob 的 Pod 模板中restartPolicy通常设置为OnFailure或Never。重启策略适用场景OnFailure推荐Pod 失败时原地重启能快速恢复适合大多数定时任务Never任务失败时重建新 Pod适合完全隔离的重试场景应用yaml# 创建 CronJob[roothd1 k8s]# kubectl apply -f cronjob.yamlcronjob.batch/hello created# 查看 CronJob[roothd1 k8s]# kubectl get cronjobNAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello * * * * * False044s 60s# 查看由 CronJob 创建的 Job[roothd1 k8s]# kubectl get jobNAME COMPLETIONS DURATION AGE hello-282290831/1 3s 90s hello-282290841/1 3s 30s# 查看 Pod[roothd1 k8s]# kubectl get pod | grep hellohello-28229083-2n6gz0/1 Completed090s hello-28229084-xkzsj0/1 Completed030s# 查看第一次执行的日志[roothd1 k8s]# kubectl logs hello-28229083-2n6gzSun Sep312:43:01 UTC2023Hello from the Kubernetes cluster# 查看第二次执行的日志[roothd1 k8s]# kubectl logs hello-28229084-xkzsjSun Sep312:44:01 UTC2023Hello from the Kubernetes cluster3.4 CronJob 的其他常用配置配置项说明示例startingDeadlineSeconds任务启动的截止时间秒。如果错过调度时间超过此值则跳过本次执行startingDeadlineSeconds: 60concurrencyPolicy并发策略-Allow默认允许并发执行-Forbid禁止并发如果上一次未完成则跳过本次-Replace替换取消上一次未完成的并启动新的concurrencyPolicy: ForbidsuccessfulJobsHistoryLimit保留的成功 Job 数量默认 3successfulJobsHistoryLimit: 3failedJobsHistoryLimit保留的失败 Job 数量默认 1failedJobsHistoryLimit: 1suspend是否暂停调度true暂停false正常运行suspend: true带完整配置的 CronJob 示例apiVersion:batch/v1kind:CronJobmetadata:name:hellospec:schedule:0 2 * * *startingDeadlineSeconds:60concurrencyPolicy:ForbidsuccessfulJobsHistoryLimit:5failedJobsHistoryLimit:2jobTemplate:spec:template:spec:containers:-name:helloimage:busybox:1.28command:[sh,-c,date; echo Hello]restartPolicy:OnFailure四、Job 与 CronJob 对比总结对比维度JobCronJob执行频率一次性执行周期性执行按 Cron 表达式适用场景批处理任务、数据迁移、一次性计算定期备份、定时报表、周期性清理是否持续运行❌ 执行完成后 Pod 退出Completed❌ 每次执行完成即退出但会定期创建新任务失败重试✅ 支持通过backoffLimit控制✅ 支持通过 Job 模板的backoffLimit控制并发控制通过parallelism和completions控制通过concurrencyPolicy控制历史保留❌ 不涉及✅ 支持保留成功/失败的历史 Job 数量暂停调度❌ 不涉及✅ 支持suspend: true错过调度处理❌ 不涉及✅ 支持startingDeadlineSeconds五、核心知识点速查5.1 Job 核心要点知识点说明restartPolicy限制Job 中不能使用Always只能使用Never或OnFailurebackoffLimit失败重试次数上限默认 6 次completions需要成功完成的 Pod 数量默认 1parallelism并行运行的 Pod 数量上限默认 1查看日志kubectl logs job/job-name可直接查看 Job 的日志删除 Job删除 Job 时会自动删除其创建的 Podkubectl delete job name5.2 CronJob 核心要点知识点说明时间表格式标准 Cron 表达式分钟 小时 日 月 星期Job 模板spec.jobTemplate.spec中定义 Job 规格与独立 Job 完全相同并发策略Allow默认、Forbid、Replace历史限制successfulJobsHistoryLimit默认 3和failedJobsHistoryLimit默认 1暂停调度suspend: true可暂停 CronJob 的调度5.3 常用命令速查# ---------- Job 相关 ----------# 创建 Jobkubectl apply-fjob.yaml# 查看 Jobkubectl get job kubectl get job-owide# 查看 Job 详情kubectl describe jobjob-name# 查看 Job 的日志kubectl logs job/job-name# 删除 Job同时删除关联的 Podkubectl delete jobjob-name# ---------- CronJob 相关 ----------# 创建 CronJobkubectl apply-fcronjob.yaml# 查看 CronJobkubectl get cronjob kubectl get cj# 查看 CronJob 详情kubectl describe cronjobcronjob-name# 查看 CronJob 创建的 Jobkubectl get job|grepcronjob-name# 删除 CronJob同时删除关联的 Job 和 Podkubectl delete cronjobcronjob-name# 暂停 CronJobkubectl patch cronjobcronjob-name-p{spec:{suspend:true}}# 恢复 CronJobkubectl patch cronjobcronjob-name-p{spec:{suspend:false}}5.4 Job 与 CronJob 创建的资源链┌─────────────────────────────────────────────────────────────────────────────┐ │ 资源创建链关系 │ ├─────────────────────────────────────────────────────────────────────────────┤ │ │ │ Deployment → ReplicaSet → Pod │ │ StatefulSet → Pod直接管理 │ │ DaemonSet → Pod直接管理 │ │ │ │ Job → Pod直接管理Pod 完成后进入 Completed │ │ CronJob → Job → Pod定期创建新的 Job │ │ │ └─────────────────────────────────────────────────────────────────────────────┘六、常见问题排查问题现象可能原因解决方法Job 一直卡在Running不结束容器内的进程没有退出或进入死循环检查命令是否正确确保命令执行完成后进程自然退出Job 显示Failed容器退出码非 0且重试次数已用完kubectl logs pod查看失败原因调整backoffLimit增加重试次数CronJob 没有按时执行时间表表达式写错或节点时间不同步检查 Cron 表达式格式确认节点系统时间是否正确CronJob 积累了过多的 Job未设置历史限制或限制值过大设置successfulJobsHistoryLimit和failedJobsHistoryLimit同一个 CronJob 的任务重叠执行并发策略为Allow默认将concurrencyPolicy改为Forbid或Replace七、总结资源类型一句话总结Job“一次性任务”只执行一次执行完 Pod 自动退出失败会自动重试CronJob“定时任务”根据 Cron 表达式周期性创建 Job适合定期执行的任务八、部分参数的补充说明1. 关于 CronJob 的时间表重要提示CronJob 的时间表是基于Kubernetes 控制平面所在的时区通常是 UTC 时间而非本地时区。如果需要在特定本地时间执行任务需要注意时区换算或使用CRON_TZ变量部分版本支持。2. 关于 Job 的completions和parallelism的补充原文未涉及这两个参数。补充说明如下spec:completions:5# 总共需要成功完成 5 个 Podparallelism:2# 最多同时运行 2 个 Pod工作流程Job 控制器首先启动 2 个 Pod受parallelism限制每完成一个 Pod就启动下一个直到累计完成 5 个 Pod受completions限制Job 标记为完成3. 关于 Job 的超时控制示例中未涉及activeDeadlineSeconds补充说明spec:activeDeadlineSeconds:300# Job 最长运行 300 秒5 分钟如果 Job 运行时间超过此值Job 会被标记为Failed即使重试次数未用完。超时控制常用于防止任务因异常而无限执行。
返回列表