利用集群来进行一些批处理任务。一般情况下可以并行或串行启动多个计算进程去处理一批工作项,处理完成后整个批处理任务结束
或者做成定时任务,定时去执行某些工作
这个看起来是不是很适合DaemonSet篇中的作业任务呢
Job
具体配置含义如下,也可以通过Job文档学习。
type Job struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
// Job的主要定义就在这里
Spec JobSpec `json:"spec,omitempty"`
// Job的各种状态,对于我们来讲是只读的
Status JobStatus `json:"status,omitempty"`
}
type JobSpec struct {
// 定义最多能运行的Pod数量,不能超过Completions的值
// 不管任何时间,Pod在运行状态中的数量都不会超过该数
// 默认为1
Parallelism *int32 `json:"parallelism,omitempty"`
// 可以代表Job成功的成功运行的Pod数量
// 不设置则代表任何Pod执行成功后都代表Job成功
// 设置为N,则Parallelism的的最大值为N,只要有N个Pod运行成功就代表这个Job执行成功
Completions *int32 `json:"completions,omitempty"`
// Pod的存活的最大时间,超过这个时间会立即被杀死,并杀死相关的容器
// 必须为正整数
ActiveDeadlineSeconds *int64 `json:"activeDeadlineSeconds,omitempty"`
// Job失败后重试次数,默认为6次
BackoffLimit *int32 `json:"backoffLimit,omitempty"`
// Label筛选器,通过Pod的Label匹配当前Pod的数量
// 一般情况系统会帮忙设置好这个
Selector *metav1.LabelSelector `json:"selector,omitempty"`
// 是否要手动控制Pod的labels和selectors的生成
// 不设置或者设置为false的时候,系统会为这个Pod生成一个唯一标签给Job和他的Pod模板
// 设置成true的话,一切都要手动来完成,除非有特殊需求并且明白怎么搞,否则不建议设置
ManualSelector *bool `json:"manualSelector,omitempty"`
// Pod定义
// 需要额外说明一下
// Job的Template中
// Pod的重启配置restartPolicy属性只能设置为Never或OnFailure
Template v1.PodTemplateSpec `json:"template"`
// 一个alpha等级的功能,如果使用需要配置开启
// 功能大概是在Job完成N秒以后删除Job
// 具体可以看网上的一些文档说明
TTLSecondsAfterFinished *int32 `json:"ttlSecondsAfterFinished,omitempty"`
}
CronJob
type CronJob struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
// CronJob定义
Spec CronJobSpec `json:"spec,omitempty"`
// CronJob的状态
Status CronJobStatus `json:"status,omitempty"`
}
type CronJobSpec struct {
// 执行周期, 详情https://zh.wikipedia.org/wiki/Cron
Schedule string `json:"schedule"`
// 等待调度的时间,如果到时间还未被调度,不管什么原因,都算任务失败
StartingDeadlineSeconds *int64 `json:"startingDeadlineSeconds,omitempty"`
// 对并发任务的处理方案,例如CronJob A,每分钟执行一次,但是执行时间超过了一分钟,则在第二次执行时间到达时的处理方案
// 值为Allow、Forbid、Replace
// Allow 允许多次任务同时进行
// Forbid 忽略第二次执行,需要等到第一次任务执行完成后才可以
// Replace 取消当前任务,第二次执行替代第一次执行
ConcurrencyPolicy ConcurrencyPolicy `json:"concurrencyPolicy,omitempty"`
// 是否暂停
// 在修改了此值之后,控制器会停止后续的任务执行,但是已经开始的任务不受影响
Suspend *bool `json:"suspend,omitempty"`
// Job模板
JobTemplate JobTemplateSpec `json:"jobTemplate"`
// 任务成功(失败)记录上限,默认值而为3
SuccessfulJobsHistoryLimit *int32 `json:"successfulJobsHistoryLimit,omitempty"`
FailedJobsHistoryLimit *int32 `json:"failedJobsHistoryLimit,omitempty"`
}
type ConcurrencyPolicy string
const (
AllowConcurrent ConcurrencyPolicy = "Allow"
ForbidConcurrent ConcurrencyPolicy = "Forbid"
ReplaceConcurrent ConcurrencyPolicy = "Replace"
)
type JobTemplateSpec struct {
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec batchv1.JobSpec `json:"spec,omitempty"`
}
Job简单示例
定义一个期望成功执行4次、同时只启动2个Pod来执行的任务配置。
apiVersion: batch/v1
kind: Job
metadata:
name: ab
labels:
app: ab
spec:
completions: 4
parallelism: 2
template:
metadata:
labels:
app: ab
spec:
restartPolicy: Never
containers:
- name: ab
image: jordi/ab
args:
- -n100
- -c10
- -k
- -r
- http://www.mi0ffice.cn/
运行状态和最终状态如下
$ kubectl describe job/ab
Name: ab
Namespace: default
Selector: controller-uid=ba5277a5-1f53-46dc-965a-7bb676d3201e
Labels: app=ab
Annotations: <none>
Parallelism: 2
Completions: 4
Start Time: Sun, 19 Jan 2020 19:06:20 +0800
Completed At: Sun, 19 Jan 2020 19:07:10 +0800
Duration: 50s
Pods Statuses: 0 Running / 4 Succeeded / 0 Failed
Pod Template:
Labels: app=ab
controller-uid=ba5277a5-1f53-46dc-965a-7bb676d3201e
job-name=ab
Containers:
ab:
Image: jordi/ab
Port: <none>
Host Port: <none>
Args:
-n100
-c10
-k
-r
http://www.mi0ffice.cn/
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 54s job-controller Created pod: ab-2mvhc
Normal SuccessfulCreate 54s job-controller Created pod: ab-hq64x
Normal SuccessfulCreate 32s job-controller Created pod: ab-cr7fz
Normal SuccessfulCreate 27s job-controller Created pod: ab-kc7q7
对于CronJob不在多说了,大家自己试一试就知道了。需要注意,CronJob的apiVersion为 batch/v1beta1