Kubernetes --(k8s)Job、CronJob
Job
https://www.kubernetes.org.cn/job
https://www.kubernetes.org.cn/cronjob
Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束.
Kubernetes支持以下几种Job:
- 非并行Job:通常创建一个Pod直至其成功结束
- 固定结束次数的Job:设置.spec.completions,创建多个Pod,直到.spec.completions个Pod成功结束
- 带有工作队列的并行Job:设置.spec.Parallelism但不设置.spec.completions,当所有Pod结束并且至少一个成功时,Job就认为是成功
- 根据.spec.completions和.spec.Parallelism的设置,可以将Job划分为以下几种pattern:
| Job类型 | 使用示例 | 行为 | completions | Parallelism | 
|---|---|---|---|---|
| 一次性Job | 数据库迁移 | 创建一个Pod直至其成功结束 | 1 | 1 | 
| 固定结束次数的Job | 处理工作队列的Pod | 依次创建一个Pod运行直至completions个成功结束 | 2+ | 1 | 
| 固定结束次数的并行Job | 多个Pod同时处理工作队列 | 依次创建多个Pod运行直至completions个成功结束 | 2+ | 2+ | 
| 并行Job | 多个Pod同时处理工作队列 | 创建一个或多个Pod直至有一个成功结束 | 1 | 2+ | 
实验1:一次性Job
第一步:编写job的yml文件
apiVersion: batch/v1
kind: Job
metadata:
   name: job
spec:
   template:
      spec:
         restartPolicy: Never
         containers:
         - name: job
           image: busybox
           command: ["echooo","Hello World"]
第二步:执行yml文件
╭─root@node1 ~  
╰─➤  kubectl apply -f job.yml      
job.batch/job created
第三步:查看pod
╭─root@node1 ~  
╰─➤  kubectl get pod
NAME        READY   STATUS               RESTARTS   AGE
job-jhlsf   0/1     ContainerCannotRun   0          53s
job-ldxnr   0/1     ContainerCannotRun   0          23s
job-m6cpf   0/1     ContainerCreating    0          3s
job-m8skh   0/1     ContainerCannotRun   0          64s
问题发现:创建了很多pod,为什么?
解答:Job Controller负责根据Job Spec创建Pod,并持续监控Pod的状态,直至其成功结束。如果失败,则根据restartPolicy(只支持OnFailure和Never,不支持Always)决定是否创建新的Pod再次重试任务。如果重启策略为OnFailure的话,pod会一直重启!
实验2:固定结束次数的并行Job
第一步:编写yml文件
apiVersion: batch/v1
kind: Job
metadata: 
   name: job
spec:
   completions: 2    # 完成数
   parallelism: 2    # 并行数
   template:
      spec:
         restartPolicy: OnFailure
         containers:
         - name: job
           image: busybox
           command: ["/bin/sh","-c","sleep 5;echo Hello World"]
第二步:运行
╭─root@node1 ~  
╰─➤  kubectl apply -f job.yml 
job.batch/job created
第三步:查看
╭─root@node1 ~  
╰─➤  kubectl get pod
NAME        READY   STATUS      RESTARTS   AGE
job-x5tfw   1/1     Running     0          35s
job-zx8p2   0/1     Completed   0          35s
╭─root@node1 ~  
╰─➤  kubectl logs job-x5tfw 
Hello World
╭─root@node1 ~  
╰─➤  kubectl logs job-zx8p2 
Hello World
CronJob
CronJob即定时任务,就类似于Linux系统的crontab,在指定的时间周期运行指定的任务。
实验:
第一步:编写yml文件
apiVersion: batch/v1beta1
kind: CronJob
metadata:
   name: cronjob1
spec:
   schedule: "* * * * *"
   jobTemplate:
      metadata:
         name: job
      spec:
         template:
            metadata:
               name: pod
            spec:
               restartPolicy: OnFailure
               containers:
               - name: busybox
                 image: busybox
                 command: ["echo","hello"]
                 imagePullPolicy: IfNotPresent
第二步:运行
╭─root@node1 ~  
╰─➤  kubectl apply -f cronjob.yml 
cronjob.batch/cronjob1 created
第三步: 查看
╭─root@node1 ~  
╰─➤  kubectl get pod
NAME                        READY   STATUS      RESTARTS   AGE
cronjob1-1567149060-vjqtp   0/1     Completed   0          43s
╭─root@node1 ~  
╰─➤  kubectl logs cronjob1-1567149060-vjqtp
hello


 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号