kubernetes常用对象操作之 四.Job、CronJob
本文于2300天之前发表,文中内容可能已经过时。
接上文: kubernetes常用对象操作之 三.HPA自动扩缩容Pod
Job,我们在日常的工作中经常都会遇到一些需要进行批量数据处理和分析的需求,当然也会有按时间来进行调度的工作,在我们的Kubernetes
集群中为我们提供了Job
和CronJob
两种资源对象来应对我们的这种需求。
Job
负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod
成功结束CronJob
则就是在Job
上加上了时间调度。
Job
我们用Job
这个资源对象来创建一个任务,我们定一个Job
来执行一个倒计时的任务,定义YAML
文件:
1 | apiVersion: batch/v1 |
注意Job
的RestartPolicy
仅支持Never
和OnFailure
两种,不支持Always
,我们知道Job
就相当于来执行一个批处理任务,执行完就结束了,如果支持Always
的话是不是就陷入了死循环了?
然后来创建该Job
,保存为job-demo.yaml
:
1 | kubectl create -f job.yaml |
然后我们可以查看当前的Job
资源对象:
1 | kubectl get jobs |
注意查看我们的Pod
的状态,同样我们可以通过kubectl logs
来查看当前任务的执行结果。
1 | kubectl get pods |
CronJob
CronJob
其实就是在Job
的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性地在给定时间点运行。这个实际上和我们Linux
中的crontab
就非常类似了。
一个CronJob
对象其实就对应中crontab
文件中的一行,它根据配置的时间格式周期性地运行一个Job
,格式和crontab
也是一样的。
crontab
的格式如下:
分 时 日 月 星期 要运行的命令 第1列分钟0~59 第2列小时0~23) 第3列日1~31 第4列月1~12 第5列星期0~7(0和7表示星期天) 第6列要运行的命令
现在,我们用CronJob
来管理我们上面的Job
任务,
1 | apiVersion: batch/v2alpha1 |
我们这里的Kind
是CronJob
了,要注意的是.spec.schedule
字段是必须填写的,用来指定任务运行的周期,格式就和crontab
一样,另外一个字段是.spec.jobTemplate
, 用来指定需要运行的任务,格式当然和Job
是一致的。还有一些值得我们关注的字段.spec.successfulJobsHistoryLimit
和.spec.failedJobsHistoryLimit
,表示历史限制,是可选的字段。它们指定了可以保留多少完成和失败的Job
,默认没有限制,所有成功和失败的Job
都会被保留。然而,当运行一个Cron Job
时,Job
可以很快就堆积很多,所以一般推荐设置这两个字段的值。如果设置限制的值为 0,那么相关类型的Job
完成后将不会被保留。
接下来我们来创建这个cronjob
1 | kubectl create -f cronjob-demo.yaml |
当然,也可以用kubectl run
来创建一个CronJob
:
1 | kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster" |
一旦不再需要 Cron Job,简单地可以使用 kubectl 命令删除它:
1 | kubectl delete cronjob hello |
这将会终止正在创建的 Job 也会把当前 Cron Job 下面的 Job 清空。然而,运行中的 Job 将不会被终止,不会删除 Job 或 它们的 Pod。
一旦 Job 被删除,由 Job 创建的 Pod 也会被删除。