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

Kubernetes任务调度:深入理解Job与CronJob

#作者:程宏斌

文章目录

  • Job资源对象
  • 概念
  • kubernetes支持以下几种job
  • 例子
  • 提高Job的执行效率
  • 总结

Job资源对象

服务类的Pod容器:RC、RS、DS、Deployment
工作类的Pod容器:Job—>执行一次,或者批量执行处理程序,完成之后退出容器。
注意: 如果容器内执行任务有误,会根据容器的重启策略操作容器,不过这里
的容器重启策略只能是: Never和 OnFailure。

概念

在有些场景下,是想要运行一些容器执行某种特定的任务,任务一旦执行完成,容器也就没有存在的必要了。在这种场景下,创建pod就显得不那么合适。于是就是了Job,Job指的就是那些一次性任务。通过Job运行一个容器,当其任务执行完以后,就自动退出,集群也不再重新将其唤醒。

从程序的运行形态上来区分,可以将Pod分为两类:长时运行服务(jboss、mysql等)和一次性任务(数据计算、测试)。RC创建的Pod都是长时运行的服务,Job多用于执行一次性任务、批处理工作等,执行完成后便会停止(status.phase变为Succeeded)。

kubernetes支持以下几种job

  • 非并行job:通常创建一个pod直至其成功结束。
  • 固定结束次数的job:设置spec.completions,创建多个pod,直到.spec.completions个pod成功结束。
  • 带有工作队列的并行job:设置.spec.Parallelism但不设置.spec.completions,当所有pod结束并且至少一个成功时,job就认为是成功。
    Job Controller
    Job Controller负责根据Job Spec创建pod,并持续监控pod的状态,直至其成功结束,如果失败,则根据restartPolicy(只支持OnFailure和Never,不支持Always)决定是否创建新的pod再次重试任务。

例子

(1)编写一个job的yaml文件

[root@master yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:name: test-job
spec:template:metadata:name: test-jobspec:containers:- name: helloimage: busyboxcommand: ["echo","hello k8s job!"]restartPolicy: Never

(2)执行

[root@master yaml]# kubectl apply -f jop.yaml

(3)查看

[root@master yaml]# kubectl get pod

查看日志

[root@master yaml]# kubectl logs test-job-gs45w

我们可以看到job与其他资源对象不同,仅执行一次性任务,默认pod借宿运行后job即结束,状态为Completed。

(4)修改一下jop的yaml文件,把echo命令换成乱码

[root@master yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:name: test-job
spec:template:metadata:name: test-jobspec:containers:- name: helloimage: busyboxcommand: ["asdasxsddwefew","hello k8s job!"] #修改restartPolicy: Never

(5)先删除之前的pod

[root@master yaml]# kubectl delete jobs.batch test-job

(6)执行

[root@master yaml]# kubectl apply -f jop.yaml

(7)查看

[root@master yaml]# kubectl get pod -w

在这里插入图片描述
它会一直创建pod直到完成命令。

(8)修改一下jop的yaml文件,修改重启策略

[root@master yaml]# vim jop.yaml 
kind: Job
apiVersion: batch/v1
metadata:name: test-job
spec:template:metadata:name: test-jobspec:containers:- name: helloimage: busyboxcommand: ["asdasxsddwefew","hello k8s job!"]restartPolicy: OnFailure

(9)先删除之前的pod

[root@master yaml]# kubectl delete jobs.batch test-job

(10)执行

[root@master yaml]# kubectl apply -f jop.yaml

(11)查看

[root@master yaml]# kubectl get pod -w

在这里插入图片描述
它会一直重启pod完成命令,直到重启到一定次数就会删除job。

提高Job的执行效率

  1. 我们可以在Job.spec字段下加上parallelism选项。表示同时运行多少个Pod执行任务。
[root@master yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:name: test-job
spec:parallelism: 2    #同时启用几个podtemplate:metadata:name: test-jobspec:containers:- name: helloimage: busyboxcommand: ["echo","hello k8s job!"]restartPolicy: OnFailure
  1. 我们可以在Job.spec字段下加上complations选项。表示总共需要完成Pod的数量
[root@master yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:name: test-job
spec:complations: 8            #运行pod的总数量8个parallelism: 2            #同时运行2个podtemplate:metadata:name: test-jobspec:containers:- name: helloimage: busyboxcommand: ["echo","hello k8s job!"]restartPolicy: OnFailure

job 字段解释:
标志Job结束需要成功运行的Pod个数,默认为1
parallelism:标志并行运行的Pod的个数,默认为1
activeDeadlineSeconds:标志失败Pod的重试最大时间,超过这个时间不会继续重试

  1. 如何定时执行Job
[root@master yaml]# vim cronjop.yaml
kind: CronJob
apiVersion: batch/v1beta1
metadata:name: hello
spec:schedule: "*/1 * * * *" #限定时间jobTemplate:spec:template:spec:containers:- name: helloimage: busyboxcommand: ["echo","hello","cronjob"]restartPolicy: OnFailure

总结

Job 作为 Kubernetes 中用于处理任务的资源,与其他的资源没有太多的区别,它也使用 Kubernetes 中常见的控制器模式,监听 Informer 中的事件并运行 syncHandler 同步任务
而 CronJob 由于其功能的特殊性,每隔 10s 会从 apiserver 中取出资源并进行检查是否应该触发调度创建新的资源,需要注意的是 CronJob 并不能保证在准确的目标时间执行,执行会有一定程度的滞后。
两个控制器的实现都比较清晰,只是边界条件比较多,分析其实现原理时一定要多注意。

http://www.xdnf.cn/news/12478.html

相关文章:

  • Linux 常用命令与 Shell 简介
  • chatshare.xyz注册登录后,提示过期的解决方式!
  • Day130 | 灵神 | 回溯算法 | 子集型 电话号码的字母组合
  • 【DAY40】训练和测试的规范写法
  • OpenWRT prplOS-- ubus命令配置参数
  • sanitizer工具
  • 基于Pandas数据分析的设备巡检计划生成算法设计及实现
  • 设置Linux时区环境变量TZ
  • Java常用工具类方法详解及使用案例
  • 【大模型:知识库管理】--开源工具Ragflow介绍+本地搭建
  • 美化显示LLDB调试的数据结构
  • c#基础010(程序结构)
  • Spring Boot论文翻译防丢失 From船长cap
  • 搜广推特征数据变更灰度为什么实现很困难
  • float、double 这类 浮点数 相比,DECIMAL 是另一种完全不同的数值类型
  • 【地图 - 问题】公司etm地图:聚合功能重复添加,导致图标重复添加,导致部分重复添加的图标无法清除
  • 计算机组成原理(计算篇)
  • AIGC赋能前端开发
  • 多进程与多线程:核心差异与实战选择
  • AIGC-SD3、控制
  • 在亚马逊选品时,可依托数据驱动的关键词分析体系
  • vue2.0高频面试题汇总--持续更新
  • 基于STM32的DS18B20温度远程监测LCD1602显示
  • Vue3.5 企业级管理系统实战(二十三):权限指令
  • 【快速预览经典深度学习模型:CNN、RNN、LSTM、Transformer、ViT全解析!】
  • 根据指定日期和cron表达式生成下一周期的执行时间
  • C++类二
  • 吞咽与营养并重:进行性核上性麻痹患者的饮食管理方案
  • 龙虎榜——20250605
  • ubuntu安装NVIDIA驱动没有网络