kubernetes学习笔记-JobController

1.一次性任务

kubernetes通过JobController控制器来控制Pod来执行任务,其有以下特点:

  • 创建Pod运行特定任务
  • Pod异常重启
  • 支持并发创建Pod任务数和指定任务数

其运行方式有以下几种:

  • 单个Pod
  • 特定数量的Pod
  • 并发运行任务

1.1.单个任务

cat job-demo.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: jobs-demo
  labels:
    controller: jobs
spec:
  parallelism: 1  # 并发数1
  template:
    metadata:
      name: jobs-demo
      labels:
        controller: jobs
    spec:
      containers:
      - name: echo-time
        image: centos:latest
        imagePullPolicy: IfNotPresent
        command:
        - /bin/sh
        - -c
        - "for i in $(seq 0 100);do echo ${i} && sleep 1;done"
      restartPolicy: Never  # 运行完就停止任务

在次任务运行过程中查看其动态过程
kubectl logs jobs-demo-pxjb6 -f
同时查看其pods状态
kubectl get pods

下面是对比图
04log1
任务完成后pod状态由running转变成completed

1.2.依次运行多个任务

JobController提供了两个控制并发的参数:parallelism和completions,前者设置运行job时的并发任务数,后者设置任务的总数,parallelism为1表示依次运行任务
cat job-multi.yaml

apiVersion: batch/v1
kind: Job
metadata: 
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl","-Mbignum=bpi","-wle","print bpi(100)"]
      restartPolicy: Never
  parallelism: 1
  completions: 5

kubectl apply -f job-multi.yaml
查看创建任务的过程
kubectl get jobs.batch --watch

04job2

1.3.并发运行多个任务

Job控制器是可以同时运行多个pod任务的,设置参数parallelism为3即可
cat jobbinfa.taml

apiVersion: batch/v1
kind: Job
metadata:
  name: jobbinfa-demo
  labels:
    controller: jobs
spec:
  parallelism: 3 
  template:
    metadata:
      name: jobbinfa-demo
      labels:
        controller: jobs
    spec:
      containers:
      - name: echo-time
        image: centos:latest
        imagePullPolicy: IfNotPresent
        command:
        - /bin/sh
        - -c
        - "for i in $(seq 0 10);do echo ${i} && sleep 1;done"
      restartPolicy: Never

kubectl apply -f jobbinfa.yaml
分别查看job和pod
04jobs1

04jobs2

从图中可以看到Job同时创建了3个并发任务
从上面可以看到一次性运行了3个pod,除了设定并发数,还可以设定completions来设置特定任务数的任务,比如设置9个总任务,这样一次性运行3个并发任务来实现9个任务的jobs任务

cat duoge.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: job-demo
  labels:
    controller: jobs
spec:
  parallelism: 3
  completions: 9
  template:
    metadata: 
      name: job-demo
      labels:
        controller: jobs
    spec:
      containers:
      - name: echo-time
        image: centos:latest
        imagePullPolicy: IfNotPresent
        command: 
        - /bin/sh
        - -c 
        - "for i in `seq 0 10`;do echo `date` && sleep 1;done"
      restartPolicy: Never

kubectl apply -f duoge.yaml
查看jobs详情
kubectl describe jobs job-demo
04log2
从上图可以看到分三次,每次创建3个job

PS:JobController控制器与Deployments控制器不一样,不支持修改yaml文件,必须先将生成的job删除,然后再运行修改后的文件生成Jobs,但是Deployments是可以修改i的,然后直接使用修改后的yaml文件创建副本集

2.计划任务

2.1.CronJobs简介

类似linux里的计划任务,周期性的运行任务,CronJobs控制器通过时间线来创建Jobs,从而完成任务的执行处理,其特点如下:

  • 计划任务
  • 调用JobController控制器创建任务
  • CronJobs的任务名称小于52个字符
  • 常用场景:定期备份、定时发送邮件

其计划任务的格式类似crontab

2.2.创建CronJobs任务

CronJobs控制器与Deployments控制器类似,需要一个schedule定期任务调度
cat cronjob.yaml

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob-demo
  labels:
    jobgroup: cronjob-demo
spec:
  schedule: "*/5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: cronjob-demo
            image: busybox:latest
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - "for i in $(seq 0 100);do echo ${i} && sleep 1;done"
          restartPolicy: Never

kubectl apply -f cronjob.yaml
查看
kubectl get cronjobs.batch
kubectl get pods
04job3
从上图可以看出计划执行的任务创建的时间间隔与设定的计划任务时间一致