Job

概念

Job控制器用于管理Pod对象运行一次性任务,例如:对数据库备份,可以直接在k8s上启动一个mysqldump备份程序,也可以启动一个pod,这个pod专门用来做备份任务,备份结束pod就可以终止了,不需要重启,将Pod对象置于"Completed"(完成)状态。
若容器中的进程因错误而终止,则需要按照重启策略配置确定是否重启,对于Job这个类型的控制器来说,需不需要重建pod就看任务是否完成,完成就不需要重建,没有完成就需要重建pod。
Job控制器的Pod对象的状态转换如下图所示:
在这里插入图片描述

适用场景

  • 单个任务:只启一个pod,pod成功,job正常结束;
  • 并行任务同时指定成功个数:可通过字段 .spec.completions 指定成功个数,.spec.parallelism(指定并行运行的任务数)。当成功个数达到 指定的 .spec.completions 个,任务结束;

适用场景

Job 常用于并行地处理一组独立但相关的 work item。如发送邮件,渲染帧,转码文件和扫描NoSql数据库中的key。

相关配置字段:

  • .spec.completions:完成该Job需要执行成功的Pod数,默认为1;
  • .spec.parallelism:能够同时运行的Pod数,默认为1,如果设置为0,则job会暂定;
  • .spec.backoffLimit:允许执行失败的Pod数,默认值是6。(ps. 0表示不允许Pod执行失败。如果Pod是restartPolicy为Nerver,则失败后会创建新的Pod,如果是OnFailed,则会重启Pod。)不管是哪种情况,只要Pod失败一次就计算一次,而不是等整个Pod失败后再计算一个。当失败的次数达到该限制时,整个Job随即结束,所有正在运行中的Pod都会被删除;
  • .spec.activeDeadlineSeconds: Job的超时时间,一旦一个Job运行的时间超出该限制,则Job失败,所有运行中的Pod会被结束并删除。该配置指定的值必须是个正整数。不指定则不会超时;
  • .spec.ttlSecondsAfterFinished:通过指定该参数可以实现自动删除job,以及级联的pod资源。如果设置为0,job会被立即删除。如果不指定,job则不会被自动删除。(默认情况下,job异常或者成功结束后,包括job启动的pod,都不会被清理掉,可以依据保存的job和pod,查看状态、日志,以及调试等。用户可手动删除 job 会级联删除对应的pod)。

使用案例

vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: my-job
spec:
  completions: 6 # job结束需要成功运行的Pod个数,即状态为Completed的pod数
  parallelism: 3 # 同时运行3个pod, 这个值不会超过completions的值
  backoffLimit: 6 # 如果job失败,则重试几次
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: my-container-job
          image: busybox
          imagePullPolicy: IfNotPresent
          command: ['sh', '-c']
          args: ['echo "this is my-job";sleep 60; echo "this is my-job too"']

更新资源清单文件

kubectl apply -f job.yaml

刚创建完资源,查看Job状态

kubectl get Job

在这里插入图片描述

刚创建完资源,查看Job控制器创建的pod的状态

kubectl get pods | grep my-job

在这里插入图片描述

1分钟后,看某个pod的日志

kubectl logs my-job-s9m5s

在这里插入图片描述

动态查看pod状态

kubectl get pods -w | grep my-job

在这里插入图片描述
继续观察Job控制器创建的pod
最终 状态都为完成
在这里插入图片描述
加上 “.spec.ttlSecondsAfterFinished” 字段后,任务完成后指定秒数后自动删除job和关联的pod

vim job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: my-job
spec:
  completions: 6
  parallelism: 3
  backoffLimit: 6
  ttlSecondsAfterFinished: 3  # 加上它,等3秒后资源自动删除
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: my-container-job
          image: busybox
          imagePullPolicy: IfNotPresent
          command: ['sh', '-c']
          args: ['echo "this is my-job";sleep 5; echo "this is my-job too"']

更新资源清单文件

kubectl apply -f job.yaml

时间到了自动删除pod和job
在这里插入图片描述
在这里插入图片描述

CronJob

概念

CronJob跟Job完成的工作是一样的,只不过CronJob添加了定时任务能力。可以指定时间,实现周期性运行。Job,CronJob 与 Deployment,DaemonSet 显著区别在于不需要持续在后台运行。
Deployment主要用于管理无状态的应用(kubernetes集群有一些 pod,某一个pod出现故障,删除之后会重新启动一个pod,那么kubernetes这个集群中pod数量就正常了,更多关注的是群体,这就是无状态应用)。

适用场景

  • 在给定的时间点调度Job运行。
  • 创建周期性运行的Job,例如数据库备份、发送邮件

使用案例

vim cronjob.yaml 
apiVersion: batch/v1
kind: CronJob
metadata:
  name: my-cron-job
spec:
  schedule: "*/1 * * * *" # 1分钟执行一次
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: my-container-cron-job
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo my-container-cron-job
          restartPolicy: OnFailure

更新资源清单文件

kubectl apply -f cronjob.yaml

查看刚才创建的cronJob

kubectl get cronjob

在这里插入图片描述
从命令的结果可以看出,CronJob还没有调度或运行任何Job。观察大概一分钟,等待CronJob创建

kubectl get jobs --watch

现在可以看到由 my-cron-job 这个cronjob调度的一个正在运行的job
在这里插入图片描述

 kubectl get cronjob

可以看到 my-cron-job 这个CronJob成功地在 LAST SCHEDULE中指定的时间点调度了一个作业。当前有1个活动作业,这意味着该作业已经完成或失败
在这里插入图片描述

kubectl get jobs

每60秒建一个job
在这里插入图片描述

kubectl get pods | grep my-cron-job

每60秒执行一个pod
在这里插入图片描述
查看pod执行日志

kubectl logs my-cron-job-28540151-4vhlm

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐