目录
一、业务背景
- 因为Kubernetes 相当于是云计算中的操作系统。对于一个复杂的分布式系统,如果我们直接基于 Pod 运行我们需要的服务,因为我们服务的类型与性质千奇百怪,我们还需要针对使用场景对 Pod 进行定制化的封装。
- 基于单一职责原则,Kubernetes 已经帮我们封装好了在离线任务场景下的 API 资源对象,这就是 Job 和 CronJob,他们又分别对应了临时任务和周期性任务这2种API 资源对象。
二、临时任务API资源对象——Job
2.1 创建 Job API 资源对象模版
下面使用命令创建一个叫test-job 的 job
:
kubectl create job test-job --image=busybox --dry-run=client -o yaml
然后在当前目录下会生成一个如下内容的 yaml 文件。
2.2 Job 资源对象定义
根据下面的yaml 文件的定义可以看到,Job 这种资源对象其实就是对 Pod 资源对象的封装。该Job任务就是使用 echo
命令打印出 2 个参数。
apiVersion: batch/v1 #注意Job类型资源的版本与其他 API 资源版本的区别
kind: Job
metadata:
name: test-job # 可添加自定义的标签
spec:
activeDeadlineSeconds: 20 # 运行Job类型任务的超时时间
backoffLimit: 4 # 失败最多重试的次数
completions: 2 # 完成该Job类型任务要运行多少个Pod,默认1个
parallelism: 2 # 运行多个pod时的并发度限制
template: # 注意 Job 资源对象是对 Pod 的定义在外面封装一层
spec:
restartPolicy: OnFailure # pod 的重启策略
containers: # 定义 pod 中的容器
- image: busybox
name: test-job
imagePullPolicy: IfNotPresent
command: ["/bin/echo"]
args: ["hello", "codeSlave"]
Job资源对象内的restartPolicy只允许被设置为Never
和OnFailure
。因为离线计算的Pod永远都不应该被重启,否则他们会再重新计算一遍。同理,Deployment资源对象的restartPolicy
只能被设置成Always
。
如果我们在定义Job资源对象的yaml文件中指定了restartPolicy=Never
,那么如果离线任务失败,该Job 资源对象会不断尝试去创建新的Pod。如果离线任务一直失败,创建新Pod 的次数也不是没有限制的,默认是6次,我们也可以通过spec.backoffLimit
字段来指定尝试创建新Pod 的次数。
还有一种Job 资源对象离线任务执行失败的情况,就是该离线任务一直在运行,迟迟没有完成,所管理的Pod一直没有进入Completed
状态。对于这种情况,我们可以通过spec.activeDeadlineSeconds
字段来指定离线任务的最长执行时间。一旦超过这个时间,该Job下所有的Pod会被终止。
2.3 运行、观察 Job
使用定义好的 yaml 文件运行Job:
kubectl apply -f job.yaml
查看Job、Job 资源对象下所属Pod运行状况,及临时任务的执行情况
kubectl get job
kubectl get pod
kubectl logs {pod_name} # 根据日志,查看任务的执行状况
三、定时任务API资源对象——CronJob
CronJob资源对象是在Job资源对象的基础上做了一层的封装。
3.1 创建 CronJob API 资源对象模版
使用如下命令创建一个 crobJob:
kubectl create cj test-cronJob --image=busybox --schedule="" --dry-run=client -o yaml
然后在当前目录下生成一个定义了cronJob 的资源对象的yaml 文件,具体内容如下。
3.2 CronJob API 资源对象定义
- 从该 CronJob 资源对象的定义可以看出,我们可以通过在
schedule
字段定义的cron
表达式确定定时任务执行的周期; CronJob
资源对象是在Job
资源对象的基础之上又做了一层封装;
apiVersion: batch/v1 # cronJob 资源对象的版本
kind: CronJob # 资源对象类型
metadata:
name: test-cronJob # 该CronJob名
spec:
schedule: '*/1 * * * *' # 该周期任务的 cron 表达式
jobTemplate: # 可以看出 cronJob 资源对象是在 Job 资源对象的基础之上又做了一层封装
spec:
activeDeadlineSeconds: 20 # 运行Job类型任务的超时时间
backoffLimit: 4 # 失败最多重试的次数
completions: 2 # 完成该Job类型任务要运行多少个Pod,默认1个
parallelism: 2 # 运行多个pod时的并发度限制
template:
spec:
restartPolicy: OnFailure
containers:
- image: busybox
name: test-cronJob
imagePullPolicy: IfNotPresent
command: ["/bin/echo"]
args: ["hello", "codeSlave"]
3.2 运行观察 CronJob
使用下面的命令运行上面定义好的 cronJob:
kubectl apply -f cron-job.yaml
使用下面的命令查看 cronJob 具体的运行状况:
kubectl get cj
kubectl get job
kubectl get pod -w # 查看pod状况,-w 选项可查看pod的实时状态
kubectl logs {pod_name} # 查看该pod运行任务的日志
kubectl describe {pod_name} # 查看pod运行的详细信息