咱们常常须要进行批量数据处理和分析,以及按照时间进行调度执行。能够在Kubenrtes中使用容器技术完成,使用Job和CronJob来执行。这样,能够维护较为干净的执行环境,减小不一样任务工具的相互干扰。同时能够在集群上按照任务要求和资源情况进行动态伸缩执行。html
参考:node
.spec.completions
标志Job结束须要成功运行的Pod个数,默认为1。.spec.parallelism
标志并行运行的Pod的个数,默认为1。spec.activeDeadlineSeconds
标志失败Pod的重试最大时间,超过这个时间不会继续重试。一个简单的例子:数据库
apiVersion: batch/v1beta1 kind: Job metadata: name: pi spec: template: metadata: name: pi spec: containers: - name: pi image: perl command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never
执行工做任务:json
$ kubectl create -f ./job.yaml job "pi" created $ pods=$(kubectl get pods --selector=job-name=pi --output=jsonpath={.items..metadata.name}) $ kubectl logs $pods 3.141592653589793238462643383279502...
Cron Job 管理基于时间的 Job,即:api
一个 CronJob 对象相似于 crontab (cron table)文件中的一行。并发
典型的用法以下所示:工具
注意:jsonp
.spec.schedule
:调度,必需字段,指定任务运行周期,格式同 Cron。spa
.spec.jobTemplate
:Job 模板,必需字段,指定须要运行的任务,格式同 Job。.net
.spec.startingDeadlineSeconds
:启动 Job 的期限(秒级别),该字段是可选的。
若是由于任何缘由而错过了被调度的时间,那么错过执行时间的 Job 将被认为是失败的。
若是没有指定,则没有期限。
.spec.concurrencyPolicy
:并发策略,该字段也是可选的。
它指定了如何处理被 Cron Job 建立的 Job 的并发执行。只容许指定下面策略中的一种。
Allow
(默认):容许并发运行 Job。
Forbid
:禁止并发运行,若是前一个尚未完成,则直接跳过下一个。Replace
:取消当前正在运行的 Job,用一个新的来替换。注意,当前策略只能应用于同一个 Cron Job 建立的 Job。若是存在多个 Cron Job,它们建立的 Job 之间老是容许并发运行。
.spec.suspend
:挂起,该字段也是可选的。
若是设置为 true
,后续全部执行都会被挂起。
它对已经开始执行的 Job 不起做用。默认值为 false
。
.spec.successfulJobsHistoryLimit
和 .spec.failedJobsHistoryLimit
:历史限制,是可选的字段。
它们指定了能够保留多少完成和失败的 Job。
默认没有限制,全部成功和失败的 Job 都会被保留。
当运行一个 Cron Job 时,Job 能够很快就堆积不少,推荐设置这两个字段的值。
设置限制的值为 0
,相关类型的 Job 完成后将不会被保留。
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
上面的描述文件指定每分钟执行一次,输出一条信息。
启动调度任务:
$ kubectl create -f cronjob.yaml cronjob "hello" created
固然,也能够用kubectl run
来建立一个CronJob:
kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
$ kubectl get cronjob NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE hello */1 * * * * False 0 <none> $ kubectl get jobs NAME DESIRED SUCCESSFUL AGE hello-1202039034 1 1 49s $ pods=$(kubectl get pods --selector=job-name=hello-1202039034 --output=jsonpath={.items..metadata.name} -a) $ kubectl logs $pods Mon Aug 29 21:34:09 UTC 2016 Hello from the Kubernetes cluster # 注意,删除cronjob的时候不会自动删除job,这些job能够用kubectl delete job来删除 $ kubectl delete cronjob hello cronjob "hello" deleted
Cron Job 在每次调度运行时间内“大概”会建立一个 Job 对象。咱们之因此说“大概” ,是由于在特定的环境下可能会建立两个 Job,或者一个 Job 都没建立。咱们尝试少发生这种状况,但却不能彻底避免。所以,建立 Job 操做应该是 幂等的。
Job 根据它所建立的 Pod 的并行度,负责重试建立 Pod,并就决定这一组 Pod 的成功或失败。Cron Job 根本就不会去检查 Pod。
一旦再也不须要 Cron Job,简单地可使用 kubectl
命令删除它:
$ kubectl delete cronjob hello cronjob "hello" deleted
这将会终止正在建立的 Job。然而,运行中的 Job 将不会被终止,不会删除 Job 或 它们的 Pod。为了清理那些 Job 和 Pod,须要列出该 Cron Job 建立的所有 Job,而后删除它们:
$ kubectl get jobs NAME DESIRED SUCCESSFUL AGE hello-1201907962 1 1 11m hello-1202039034 1 1 8m ... $ kubectl delete jobs hello-1201907962 hello-1202039034 ... job "hello-1201907962" deleted job "hello-1202039034" deleted ...
一旦 Job 被删除,由 Job 建立的 Pod 也会被删除。注意,全部由名称为“hello” 的 Cron Job 建立的 Job 会之前缀字符串 “hello-” 进行命名。若是想要删除当前 Namespace 中的全部 Job,能够经过命令 kubectl delete jobs --all
马上删除它们。