【原创】k8s之job和Cronjob
1、失败任务
apiVersion: batch/v1
kind: Job
metadata:
name: bad
spec:
template:
metadata:
name: bad
spec:
restartPolicy: Never
containers:
- name: box
image: busybox
command: ["/bin/sh", "-c", "exit 1"]
如果你尝试在你的cluster里面创建以上的Job,你可能会碰到如下的状态。
$ kubectl describe jobs
Name: bad
Namespace: default
Image(s): busybox
Selector: controller-uid=18a6678e-11d1-11e7-8169-525400c83acf
Parallelism: 1
Completions: 1
Start Time: Sat, 25 Mar 2017 20:05:41 -0700
Labels: controller-uid=18a6678e-11d1-11e7-8169-525400c83acf
job-name=bad
Pods Statuses: 1 Running / 0 Succeeded / 24 Failed
No volumes.
Events:
FirstSeen LastSeen Count From SubObjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
1m 1m 1 {job-controller } Normal SuccessfulCreate Created pod: bad-fws8g
1m 1m 1 {job-controller } Normal SuccessfulCreate Created pod: bad-321pk
1m 1m 1 {job-controller } Normal SuccessfulCreate Created pod: bad-2pxq1
1m 1m 1 {job-controller } Normal SuccessfulCreate Created pod: bad-kl2tj
1m 1m 1 {job-controller } Normal SuccessfulCreate Created pod: bad-wfw8q
1m 1m 1 {job-controller } Normal SuccessfulCreate Created pod: bad-lz0hq
1m 1m 1 {job-controller } Normal SuccessfulCreate Created pod: bad-0dck0
1m 1m 1 {job-controller } Normal SuccessfulCreate Created pod: bad-0lm8k
1m 1m 1 {job-controller } Normal SuccessfulCreate Created pod: bad-q6ctf
1m 1s 16 {job-controller } Normal SuccessfulCreate (events with common reason combined)
因为任务快速失败。Kubernetes认为任务没能成功启动,尝试创建新的容器以恢复这个失败,导致的Cluster会在短时间创建大量的容器,这样的结果可能会消耗大量的计算资源。
2、问题处理
apiVersion: batch/v1
kind: Job
metadata:
name: bad
spec:
# 指定失败时可以重试5次
backoffLimit: 5
# 指定存活时长
activeDeadlineSeconds: 100
template:
metadata:
name: bad
spec:
restartPolicy: Never
containers:
- name: box
image: busybox
command: ["/bin/sh", "-c", "exit 1"]
在Spec中使用.spec.activeDeadlineSeconds来避免这个问题。这个参数定了等待多长时间重试失败的Job。
其他的差不多,Job对象需要apiVersion
、kind
和metadata
字段,同样需要.spec
:
- Pod Template:
.spec.template
是.spec
必要的字段,是创建Pod的模板,和pod中的模式一样,除了它是嵌套的没有apiVersion
或kind
,此外还需要Pod的字段,Job中的pod template必须指定合适的标签和重启策略,RestartPolicy
只能设置为Never
或OnFailure
; - Pod Selector:
.spec.selector
是可选参数,一般不需要指定; - Parallel Jobs:主要有3种类型的task合适作为Job运行:
- 非并行Job(Non-parallel):正常只有一个Pod启动(除非Pod失败),一旦pod成功终止,Job就完成了;
- 固定计数的并行Job:为
.spec.completions
指定一个非0整数,一个Job代表多个task,在1到.spec.completions
范围内的每个值都有一个成功的pod时完成;
- 具有work queue的并行Job:不需要指定
.spec.completions
(默认为.spec.parallelism
),Pod之间自我协调或通过额外的Service决定在哪个Pod上运行,一个pod可以从work queue中获取一批最多n个元素。每个Pod能够独立决定是否完成了对等的任务,因此整个Job完成。当Job中的任意一个Pod完成task成功结束,将不会再创建新的Pod,当最后一个Pod结束时,就意味着所有的Pod都停止了,这时Job完成。
注:
- 对于
non-parallel
Job,可以不设置.spec.completions
和.spec.parallelism
参数(此时它们的默认值为1); - 对于
fixed completion count
Job,需要设置对应的.spec.completions
,此外也可以设置.spec.parallelism
(不设置默认为1); - 对于
work queue
Job,.spec.completions
参数不能设置,.spec.parallelism
对应设置为非负整数; .spec.parallelism
表示并行度(默认为1),当指定为0时,Job将停止直到这个数值增加,但实际的并行度可能会和请求的不一样。在固定计数的并行Job中,实际并行的Pod数量不会超过剩余数量,.spec.parallelism
将会被忽略;在work queue的并行Job中在Job完成后将不会在启动新的Pod,但允许剩余Pod执行完成;此外如果Controller创建Pod失败可能会导实际的Pod比请求的少。
【Pod和Container失败】
如果Pod失败了且.spec.template.spec.restartPolicy = "OnFailure"
,Pod将会残留在节点上,但container是会重新运行的,因此当本地重启可能需要解决这样的问题或者指定.spec.template.spec.restartPolicy = "Never"
。对于失败的策略,比如由于配置文件错误的原因在重试过指定次数后直接让整个Job失败,back-off限制值.spec.backoffLimit
默认为6,和Job相关的失败Pod会由Job Controller进行back-off(每次back-off的时间间隔会逐渐增大10s、20s、40s,封顶6min)。
【自动清理已完成的Job】
通常已完成的Job对象需要进行清理,否则会对API Server造成压力,如果Job是由更高级别的controller管理(比如CronJobs),那Job将会基于指定的容量清理策略被CronJobs清理
3、Cronjob
Cron Job是基于时间进行调度的,CronJob对象就像一行crontab文件,它会在给定的时间定期(以cron格式编写)地运行一个Job。一个Cron Job创建Job对象基于它的调度执行时间,当然也有可能0个或2个Job会被创建,这些目前都不是确定的,因此Job之间应该保证幂等性,startingDeadlineSeconds
设置为大一点的值或者不设置让其默认且concurrencyPolicy
设置为Allow
,Job应该至少运行一次。对于CronJob,CronJob Controller将会检查从上一次调度到现在将会错过多少调度,如果错过超过了100个,那它将不会再启动Job并记录错误:Cannot determine if job needs to be started. Too many missed start time (> 100). Set or decrease .spec.startingDeadlineSeconds or check clock skew.
。如果startingDeadlineSeconds
字段设置了但不是nil
,Controller从startingDeadlineSeconds
开始计算直到现在(即之前的时间内,并不是上次调度到现在)。比如,如果startingDeadlineSeconds
设置为200
,控制器将会计算在刚刚过去的200s中错失了多少Job。
CronJob是从它在调度时间内创建失败进行计算的,比如,concurrencyPolicy
设置为Forbid
,CronJob将会尝试调度,如果之前的调度仍在运行,那么它将被视为错过。
【原创】k8s之job和Cronjob的更多相关文章
- k8s 关于Job与Cronjob
在Kubernetes 中通过创建工作负载资源 Job 可完成大型计算以及一些批处理任务.比如 Job 转码文件.获取部分文件和目录,机器学习中的训练任务等.这篇小作文我们一起来了解 k8s 中关于 ...
- Kubernetes --(k8s)Job、CronJob
Job https://www.kubernetes.org.cn/job https://www.kubernetes.org.cn/cronjob Job负责批量处理短暂的一次性任务 (short ...
- k8s job的使用
1.运行一次性容器 容器按照持续运行的时间可分为两类: 服务类容器 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等. 工作类容器 工作类容器则是一次性任务,比 ...
- linux运维、架构之路-K8s应用
一.Deployment k8s通过各种Controller管理Pod的生命周期,为了满足不同的业务场景,k8s提供了Deployment.ReplicaSet.DaemonSet.S ...
- 15分钟在阿里云Kubernetes服务上快速建立Jenkins X Platform并运用GitOps管理应用发布
本文主要介绍如何在阿里云容器服务Kubernetes上快速安装部署Jenkins X Platform并结合demo实践演示GitOps的操作流程. 注意:本文中使用的jx工具.cloud-envir ...
- Kubernetes 实战-Operator Finalizers 实现
原文链接:https://zdyxry.github.io/2019/09/13/Kubernetes-%E5%AE%9E%E6%88%98-Operator-Finalizers/ Finalize ...
- 【原创】k8s源代码分析-----kubelet(1)主要流程
本人空间链接http://user.qzone.qq.com/29185807/blog/1460015727 源代码为k8s v1.1.1稳定版本号 kubelet代码比較复杂.主要是由于其担负的任 ...
- 【原创】k8s源代码分析-----kubelet(8)pod管理
本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1460540474 本文csdn博客链接:http://blog.csdn.net/screscent ...
- 【原创】k8s源代码分析-----EndpointController
转自本人空间 http://user.qzone.qq.com/29185807/blog/1459325937 一.controller manager创建endpointController 代码 ...
随机推荐
- dmp文件导入抽取方法
一.确认dmp文件.oracle客户端和服务端的字符集 (1)dmp文件字符集确认: 使用UE打开dmp文件查看文件第2个和第3个字节内容,这两个字节记录了dmp文件的字符集.如0354,然后用以下s ...
- 单片机—Arduino UNO-R3—学习笔记002
led控制 本篇主要介绍Arduino数字引脚及相关函数,通过数字I/O输出控制板载LED灯亮灭状态(数字引脚13). 数字信号是以0.1表示的电平不连续变化的信号,也就是以二进制的形式表示的信号. ...
- linux7下修改主机名的方式
在基于linux发行版的众多linux kernel 3.0以上,包括rhel7,centos7等提供多种修改linux主机名的方式 1.通过编辑/etc/hostname文件 2.命令hostnam ...
- 入门OJ:郭嘉的消息传递
题目描述 我们的郭嘉大大在曹操这过得逍遥自在,但是有一天曹操给了他一个任务,在建邺城内有N(<=1000)个袁绍的奸细 将他们从1到N进行编号,同时他们之间存在一种传递关系,即若C[i,j]=1 ...
- CSS3+JS完美实现放大镜模式
最近看到一篇讲放大镜的文章,实践后感觉效果非常好,这里分享给大家. 效果如下: 其实现核心: CSS函数,如:calc() -- 动态计算:var() -- 使用自定义变量 CSS伪元素:::befo ...
- 【pytest】(十二)参数化测试用例中的setup和teardown要怎么写?
还是一篇关于pytest的fixture在实际使用场景的分享. fixture我用来最多的就是写setup跟teardown了,那么现在有一个用例是测试一个列表接口,参数化了不同的状态值传参,来进行测 ...
- Cisco发现协议
CDP Cisco Discovery Protocol: 思科发现协议 是一个提供关于直接相连的交换机.路由器和其它Cisco设备的综合信息的专有工具 CDP 能够发现直接相邻的设备而不管这些设备所 ...
- 阿里云 CentOS7中搭建FTP服务器
1配置 vsftpd-3.0.2-27.el7.x86_64 阿里云 centos 7.0 2 ftp工作模式 2.1 ftp通道 ftp工作会启动两个通道: 控制通道,数据通道 在ftp协议中,控制 ...
- 无法获取 vmci 驱动程序版本: 句柄无效。 驱动程序 vmci.sys 版本不正确。请尝试重新安装 VMware Workstation。 打开模块DevicePowerOn电源失败。
1.别打开电源,然后到虚拟机安装文件夹内.2.找到你的虚拟机系统文件中后缀为vmx的文件,右击用记事本或者Notepad++打开.2.搜索找到vmci0.present='TRUE',字段,把true ...
- Golang拼接字符串的5种方法及其效率_Chrispink-CSDN博客_golang 字符串拼接效率 https://blog.csdn.net/m0_37422289/article/details/103362740
Different ways to concatenate two strings in Golang - GeeksforGeeks https://www.geeksforgeeks.org/di ...