离线业务
Deployment,StatefulSet,DaemonSet他们编排的对象都是在线业务,比如nginx,mysql服务器这些,一旦运行起来基本都是一直运行直到宕机。
但是有一类作业是离线业务,这种业务再计算完成后直接退出。
如果此时依然用Deployment部署的话,这个pod会在计算结束后退出,然后被Deployment Controller不断地重启。
Job
Job主要用于负责批量处理(一次要处理指定数量任务)短暂的一次性(每个任务仅运行一次就结束)任务
Job特点如下
- 当Job创建的pod执行成功结束时,Job将记录成功结束的pod数量
- 当成功结束的pod达到指定的数量时,Job将完成执行
Job配置模板
apiVersion: batch/v1 # 版本号
kind: Job # 类型
metadata: # 元数据
name: # rs名称
namespace: # 所属命名空间
labels: #标签
controller: job
spec: # 详情描述
completions: 1 # 指定job需要成功运行Pods的次数。默认值: 1
parallelism: 1 # 指定job在任一时刻应该并发运行Pods的数量。默认值: 1
activeDeadlineSeconds: 30 # 指定job可运行的时间期限,超过时间还未结束,系统将会尝试进行终止。
backoffLimit: 6 # 指定job失败后进行重试的次数。默认是6
manualSelector: true # 是否可以使用selector选择器选择pod,默认是false
selector: # 选择器,通过它指定该控制器管理哪些pod
matchLabels: # Labels匹配规则
app: counter-pod
matchExpressions: # Expressions匹配规则
- {key: app, operator: In, values: [counter-pod]}
template: # 模板,当副本数量不足时,会根据下面的模板创建pod副本
metadata:
labels:
app: counter-pod
spec:
restartPolicy: Never # 重启策略只能设置为Never或者OnFailure
containers:
- name: counter
image: busybox:1.30
command: ["bin/sh","-c","for i in 9 8 7 6 5 4 3 2 1; do echo $i;sleep 2;done"]
重启策略说明
- OnFailure,job会在pod出现故障时重启容器,而不是创建pod,failed次数不变
- Never,则job会在pod出现故障时创建新的pod,并且故障pod不会消失,也不会重启,failed次数加1
- Always,一直重启,所以不能设置为Always
Job示例
apiVersion: batch/v1
kind: Job
metadata:
name: count-job
spec:
template:
spec:
containers:
- name: count
image: busybox
command: ["bin/sh","-c","for i in 5 4 3 2 1; do echo $i;sleep 3;done"]
restartPolicy: Never
backoffLimit: 4
root@k8s-master:~# kubectl get job -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
count-job 0/1 7s 7s count busybox batch.kubernetes.io/controller-uid=2c6e143a-719b-4c83-8d1d-0245a2d766e8
kubectl get job -o wide
在Job运行时,pod是Running状态,运行结束后,pod会进入Completed状态
root@k8s-master:~# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
count-job-x7vgw 0/1 Completed 0 2m28s 10.244.126.26 k8s-worker2 <none> <none>
可以通过kubectl logs查看pod的日志
root@k8s-master:~# kubectl logs count-job-x7vgw
5
4
3
2
1
CronJob
CronJob控制器以 Job控制器资源为其管控对象,并借助它管理pod资源对象,Job控制器定义的作业任务在其控制器资源创建之后便会立即执行,但CronJob可以以类似于Linux操作系统的周期性任务作业计划的方式控制其运行时间点及重复运行的方式。也就是说,CronJob可以在特定的时间点(反复的)去运行job任务。
CronJob示例
设置每1分钟执行一次job,job的配置在spec.jobTemplate部分
command报错的话要加/bin/sh
apiVersion: batch/v1
kind: CronJob
metadata:
name: count-cronjob
spec:
schedule: "*/1 * * * *"
jobTemplate:
metadata:
spec:
template:
spec:
restartPolicy: Never
containers:
- name: counter
image: busybox
command: ["bin/sh","-c","for i in 1 2 3 4 5; do echo hello,$i;sleep 3;done"]
cron表达式说明
schedule: cron表达式,用于指定任务的执行时间 */1 * * * * <分钟> <小时> <日> <月份> <星期>
- 分钟,值从0到59
- 小时,值从0到23
- 日,值从1到31
- 月,值从1到12
- 星期,值从0到6, 0代表星期日
- 多个时间可以用逗号隔开;范围可以用连字符给出;
*可以作为通配符;/表示每...
concurrencyPolicy选项配置说明concurrencyPolicy: Allow: 允许Jobs并发运行(默认) Forbid: 禁止并发运行,如果上一次运行尚未完成,则跳过下一次运行 Replace: 替换,取消当前正在运行的作业并用新作业替换它
root@k8s-master:~# kubectl get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
count-cronjob */1 * * * * False 0 52s 77s
会发现每隔一分钟就创建一个pod来执行任务
root@k8s-master:~# kubectl get job -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
count-cronjob-28423131 1/1 19s 56s counter busybox batch.kubernetes.io/controller-uid=f6ff56e2-e11a-420c-a8bc-9454da3f5305
root@k8s-master:~# kubectl get job -o wide
NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR
count-cronjob-28423131 1/1 19s 91s counter busybox batch.kubernetes.io/controller-uid=f6ff56e2-e11a-420c-a8bc-9454da3f5305
count-cronjob-28423132 0/1 31s 31s counter busybox batch.kubernetes.io/controller-uid=b469beaf-053f-4a69-b5b1-0d3146edd9ad