一个不知努力的人 發表於 2019-6-10 08:23:00

kubernetes对象之cronjob

<blockquote>
<p>系列目录</p>
</blockquote>
<p>类似于Linux的Cron模块,CronJob用来运行定时性任务,或者周期性、重复性任务。注意CronJob启动的是kubernetes中的Job,不是ReplicaSet、DaemonSet等其它控制器类型。</p>
<h2 id="示例">示例:</h2>
<p>以下CronJob每分钟运行一次,打印出当前时间与hello消息。</p>
<ul>
<li>CronJob SPEC:</li>
</ul>
<pre><code class="language-yml">apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
    spec:
      template:
      spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
</code></pre>
<p>以上内容,schedule: "*/1 * * * *"与Linux Cron意义相同,表示每分钟启动一次。</p>
<ul>
<li>运行CronJob</li>
</ul>
<pre><code>$ kubectl create -f ./cronjob.yaml
cronjob "hello" created
</code></pre>
<p>或者通过祈使命令行方式:</p>
<pre><code>$ kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
cronjob "hello" created
</code></pre>
<p>查看CronJob状态:</p>
<pre><code>$ kubectl get cronjob hello
NAME      SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE
hello   */1 * * * *   False   0         &lt;none&gt;
</code></pre>
<ul>
<li>
<p>NAME:CronJob名称。</p>
</li>
<li>
<p>SCHEDULE:基于时间的调度规则。</p>
</li>
<li>
<p>SUSPEND:如果其值为True表示此CronJob暂时失效,不变成False之前不再创建新任务。对于已经创建的任务没有影响。</p>
</li>
<li>
<p>ACTIVE:表示当前活动的任务数,0表示当前没有活动任务。1表示有一个活动任务。此值可能大于1,原因如下:</p>
</li>
</ul>
<ol>
<li>任务允许重复启动,如前一次启动后还没有退出,下一次已经启动。</li>
<li>允许延后启动,当CronJob Controller发现因为某种原因错误启动,并且任务允许延后启动,则会启动任务。</li>
</ol>
<ul>
<li>LAST-SCHEDULE:表示最后一次调度时间,<none>表示未曾调度过任务。</none></li>
</ul>
<p>从CronJob状态可以看出,其输出中并没有相关字段指示其所创建的JOB是否运行成功,运行如上命令查看JOB的详细信息:</p>
<p>查看CronJob创建的Job:</p>
<pre><code>$ kubectl get jobs --watch
NAME               DESIRED   SUCCESSFUL   AGE
hello-4111706356   1         1         2s
</code></pre>
<ul>
<li>
<p>NAME:表示CronJob创建的Job名称,后边的数字由系统自动生成,保证不重复。</p>
</li>
<li>
<p>DESIRED:表示CronJob只创建的是最简单的一次Job,只创建一个pod。</p>
</li>
<li>
<p>SUCCESSFUL:表示pod成功个数。</p>
</li>
<li>
<p>AGE:表示上JOB生存时间。</p>
</li>
</ul>
<p>再次查看CronJob:</p>
<pre><code>$ kubectl get cronjob hello
NAME      SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE
hello   */1 * * * *   False   0         Mon, 29 Aug 2016 14:34:00 -0700
</code></pre>
<p>LAST-SCHEDULE表示最近一次调度时间,ACTIVE为0表示实例已经运行结束。</p>
<p>CronJob创建Job,Job创建pod,已经获知CronJob创建的Job名称:hello-4111706356,查看pod方法如下:</p>
<pre><code># Replace "hello-4111706356" with the job name in your system
$ pods=$(kubectl get pods --show-all --selector=job-name=hello-4111706356 --output=jsonpath={.items..metadata.name})

$ echo $pods
hello-4111706356-o9qcm

$ kubectl logs $pods
Mon Aug 29 21:34:09 UTC 2016
Hello from the Kubernetes cluster
</code></pre>
<p>删除CronJob:</p>
<pre><code>$ kubectl delete cronjob hello
cronjob "hello" deleted
</code></pre>
<p>删除CronJob会导致其创建的Job、pod一起被删除。</p>
<p>简单起见,以上示例控制CronJob行为的字段没有设置或者也可以说是采用了默认值,下面解释CronJob中的重要字段。</p>
<ul>
<li>
<p>.spec.startingDeadlineSeconds:单位是秒,表示如果Job因为某种原因无法按调度准时启动,在spec.startingDeadlineSeconds时间段之内,CronJob仍然试图重新启动Job,如果在.spec.startingDeadlineSeconds时间之内没有启动成功,则不再试图重新启动。如果spec.startingDeadlineSeconds的值没有设置,则没有按时启动的任务不会被尝试重新启动。spec.startingDeadlineSeconds同时也影响到CronJob计算任务损失率。如果指定,那么CronJob计算有多少Job没有按时启动时是从当前时间向后推spec.startingDeadlineSeconds秒数,如果没有指定,那么是从当前时间向后推到最后一次成功调度的时间。无论那种算法,如果损失的按时任务超过一定个数,那么CronJob会报错并停止运行。</p>
</li>
<li>
<p>.spec.concurrencyPolicy:是否允许Job并发,可能的聚会有3个。<br>
Allow:上一次Job没有完成,本次Job可以启动。<br>
Forbid:上一次Job没有完成,本次Job不可以启动。<br>
Replace:上一次Job没有完成,本次Job取而代之,将上一次Job杀死。</p>
</li>
<li>
<p>.spec.suspend:true或者false,表示是否临时阻塞CronJob。</p>
</li>
<li>
<p>.spec.successfulJobsHistoryLimit:保存成功历史Job的数量,默认3,如果为0则CronJob在Job成功后立即删除。</p>
</li>
<li>
<p>.spec.failedJobsHistoryLimit:保存失败历史Job的数量,默认1,如果为0则CronJob在Job失败后立即删除。</p>
</li>
</ul><br><br>
来源:https://www.cnblogs.com/tylerzhou/p/10995787.html
頁: [1]
查看完整版本: kubernetes对象之cronjob