
# 使用Job和CronJob创建任务负载
任务负载是负责批量处理短暂的一次性任务(short lived one-off tasks)，即仅执行一次的任务，它保证批处理任务的一个或多个 Pod 成功结束。
- 短时任务（Job）：是Kubernetes用来控制批处理型任务的资源对象。批处理业务与长期伺服业务（Deployment、Statefulset）的主要区别是批处理业务的运行有头有尾，而长期伺服业务在用户不停止的情况下永远运行。Job管理的Pod根据用户的设置把任务成功完成就自动退出（Pod自动删除）。
- 定时任务（CronJob）：是基于时间的Job，就类似于Linux系统的crontab文件中的一行，在指定的时间周期运行指定的Job。
任务负载的这种用完即停止的特性特别适合一次性任务，比如持续集成，配合云容器实例按秒计费，真正意义上做到按需使用。
#### 约束与限制
Kubernetes 仅在 Pod 状态为"终止"（Terminated）时，才会删除基于FlexVolume配置创建的EVS卷。当 Pod 状态为"完成"（Completed）时，基于FlexVolume配置创建的EVS卷将不会被自动删除。
#### 创建Job
以下是一个Job配置，其计算π到2000位并打印输出。Job结束需要运行50个Pod，这个示例中就是打印π 50次，并行运行5个Pod，Pod如果失败最多重试5次。
```
apiVersion: batch/v1
kind: Job
metadata:
  name: pi-with-timeout
  namespace: cci-namespace-test1
spec:
  completions: 50            # 运行的次数，即Job结束需要成功运行的Pod个数
  parallelism: 5             # 并行运行Pod的数量，默认为1
  backoffLimit: 5            # 表示失败Pod的重试最大次数，超过这个次数不会继续重试。
  activeDeadlineSeconds: 10  # 表示Pod超期时间，一旦达到这个时间，Job及其所有的Pod都会停止。
  template:                  # Pod定义
    spec: 
      containers:
      - name: pi
        image: perl
        command:
        - perl
        - "-Mbignum=bpi"
        - "-wle"
        - print bpi(2000)
      restartPolicy: Never
```
根据completions和parallelism的设置，可以将Job划分为以下几种类型。
表1任务类型 
| Job类型        | 说明                            | 使用示例          |
|:---|:---|:---|
| 一次性Job       | 创建一个Pod直至其成功结束                | 数据库迁移         |
| 固定结束次数的Job   | 依次创建一个Pod运行直至completions个成功结束 | 处理工作队列的Pod    |
| 固定结束次数的并行Job | 依次创建多个Pod运行直至completions个成功结束 | 多个Pod同时处理工作队列 |
| 并行Job        | 创建一个或多个Pod直至有一个成功结束           | 多个Pod同时处理工作队列 |
   
#### 创建CronJob
相比Job，CronJob就是一个加了定时的Job，CronJob执行时是在指定的时间创建出Job，然后由Job创建出Pod。
```
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob-example
  namespace: cci-namespace-test1
spec:
  schedule: "0,15,30,45 * * * *"           # 定时相关配置
  jobTemplate:                             # Job的定义
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - name: main
            image: pi
```
cron的格式从前到后就是：
- Minute
- Hour
- Day of month
- Month
- Day of week
如 "0,15,30,45 \* \* \* \* " ，前面逗号隔开的是分钟，后面第一个\* 表示每小时，第二个 \* 表示每个月的哪天，第三个表示每月，第四个表示每周的哪天。
如果你想要每个月的第一天里面每半个小时执行一次，那就可以设置为" 0,30 \* 1 \* \* " 如果你想每个星期天的3am执行一次任务，那就可以设置为 "0 3 \* \* 0"。
