zoukankan      html  css  js  c++  java
  • 【原创】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对象需要apiVersionkindmetadata字段,同样需要.spec

    1. Pod Template:.spec.template.spec必要的字段,是创建Pod的模板,和pod中的模式一样,除了它是嵌套的没有apiVersionkind,此外还需要Pod的字段,Job中的pod template必须指定合适的标签和重启策略,RestartPolicy只能设置为NeverOnFailure
    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将会尝试调度,如果之前的调度仍在运行,那么它将被视为错过。

  • 相关阅读:
    android如何与asp.net服务端共享session
    WCF 套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的
    PHP 实现单一入口 apache配置
    action func用法记记
    NETCore Bootstrap Admin 通用后台管理权限 [1]: 前后台分离系统简介
    开源 一套 Blazor Server 端精致套件
    NETCore Bootstrap Admin 通用后台管理权限 [3]: 精简版任务调度模块
    NETCore Bootstrap Admin 通用后台管理权限 [2]: Blazor 版本介绍
    C#服务器全面讲解与制作
    批量生成二维码
  • 原文地址:https://www.cnblogs.com/wangshuyang/p/12303515.html
Copyright © 2011-2022 走看看