【K8S】Kubernetes 中离线任务API资源对象—— Job/CronJob

一、业务背景

  • 因为Kubernetes 相当于是云计算中的操作系统。对于一个复杂的分布式系统,如果我们直接基于 Pod 运行我们需要的服务,因为我们服务的类型与性质千奇百怪,我们还需要针对使用场景对 Pod 进行定制化的封装。
  • 基于单一职责原则,Kubernetes 已经帮我们封装好了在离线任务场景下的 API 资源对象,这就是 Job 和 CronJob,他们又分别对应了临时任务和周期性任务这2种API 资源对象。

二、临时任务API资源对象——Job

2.1 创建 Job API 资源对象模版

下面使用命令创建一个叫test-job 的 job

kubectl create job test-job --image=busybox --dry-run=client -o yaml

然后在当前目录下会生成一个如下内容的 yaml 文件。

2.2 Job 资源对象定义

根据下面的yaml 文件的定义可以看到,Job 这种资源对象其实就是对 Pod 资源对象的封装。该Job任务就是使用 echo 命令打印出 2 个参数。

apiVersion: batch/v1		#注意Job类型资源的版本与其他 API 资源版本的区别
kind: Job
metadata:
  name: test-job		# 可添加自定义的标签

spec:
  activeDeadlineSeconds: 20  # 运行Job类型任务的超时时间
  backoffLimit: 4	# 失败最多重试的次数
  completions: 2	# 完成该Job类型任务要运行多少个Pod,默认1个
  parallelism: 2	# 运行多个pod时的并发度限制
  template:		# 注意 Job 资源对象是对 Pod 的定义在外面封装一层
    spec:
      restartPolicy: OnFailure # pod 的重启策略
      containers: # 定义 pod 中的容器
      - image: busybox
        name: test-job
        imagePullPolicy: IfNotPresent
        command: ["/bin/echo"]
        args: ["hello", "codeSlave"]

Job资源对象内的restartPolicy只允许被设置为NeverOnFailure。因为离线计算的Pod永远都不应该被重启,否则他们会再重新计算一遍。同理,Deployment资源对象的restartPolicy只能被设置成Always

如果我们在定义Job资源对象的yaml文件中指定了restartPolicy=Never,那么如果离线任务失败,该Job 资源对象会不断尝试去创建新的Pod。如果离线任务一直失败,创建新Pod 的次数也不是没有限制的,默认是6次,我们也可以通过spec.backoffLimit 字段来指定尝试创建新Pod 的次数。

还有一种Job 资源对象离线任务执行失败的情况,就是该离线任务一直在运行,迟迟没有完成,所管理的Pod一直没有进入Completed 状态。对于这种情况,我们可以通过spec.activeDeadlineSeconds 字段来指定离线任务的最长执行时间。一旦超过这个时间,该Job下所有的Pod会被终止。

2.3 运行、观察 Job

使用定义好的 yaml 文件运行Job:

kubectl apply -f job.yaml

查看Job、Job 资源对象下所属Pod运行状况,及临时任务的执行情况

kubectl get job
kubectl get pod
kubectl logs {pod_name}  # 根据日志,查看任务的执行状况

三、定时任务API资源对象——CronJob

CronJob资源对象是在Job资源对象的基础上做了一层的封装。

3.1 创建 CronJob API 资源对象模版

使用如下命令创建一个 crobJob:

kubectl create cj test-cronJob --image=busybox --schedule="" --dry-run=client -o yaml

然后在当前目录下生成一个定义了cronJob 的资源对象的yaml 文件,具体内容如下。

3.2 CronJob API 资源对象定义

  • 从该 CronJob 资源对象的定义可以看出,我们可以通过在 schedule 字段定义的 cron 表达式确定定时任务执行的周期;
  • CronJob 资源对象是在 Job 资源对象的基础之上又做了一层封装;
apiVersion: batch/v1		# cronJob 资源对象的版本
kind: CronJob		# 资源对象类型
metadata:
  name: test-cronJob		# 该CronJob名

spec:
  schedule: '*/1 * * * *'		# 该周期任务的 cron 表达式
  jobTemplate:		# 可以看出 cronJob 资源对象是在 Job 资源对象的基础之上又做了一层封装
    spec:
      activeDeadlineSeconds: 20  # 运行Job类型任务的超时时间
  	  backoffLimit: 4	# 失败最多重试的次数
      completions: 2	# 完成该Job类型任务要运行多少个Pod,默认1个
      parallelism: 2	# 运行多个pod时的并发度限制
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - image: busybox
            name: test-cronJob
            imagePullPolicy: IfNotPresent
            command: ["/bin/echo"]
            args: ["hello", "codeSlave"]

3.2 运行观察 CronJob

使用下面的命令运行上面定义好的 cronJob:
kubectl apply -f cron-job.yaml
使用下面的命令查看 cronJob 具体的运行状况:

kubectl get cj
kubectl get job
kubectl get pod -w # 查看pod状况,-w 选项可查看pod的实时状态
kubectl logs {pod_name} # 查看该pod运行任务的日志
kubectl describe {pod_name} # 查看pod运行的详细信息
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KubernetesCronJob是一种用于周期性执行任务的机制。它主要用于定期运行特定的作业,如数据备份、定时报告、定时任务等。 CronJob是基于Unixcron表达式的,该表达式由五个字段组成:分、时、日、月、周几。通过这些字段的组合,可以实现对任务在不同时间间隔进行精确调度。在KubernetesCronJob将每个字段的定义封装为一个对象,并使用Cron表达式将这些对象组合起来。 CronJob是由Kubernetes的控制平面负责执行的。当到达指定的时间时,控制平面将自动创建一个Job对象,并将其分发到合适的Worker节点上运行。Job对象的创建和管理完全由Kubernetes控制平面处理,对用户而言是透明的。 CronJob对象的定义包括了作业的调度规则和执行的任务。可以指定作业的运行时间、重试策略、并行性等属性。执行的任务可以是容器或命令行,可以是存储在镜像的应用程序或是运行在Pod的脚本。用户可以根据实际需求定义不同的任务。 除了基本的调度功能外,CronJob还提供了监控和日志功能,可以通过指定调度失败阈值和记录日志的级别来跟踪作业的状态和执行情况。这些信息对于定位问题、排查故障非常有帮助。 总之,KubernetesCronJob是一种非常强大和灵活的调度机制,可以满足周期性任务的需求。通过使用CronJob,用户可以方便地配置和管理定时任务,提高任务的可靠性和稳定性。同时,CronJob还提供了丰富的监控和日志功能,帮助用户更好地了解和管理任务的执行情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值