job和cronjob的使用
job和cronjob的使用
我们在工作中会遇到需要批量处理数据和分析的需求,也会有按时间来进行调度的工作,在k8s集群中,有job和cronjob两中资源对象来映带我们的这种需要。
job负责处理任务,仅执行一次的任务,他保证批处理任务的一个或多个pod成功结束。而cronjob则就是在job上加上了时间调度,相当于定时任务。
Job
运行一个官方job示例,计算π到2000位,大约需要10秒钟:
apiVersion: batch/v1
kind: Jobs
metadata:
name: pi
spec:
template:
backoffLimit: 6 #默认重试6次后才认为执行失败
activeDeadlineSeconds: 100 #重试工作的持续时间,优先级别高于backoffLimit
spec:
restartPolicy: Never #job只有两种重启策略,Never、OnFailure不支持Always,失败状态会陷入失败死循环
containers:
- name: pi
image: perl
command:
- perl
- Mbignum=bpi
- wle
- print bpip(2000)
# 请注意,作业的.spec.activeDeadlineSeconds优先于.spec.backoffLimit。因此,重试一个或多个失败Pod的Job一旦达到所指定的时间限制activeDeadlineSeconds,就不会部署其他Pod ,即使backoffLimit尚未达到。
parallel(并行) Jobs
适应job运行的三种模式:
Non-parallel(非并行) Jobs
- 通常情况,除非pod发生故障,否则仅启动一个pod
- pod运行成功后,job成complate状态
固定parallel(并行)Jobs一个完成次数
.spec.completion指定一个非零的正值
job是整体任务,在1到范围内的每个值都有一个成功的Pod时完成 .spec.completions
具有工作队列的parallel(并行)Jobs
- 不指定 .spec.completions ,默认为 .spec.parallelism
- pod必须在彼此之间或外部服务之间进行协调,以确定每个pod应该如何处理。例如一个pod可以从工作队列中最多获取N批的批处理
- 每个pod都可以独立地确定其所有对等方是否都已完成,从而确定整个pod状态
- 当jobs中任何pod成功终止时,不会创建新的pod
- 所有pod成功终止,则jobs完成
- pod成功推出后,其他pod不应该为此任务再做任何工作或编写任何输出。他们都应该退出
对于非并行jobs,您可以同时保留.spec.completions和不.spec.parallelism设置。两者均未设置时,均默认为1。
对于固定的完成计数jobs,您应该设置.spec.completions为所需的完成数量。您可以设置.spec.parallelism,或不设置它,默认为1。
对于工作队列 Job,您必须保持未.spec.completions设置状态,并将其设置.spec.parallelism为非负整数。
有关如何利用不同类型的jobs的更多信息,请参见jobs模式部分。
处理Pod和容器故障
Pod中的容器可能由于多种原因而失败,例如,由于该容器中的进程以非零退出代码退出,或者该容器因超出内存限制而被杀死等。如果发生这种情况,请使用.spec.template.spec.restartPolicy = "OnFailure",然后Pod停留在节点上,但是容器重新运行。因此,您的程序需要在本地重新启动时处理该情况,或者指定.spec.template.spec.restartPolicy = "Never"。有关的更多信息,请参见pod生命周期restartPolicy。
Pod后退失败策略
在某些情况下,由于配置中的逻辑错误等原因,您需要在重试一定次数后使jobs失败。为此,设置.spec.backoffLimit为指定重试次数,然后再将jobs视为失败。默认情况下,将退避限制设置为6。与jobs相关联的失败Pod由Job控制器重新创建,并且其指数退避延迟(10s,20s,40s…)限制为六分钟。如果在jobs的下一个状态检查之前未出现新的失败Pod,则会重置退避计数。
注意:版本1.12之前的Kubernetes版本仍然存在问题#54870
注意:如果您的jobs具有
restartPolicy = "OnFailure",请记住,一旦达到jobs退避限制,运行该jobs的容器将被终止。这会使调试jobs的可执行文件更加困难。我们建议restartPolicy = "Never"在调试jobs或使用日志记录系统时进行设置 ,以确保不会因疏忽而丢失失败的jobs的输出。
请注意,作业的.spec.activeDeadlineSeconds优先于.spec.backoffLimit。因此,重试一个或多个失败Pod的Job一旦达到所指定的时间限制activeDeadlineSeconds,就不会部署其他Pod ,即使backoffLimit尚未达到。
CronJob
CronJob其实就是在Job的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性地在给定时间点运行。这个实际上和我们Linux中的crontab就非常类似了。
一个CronJob对象其实就对应中crontab文件中的一行,它根据配置的时间格式周期性地运行一个Job,格式和crontab也是一样的。
crontab的格式如下:
分 时 日 月 星期 要运行的命令 第1列分钟0~59 第2列小时0~23) 第3列日1~31 第4列月1~12 第5列星期0~7(0和7表示星期天) 第6列要运行的命令
现在,我们用CronJob来管理我们上面的Job任务,
apiVersion: batch/v2alpha1
kind: CronJob
metadata:
name: cronjob-demo
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: hello
image: busybox
args:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
我们这里的Kind是CronJob了,要注意的是.spec.schedule字段是必须填写的,用来指定任务运行的周期,格式就和crontab一样,另外一个字段是.spec.jobTemplate, 用来指定需要运行的任务,格式当然和Job是一致的。还有一些值得我们关注的字段.spec.successfulJobsHistoryLimit和.spec.failedJobsHistoryLimit,表示历史限制,是可选的字段。它们指定了可以保留多少完成和失败的Job,默认没有限制,所有成功和失败的Job都会被保留。然而,当运行一个Cron Job时,Job可以很快就堆积很多,所以一般推荐设置这两个字段的值。如果设置限制的值为 0,那么相关类型的Job完成后将不会被保留。
job和cronjob的使用的更多相关文章
- cronjob不跑得原因
能是环境的不同,能够在cronjob中加个env > /tmp/env.output查看 应用要同一时候输出标准错误合标准输出到一个文件能够&> /tmp/t
- Kubernetes — Job与CronJob
有一类作业显然不满足这样的条件,这就是“离线业务”,或者叫作 Batch Job(计算业务). 这 种业务在计算完成后就直接退出了,而此时如果你依然用 Deployment 来管理这种业务的话,就会 ...
- k8s cronjob设置作业失败后退出不重复执行
Optional parameters backoffLimit: Number of retries for pods launched by the job. If you want your p ...
- How to trigger a Kubernetes cronjob manually-手动触发一个cronjob
What should you do when you’ve developed and installed a cron job for your Kubernetes application, a ...
- 【读书笔记】Cronjob原理及源码分析
原文链接:https://mp.weixin.qq.com/s?__biz=MzI0NjI4MDg5MQ==&mid=2715291842&idx=1&sn=e605f9b40 ...
- Hybris CronJob.
一.概念 CronJobs提供了在特定的时间或者间隔内处理业务逻辑的方法.一般创建一个Cronjob有两种方式,第一种是定义Java类,由Hybris生成脚本并加入数据库.第二种是直接编写gr ...
- 使用k8s cronjob ,清除应用生成的日志文件
目前应用日志,tomcat日志 统一输出到 /data/logs/pod名字/ 目录下,并且/data/logs 目录挂载到cephfs上, tomcat 日志使用 cronolog进行日志切割 使用 ...
- linux下使用cronjob定时执行php脚本
在linux中输入命令 crontab -e 然后使用vim的命令编辑打开的文件,输入 * * * * /usr/bin/php -f /home/userxxx/update.php 保存,退出,好 ...
- kubernetes 学习 创建cronjob
POM.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
- kubernetes对象之cronjob
系列目录 类似于Linux的Cron模块,CronJob用来运行定时性任务,或者周期性.重复性任务.注意CronJob启动的是kubernetes中的Job,不是ReplicaSet.DaemonSe ...
随机推荐
- python初级(302) 6 对象(一)
作业: 1.编写一个Dog类,并生成对象dog,属性包含颜色,大小,重量,可以汪汪叫,摇尾巴,跑 # -*- coding: utf-8 -*- class Dog: def __init__(sel ...
- Hadoop深入学习之HA
1. 基本原理 2.x版本中,HDFS架构解决了单点故障问题,即引入双NameNode架构,同时借助共享存储系统来进行元数据的同步,共享存储系统类型一般有几类,如:Shared NAS+NFS.Boo ...
- EasyNVR网页摄像机无插件H5、谷歌Chrome直播方案-Onvif(一)使用Onvif协议进行设备发现以及指定设备信息探测
背景分析 众所周知,EasyNVR不拘泥.不受限于摄像机的品牌厂商及其配套平台,只要是网络监控摄像机IPC.硬盘录像机NVR.且设备支持标准的RTSP/Onvif协议,都可以接入实时视频流进入Easy ...
- element ui 下拉框绑定对象并且change传多个参数
废话不说直接上代码说明真相. <template> <div class="hello"> <span>可以设置的属性 value-key=&q ...
- 【bat】【windows】通过端口杀死进程
简单的bat处理,把指定端口集合杀死相应的进程,就是杀死对应的pid @echo off & setlocal EnableDelayedExpansion ]= ]= ]= ]= ]= fo ...
- python 判断一个对象是可迭代对象
那么,如何判断一个对象是可迭代对象呢?方法是通过collections模块的Iterable类型判断: >>> from collections import Iterable &g ...
- kafka安装linux版
安装实战 kafka安装包下载(注意:这里选择的安装包是2.11系列的1.1.0版本的) wget https://archive.apache.org/dist/kafka/1.1.0/kafka_ ...
- c++中共享内存原理及实现
共享内存 (也叫内存映射文件) 主要是通过映射机制实现的 , Windows 下进程的地址空间在逻辑上是相互隔离的 , 但在物理上却是重叠的 ; 所谓的重叠是指同一块内存区域可能被多个进程同时使用 , ...
- 【剑指offer】数组在排序数组中出现的次数
题目描述 统计一个数字在排序数组中出现的次数. 分析:数组有序,采用二分查找无疑 两种方法,时间复杂度差不多,都是利用二分查找,不过统计k出现的次数有所不同而已 方法1:二分查找k,找到任意一个k的下 ...
- 手撕面试官系列(三):微服务架构Dubbo+Spring Boot+Spring Cloud
文章首发于今日头条:https://www.toutiao.com/i6712696637623370248/ 直接进入主题 Dubbo (答案领取方式见侧边栏) Dubbo 中 中 zookeepe ...