主讲内容:docker/kubernetes 云原生技术,大数据架构,分布式微服务,自动化测试、运维。
腾讯课堂:点击进入
网易课堂:点击进入
7月1号-7月29号 8折优惠!!!
7月1号-7月29号 8折优惠!!!
7月1号-7月29号 8折优惠!!!
全栈工程师开发手册 (作者:栾鹏)
架构系列文章
任务主要包含两种:
Job,执行一次任务
Job Spec格式
一个简单的例子:
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
注意,里面的template配置方法与Deployment配置参数是完全一样的,用于生成运行时的pod。可以在其中指定挂载卷、运行的命令等等。
执行job任务:
$ 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,即:
一个 CronJob 对象类似于 crontab (cron table)文件中的一行。它根据指定的预定计划周期性地运行一个 Job,格式可以参考 Cron 。
注意: 在预定计划中,问号(?)和星号(*)的意义是相同的,表示给定字段的取值是任意可用值。
注意: 在 Kubernetes 1.4 版本引入了 ScheduledJob 资源,但从 1.5 版本开始改成了 CronJob。
典型的用法如下所示:
当使用的 Kubernetes 集群,版本 >= 1.4(对 ScheduledJob),>= 1.5(对 CronJob),当启动 API Server(参考 为集群开启或关闭 API 版本 获取更多信息)时,通过传递选项 --runtime-config=batch/v2alpha1=true
可以开启 batch/v2alpha1 API。
apiVersion: batch/v1beta1 #batch/v2alpha1
kind: CronJob
metadata:
name: clean-job
namespace: cloudai-2
spec:
schedule: "*/1 * * * *" # 分钟,小时,日,月,星期
startingDeadlineSeconds: 300 # 300秒没有启动成功,就不再启动
concurrencyPolicy: Forbid #Allow 允许job并发执行,Forbid只允许当前这个执行,Replace取消当前这个,而执行新的
suspend: false # 设置为true,后续所有执行被挂起
jobTemplate:
spec:
# ttlSecondsAfterFinished: 100 # 任务完成后的10s之后自动删除pod,k8s 1.12以后才有
backoffLimit: 4 # 最大允许失败的次数
template:
spec:
restartPolicy: OnFailure
volumes:
- name: tz-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
- name: code-path
persistentVolumeClaim:
claimName: cloudai-code-pvc
- name: file-path
persistentVolumeClaim:
claimName: cloudai-file-pvc
containers:
- name: clean-job
image: luanpeng/lp:cloudai-cron-job
command: ['python','clean_job.py']
workingDir: /app/cronjob
volumeMounts:
- name: tz-config
mountPath: /etc/localtime
- name: code-path
mountPath: /app
- name: file-path
mountPath: /file
batch/v2alpha1 是当前 CronJob 的 apiVersion。
指明当前资源的类型为 CronJob。
schedule 指定什么时候运行 Job,其格式与 Linux cron 一致。这里 */1 * * * *
的含义是每一分钟启动一次。
jobTemplate 定义 Job 的模板,格式与前面 Job 一致。
.spec.schedule:调度,必需字段,指定任务运行周期,格式同 Cron。
.spec.jobTemplate:Job 模板,必需字段,指定需要运行的任务,格式同 Job。
.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 完成后将不会被保留。
然后就可以使用kubectl create -f CronJob.yaml
一个CronJob会定期启动一个job 来执行一个任务.
通过 kubectl get cronjob 查看 CronJob 的状态.
通过 kubectl get jobs 查看 Job 的执行情况.
执行 kubectl logs 可查看某个 Job 的运行日志.
实时跟踪jobs运行 kubectl get jobs --watch
注意:当前一个CronJob在执行期间“大约”创建一个Job,之所以说“大约”是因为在特殊的情况下可能会创建两个或没有Job被创建。Kubernetes官方正在试图使这种情况尽量少发生,但目前还不能保证完全杜绝。 因此如果我们现在使用它,那么Job应该被我们设计成幂等的。