k8s的 Job/CronJob资源对象及添加api版本

Job资源对象

服务类的Pod容器:RC、RS、DS、Deployment

工作类的Pod容器:Job--->执行一次,或者批量执行处理程序,完成之后退出容器。

注意: 如果容器内执行任务有误,会根据容器的重启策略操作容器,不过这里
的容器重启策略只能是: Never和 OnFailure。

概念

在有些场景下,是想要运行一些容器执行某种特定的任务,任务一旦执行完成,容器也就没有存在的必要了。在这种场景下,创建pod就显得不那么合适。于是就是了Job,Job指的就是那些一次性任务。通过Job运行一个容器,当其任务执行完以后,就自动退出,集群也不再重新将其唤醒。

从程序的运行形态上来区分,可以将Pod分为两类:长时运行服务(jboss、mysql等)和一次性任务(数据计算、测试)。RC创建的Pod都是长时运行的服务,Job多用于执行一次性任务、批处理工作等,执行完成后便会停止(status.phase变为Succeeded)。

环境介绍

主机 IP地址 服务
master 192.168.1.21 k8s
node01 192.168.1.22 k8s
node02 192.168.1.23 k8s

基于[ https://blog.51cto.com/14320361/2464655]() 的实验继续进行

一、kubernetes支持以下几种job

  • 非并行job:通常创建一个pod直至其成功结束。
  • 固定结束次数的job:设置spec.completions,创建多个pod,直到.spec.completions个pod成功结束。
  • 带有工作队列的并行job:设置.spec.Parallelism但不设置.spec.completions,当所有pod结束并且至少一个成功时,job就认为是成功。

Job Controller

Job Controller负责根据Job Spec创建pod,并持续监控pod的状态,直至其成功结束,如果失败,则根据restartPolicy(只支持OnFailure和Never,不支持Always)决定是否创建新的pod再次重试任务。

例子

(1)编写一个job的yaml文件

[[email protected] yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo","hello k8s job!"]
      restartPolicy: Never

(2)执行一下

[[email protected] yaml]# kubectl apply -f jop.yaml 

(3)查看一下

[[email protected] yaml]# kubectl get pod

查看日志

[[email protected] yaml]# kubectl logs test-job-gs45w 

我们可以看到job与其他资源对象不同,仅执行一次性任务,默认pod借宿运行后job即结束,状态为Completed。

(4)修改一下jop的yaml文件,把echo命令换成乱码

[[email protected] yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["asdasxsddwefew","hello k8s job!"] #修改
      restartPolicy: Never

(5)先删除之前的pod

[[email protected] yaml]# kubectl delete jobs.batch test-job 

(6)执行一下

[[email protected] yaml]# kubectl apply -f jop.yaml 

(7)查看一下

[[email protected] yaml]# kubectl get pod -w

它会一直创建pod直到完成命令。

(8)修改一下jop的yaml文件,修改重启策略

[[email protected] yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["asdasxsddwefew","hello k8s job!"]
      restartPolicy: OnFailure

(9)先删除之前的pod

[[email protected] yaml]# kubectl delete jobs.batch test-job 

(10)执行一下

[[email protected] yaml]# kubectl apply -f jop.yaml 

(11)查看一下

[[email protected] yaml]# kubectl get pod -w

它会一直重启pod完成命令,直到重启到一定次数就会删除job。

二、提高Job的执行效率

1. 我们可以在Job.spec字段下加上[parallelism]()选项。表示同时运行多少个Pod执行任务。


(1)编写一个job的yaml文件

[[email protected] yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  parallelism: 2    #同时启用几个pod
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo","hello k8s job!"]
      restartPolicy: OnFailure

(3)执行一下

[[email protected] yaml]# kubectl apply -f jop.yaml 

(4)查看一下

[[email protected] yaml]# kubectl get pod

查看日志

2. 我们可以在Job.spec字段下加上complations选项。表示总共需要完成Pod的数量

(1)编写一个job的yaml文件

[[email protected] yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:
  name: test-job
spec:
  complations: 8            #运行pod的总数量8个
  parallelism: 2            #同时运行2个pod
  template:
    metadata:
      name: test-job
    spec:
      containers:
      - name: hello
        image: busybox
        command: ["echo","hello k8s job!"]
      restartPolicy: OnFailure

job 字段解释:

completions:标志Job结束需要成功运行的Pod个数,默认为1
parallelism:标志并行运行的Pod的个数,默认为1
activeDeadlineSeconds:标志失败Pod的重试最大时间,超过这个时间不会继续重试.

(2)先删除之前的pod

[[email protected] yaml]# kubectl delete jobs.batch test-job 

(3)执行一下

[[email protected] yaml]# kubectl apply -f jop.yaml 

(4)查看一下

[[email protected] yaml]# kubectl get pod


可以看到pod是两个两个的启动的。

3. 如何定时执行Job

(1)编写一个cronjob的yaml文件

[[email protected] yaml]# vim cronjop.yaml
kind: CronJob
apiVersion: batch/v1beta1
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *" #限定时间
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command: ["echo","hello","cronjob"]
          restartPolicy: OnFailure

(2)先删除之前的pod

[[email protected] yaml]# kubectl delete jobs.batch test-job 

(3)执行一下

[[email protected] yaml]# kubectl apply -f jop.yaml 

(4)查看一下

[[email protected] yaml]# kubectl get pod

[[email protected] yaml]# kubectl get cronjobs.batch 

此时查看Pod的状态,会发现,每分钟都会运行一个新的Pod来执行命令规定的任
务。

练习:规定2020.1.15.10.5分运行上面的crontab任务。

(1)编写一个cronjob的yaml文件

[[email protected] yaml]# vim cronjop.yaml
kind: CronJob
apiVersion: batch/v1beta1
metadata:
  name: hello
spec:
  schedule: "5 10 15 1 *" #限定时间
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command: ["echo","hello","cronjob"]
          restartPolicy: OnFailure

(2)先删除之前的pod

[[email protected] yaml]# kubectl delete cronjobs.batch hello 

(3)执行一下

[[email protected] yaml]# kubectl apply -f jop.yaml 

(4)查看一下

[[email protected] yaml]# kubectl get pod

这时会发现,如果规定具体时间,可能并不会执行任务。

(5)添加apiVersion库

[[email protected] yaml]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
spec:
  containers:
  - command:
    - kube-apiserver
    - --runtime-config=batch/v2alpha1=true    #添加

(6)重启kubelet

[[email protected] yaml]# systemctl restart kubelet.service 

(7)查看api版本

[[email protected] yaml]# kubectl api-versions 

(8)编写一个cronjob的yaml文件

[[email protected] yaml]# vim cronjop.yaml
kind: CronJob
apiVersion: batch/v1beta1
metadata:
  name: hello
spec:
  schedule: "47 10 15 1 *" #限定时间
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            command: ["echo","hello","cronjob"]
          restartPolicy: OnFailure

(9)执行一下

[[email protected] yaml]# kubectl apply -f jop.yaml 

(4)查看一下

[[email protected] yaml]# kubectl get pod -w

注意:此时仍然不能正常运行指定时间的Job,这是因为K8s官方在cronjob这个资源对象的支持中还没有完善此功能,还待开发。

跟Job资源一样在cronjob.spec.jobTemplate.spec 下同样支持并发Job参数:
parallelism,也支持完成Pod的总数参数: completionsr

总结

Job 作为 Kubernetes 中用于处理任务的资源,与其他的资源没有太多的区别,它也使用 Kubernetes 中常见的控制器模式,监听 Informer 中的事件并运行 syncHandler 同步任务

而 CronJob 由于其功能的特殊性,每隔 10s 会从 apiserver 中取出资源并进行检查是否应该触发调度创建新的资源,需要注意的是 CronJob 并不能保证在准确的目标时间执行,执行会有一定程度的滞后。

两个控制器的实现都比较清晰,只是边界条件比较多,分析其实现原理时一定要多注意。

原文地址:https://blog.51cto.com/14320361/2467125

时间: 2024-10-07 15:52:02

k8s的 Job/CronJob资源对象及添加api版本的相关文章

k8s核心资源对象& NameSpace(指定版本回滚)

k8s核心的资源对象: Pod:是运行以及调度的原子单位,也就是k8s中最小的资源单位,同一个pod可以同时运行多个container,多个container之间共享:(UTS(主机名和域名),IPC(消息队列和共享内存),NET(网络栈,端口等),namespace(名称空间)),但USR(用户和组),MNT(挂载点),PID(进行编号)是相互隔离的.pod有两种类型的pod:一类是由控制器控制的pod,一类是自主式pod(不受控制器管理,自己管理自己) Deployment:最常见的pod控

k8s之Labels,Daemonset,Job资源对象

Label(标签) 我们为什么要使用label呢?当相同类型的资源对象越来越多,为了更好的管理,才按照标签分为一个小组,为的是提升资源的管理效率. lable是附着到object上(例如pod)的键值对.可以在创建object的时候指定,也可以在object创建后随时指定.Labels的值对系统本身并没有什么含义,只是对用户才有意义. "labels": { "key1" : "value1", "key2" : "

k8s资源对象的升级、回滚、扩容、缩容

一.资源创建的方式之一,命令的方式创建资源,理解命令运行之后的动作,通过查看资源的方式,总结Pod名称的由来. 当我们执行创建资源的命令后,deployment这个控制器会通过replicaset控制器去管理pod,下面通过一个实例来分析,当我们执行创建资源的命令后,k8s都做了些什么(通过其NAME即可发现规律)? 运行一个deployment [[email protected] ~]# kubectl run test01 --image=nginx:latest --replicas=2

K8s资源对象的基本管理(升级、回滚、扩容、缩容)

博文大纲:一.资源创建二.解决客户端无法访问k8s内部pod所运行的服务三.搭建私有仓库,并自定义镜像四.版本扩容.缩容五.服务的升级与回滚 一.资源创建 本次博文主要介绍如何使用命令行的方式创建资源! [[email protected] ~]# kubectl run test --image=nginx:latest --replicas=5 //基于httpd的镜像创建一个deployment类型的控制组,名称为test,并指定副本数量为5 [[email protected] ~]#

job资源对象

Job资源对象服务类的Pod容器:RC.RS.DS.Deployment.工作类的Pod容器:Job--->执行一次,或者批量执行处理程序,完成之后推出容器.[[email protected] ~]# cat job.yaml kind: JobapiVersion: batch/v1metadata:name: test-jobspec:template:metadata:name: test-jobspec:containers: name: helloimage: busyboxcomm

Pod资源对象

Deployment,Service,Pod是k8s最核心的3个资源对象. Deployment:最常见的无状态应用的控制器,支持应用的扩缩容,滚动更新等操作. Service:为弹性变动且存在生命周期的Pod对象提供了一个固定的访问接口,用于服务发现和服务访问. Pod:是运行容器以及调度的最小单位.同一个Pod可以同时运行多个容器,这些容器共享NET,UTS,IPC.除此之外还有USER,PID,MOUNT. ReplicationController:用于确保每个Pod副本在任意时刻都能满

Kubernetes 资源对象

概述 我将它们简单的分类为以下几种资源对象: 类别 名称 资源对象 Pod.ReplicaSet.ReplicationController.Deployment.StatefulSet.DaemonSet.Job.CronJob.HorizontalPodAutoscaling.Node.Namespace.Service.Ingress.Label.CustomResourceDefinition 存储对象 Volume.PersistentVolume.Secret.ConfigMap 策

Kubernetes 资源对象之DaemonSet

DaemonSet是在Kubernetes1.2 版本新增的一种资源对象 DaemonSet能够让所有(或者一些特定)的Node节点仅运行一份Pod.当节点加入到kubernetes集群中,Pod会被(DaemonSet)调度到该节点上运行,当节点从kubernetes集群中被移除,被(DaemonSet)调度的Pod会被移除,如果删除DaemonSet,所有跟这个DaemonSet相关的pods都会被删除. 在使用kubernetes来运行应用时,很多时候我们需要在一个区域(zone)或者所有

K8s使用YAML文件创建资源

由于K8s技术的火爆,导致现在大大小小的企业都在使用,虽然没有普及,但本人相信时迟早的事情,所以抓紧时间多学习一下吧! 在K8s中创建资源的方式有两种:命令行和YAML文件,本次博文主要介绍使用YAML文件的方式,如需使用命令行创建资源请参考K8s资源对象的基本管理 Kubernetes中的YAML文件与配置清单是一样的,根据个人习惯.本次博文统称为YAML文件! 一.YAML文件基础 YAML是专门用来配置文件的语言,非常简洁和强大.与了解的properties.XML.json等数据格式,习