K8S学习笔录 - 任务和定时任务

1,184 阅读4分钟

原文链接

利用集群来进行一些批处理任务。一般情况下可以并行或串行启动多个计算进程去处理一批工作项,处理完成后整个批处理任务结束

或者做成定时任务,定时去执行某些工作

这个看起来是不是很适合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