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:

  1. Pod Template:.spec.template是.spec必要的字段,是创建Pod的模板,和pod中的模式一样,除了它是嵌套的没有apiVersion或kind,此外还需要Pod的字段,Job中的pod template必须指定合适的标签和重启策略,RestartPolicy只能设置为Never或OnFailure;
  2. Pod Selector:.spec.selector是可选参数,一般不需要指定;
  3. Parallel Jobs:主要有3种类型的task合适作为Job运行:
    1. 非并行Job(Non-parallel):正常只有一个Pod启动(除非Pod失败),一旦pod成功终止,Job就完成了;
    2. 固定计数的并行Job:为.spec.completions指定一个非0整数,一个Job代表多个task,在1到.spec.completions范围内的每个值都有一个成功的pod时完成;
  4. 具有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的更多相关文章

  1. k8s 关于Job与Cronjob

    在Kubernetes 中通过创建工作负载资源 Job 可完成大型计算以及一些批处理任务.比如 Job 转码文件.获取部分文件和目录,机器学习中的训练任务等.这篇小作文我们一起来了解 k8s 中关于 ...

  2. Kubernetes --(k8s)Job、CronJob

    Job https://www.kubernetes.org.cn/job https://www.kubernetes.org.cn/cronjob Job负责批量处理短暂的一次性任务 (short ...

  3. k8s job的使用

    1.运行一次性容器 容器按照持续运行的时间可分为两类: 服务类容器 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等. 工作类容器 工作类容器则是一次性任务,比 ...

  4. linux运维、架构之路-K8s应用

    一.Deployment         k8s通过各种Controller管理Pod的生命周期,为了满足不同的业务场景,k8s提供了Deployment.ReplicaSet.DaemonSet.S ...

  5. 15分钟在阿里云Kubernetes服务上快速建立Jenkins X Platform并运用GitOps管理应用发布

    本文主要介绍如何在阿里云容器服务Kubernetes上快速安装部署Jenkins X Platform并结合demo实践演示GitOps的操作流程. 注意:本文中使用的jx工具.cloud-envir ...

  6. Kubernetes 实战-Operator Finalizers 实现

    原文链接:https://zdyxry.github.io/2019/09/13/Kubernetes-%E5%AE%9E%E6%88%98-Operator-Finalizers/ Finalize ...

  7. 【原创】k8s源代码分析-----kubelet(1)主要流程

    本人空间链接http://user.qzone.qq.com/29185807/blog/1460015727 源代码为k8s v1.1.1稳定版本号 kubelet代码比較复杂.主要是由于其担负的任 ...

  8. 【原创】k8s源代码分析-----kubelet(8)pod管理

    本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1460540474 本文csdn博客链接:http://blog.csdn.net/screscent ...

  9. 【原创】k8s源代码分析-----EndpointController

    转自本人空间 http://user.qzone.qq.com/29185807/blog/1459325937 一.controller manager创建endpointController 代码 ...

随机推荐

  1. Java编译期注解处理器详细使用方法

    目录 Java编译期注解处理器 启用注解处理器 遍历语法树 语法树中的源节点 语法树节点的操作 给类增加注解 给类增加import语句 构建一个内部类 使用方法 chainDots方法 总结 Java ...

  2. 在Ubuntu18.04下编译出ffmpeg(支持推流H265成rtmp)

    Ubuntu18.04下编译libx264.libx265.libfdk_aac和ffmpeg 一.编译x264库 二.编译fdk-aac库 三.编译x265库 四.编译FFmpeg源码 五.设置环境 ...

  3. commons-lang3相关类实例

    一.ArrayUtils //1.判断两个数组长度是否相等 ArrayUtils.isSameLength(new int[] {1,2,3,4}, new int[] {1,2,3,4});//tr ...

  4. Centos7 虚拟机优化

    配置yum源 rm -f /etc/yum.repos.d/* curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/ ...

  5. pandas高级操作

    pandas高级操作 import numpy as np import pandas as pd from pandas import DataFrame,Series 替换操作 替换操作可以同步作 ...

  6. scrapy框架的中间件

    中间件的使用 作用:拦截所有的请求和响应 拦截请求:process_request拦截正常的请求,process_exception拦截异常的请求 篡改请求的头信息 def process_reque ...

  7. GlusterFS数据存储脑裂修复方案最全解析

    本文档介绍了glusterfs中可用于监视复制卷状态的heal info命令以及解决脑裂的方法 一. 概念解析 常见术语 名称 解释 Brick GlusterFS 的基本存储单元,由可信存储池中服务 ...

  8. Azure Terraform(七)利用Azure DevOps 实现自动化部署基础资源(补充)

    一,引言 之前一篇文章有讲解到利用 利用Azure DevOps 实现自动化部署基础资源,当时 TF 代码没有针对 Azure 各个资源的封装,所有的资源代码全部写在一个 main.tf 文件中.然后 ...

  9. [从源码学设计] Flume 之 memory channel

    [从源码学设计] Flume 之 memory channel 目录 [从源码学设计] Flume 之 memory channel 0x00 摘要 0x01 业务范畴 1.1 用途和特点 1.2 C ...

  10. vue初始化页面闪动问题

    使用vue开发时,在vue初始化之前,由于div是不归vue管的,所以我们写的代码在还没有解析的情况下会容易出现花屏现象,看到类似于{{message}}的字样,虽然一般情况下这个时间很短暂,但是我们 ...