首页 > 其他分享 >k8s核心资源Job&&CronJob调度pod

k8s核心资源Job&&CronJob调度pod

时间:2023-08-25 16:12:41浏览次数:33  
标签:busybox CronJob Completed Job job && pod my

一、Job与CronJob概念与与原理解读

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

0:完成状态、非0:错误状态;以非0状态码退出就会重启pod

 1.1 Job三种使用场景

1、非并行任务:只启一个 pod,pod 成功,job 正常结束
2、并行任务同时指定成功个数:.spec.completions 为指定成功个数,可以指定也可以不指定.spec.parallelism(指定>1,会有多个任务并行运行)。当成功个数达到.spec.completions,任务结束。
3、有工作队列的并行任务:.spec.completions 默认1,.spec.parallelism 为大于 0 的整数。此时并行启动多个 pod,只要有一个成功,任务结束,所有 pod 结束

1.2 适用场景

Job 不是设计用来完成通信密集型的并行程序,如科学计算领域常见的场景。它支持并行地处理一组独立但相关的 work item,如发送邮件,渲染帧,转码文件和扫描 NoSql 数据库中的 key

kubectl explain Job.spec
相关配置:
.spec.completions:完成该 Job 需要执行成功的 Pod 数
.spec.parallelism:能够同时运行的 Pod 数
.spec.backoffLimit:允许执行失败的 Pod 数,默认值是 6,0 表示不允许 Pod 执行失败。如果Pod 是 restartPolicy 为 Nerver,则失败后会创建新的 Pod,如果是 OnFailed,则会重启 Pod,不管是哪种情况,只要 Pod 失败一次就计算一次,
而不是等整个 Pod 失败后再计算一个。当失败的次数达到该限制时,整个 Job 随即结束,所有正在运行中的 Pod 都会被删除。 .spec.activeDeadlineSeconds: Job 的超时时间,一旦一个 Job 运行的时间超出该限制,则 Job失败,所有运行中的 Pod 会被结束并删除。该配置指定的值必须是个正整数。不指定则不会超时

1.3 CronJob 概念、原理解读

CronJob 跟 Job 完成的工作是一样的,只不过 CronJob 添加了定时任务能力可以指定时间,实现周期性运行。Job,CronJob 和 Deployment,DaemonSet 显著区别在于不需要持续在后台运行

Deployment 主要用于管理无状态的应用(kubernetes 集群有一些 pod,某一个 pod 出现故障, 删除之后会重新启动一个 pod,那么 kubernetes 这个集群中 pod 数量就正常了,更多关注的是群体, 这就是无状态应用)。

使用场景:
1、在给定时间点只运行一次。
2、在给定时间点周期性地运行。

CronJob 的典型用法如下:
1、在给定的时间点调度 Job 运行。
2、创建周期性运行的 Job,例如数据库备份、发送邮件

二、Job控制器-资源清单编写技巧

# 查看Job资源对象由哪几部分组成
[root@master dmgame]# kubectl explain Job
KIND:     Job
VERSION:  batch/v1

FIELDS:
  apiVersion    <string>
  kind    <string>
  metadata    <Object> #元数据,定义资源的名字和所在名称空间
  spec    <Object>
  status    <Object>

#查看 Job 下的 spec 字段
[root@master dmgame]# kubectl explain Job.spec
FIELDS:
  activeDeadlineSeconds    <integer> #通过指定job 存活时间,来结束一个 job。当 job 运行时间达到 activeDeadlineSeconds 指定的时间后,job 会停止由它启动的所有任务(如:pod),并设置 job 的状态为 failed

backoffLimit    <integer> #job 建议指定 pod 的重启策略为 never,如:.spec.template.spec.restartPolicy = "Never",然后通过 job 的 backoffLimit 来指定失败重试次数,在达到 backoffLimit 指定的次数后,
                job 状态设置为 failed(默认为 6 次) completionMode <string> completions <integer> #指定job 启动的任务(如:pod)成功运行 completions 次,job 才算成功结束 manualSelector <boolean> parallelism <integer> #指定job 同时运行的任务(如:pod)个数,Parallelism 默认为 1, 如果设置为 0,则 job 会暂定 podFailurePolicy <Object> selector <Object> suspend <boolean> template <Object> -required- ttlSecondsAfterFinished <integer> #默认情况下,job 异常或者成功结束后,包括 job 启动的任务(pod),都不会被清理掉,因为你可以依据保存的 job 和 pod,查看状态、日志,以及调试等。这些用户可以手动删除,
用户手动删除 job,job controller 会级联删除对应的 pod,除了手动删除,通过指定参数 ttlSecondsAfterFinished 也可以实现自动删除 job,以及级联的资源,如:pod。如果设置为 0,job 会被立即删除。如果不指定,job 则不会被删除

2.1 实战:Job使用案例-创建一个一次性任务

[root@master ~]# cat job.yaml 
apiVersion: batch/v1
kind: Job
metadata:
  name: my-busybox-job
spec:
  completions: 6  # job 结束需要成功运行的 Pod 个数,即状态为 Completed 的 pod 数
  parallelism: 3  # 一次运行3个pod,这个值不会超过Completed个数
  backoffLimit: 6  # 如果job失败,重试次数
  template:
    metadata:
      labels:
        app: test
    spec:
      restartPolicy: Never
      containers:
        - name: my-container-job
          image: busybox
          imagePullPolicy: IfNotPresent
          command: ['sh', '-c']
          args: ['echo "Welcome to xc";sleep 60; echo "Next to Meet you"']

[root@master ~]# kubectl apply -f job.yaml 
job.batch/my-busybox-job created

[root@master ~]# kubectl get pods -l app=test -w

NAME                   READY   STATUS    RESTARTS   AGE
my-busybox-job-mct9j   0/1     Pending   0          0s
my-busybox-job-mct9j   0/1     Pending   0          1s
my-busybox-job-ph6fp   0/1     Pending   0          0s
my-busybox-job-xx2rh   0/1     Pending   0          0s
my-busybox-job-ph6fp   0/1     Pending   0          0s
my-busybox-job-mct9j   0/1     ContainerCreating   0          1s
my-busybox-job-xx2rh   0/1     Pending             0          0s
my-busybox-job-ph6fp   0/1     ContainerCreating   0          0s
my-busybox-job-xx2rh   0/1     ContainerCreating   0          0s
my-busybox-job-xx2rh   0/1     ContainerCreating   0          0s
my-busybox-job-mct9j   0/1     ContainerCreating   0          1s
my-busybox-job-ph6fp   0/1     ContainerCreating   0          1s
my-busybox-job-ph6fp   1/1     Running             0          2s
my-busybox-job-xx2rh   1/1     Running             0          2s
my-busybox-job-mct9j   1/1     Running             0          3s
启动了3个pod,completed后又启动了3个
#################################
[root@master ~]# kubectl get pods
NAME                   READY   STATUS      RESTARTS   AGE
my-busybox-job-4pbc5   1/1     Running     0          44s
my-busybox-job-dwqwm   1/1     Running     0          44s
my-busybox-job-mct9j   0/1     Completed   0          109s
my-busybox-job-ntf9d   1/1     Running     0          44s
my-busybox-job-ph6fp   0/1     Completed   0          108s
my-busybox-job-xx2rh   0/1     Completed   0          108s

[root@master ~]# kubectl logs my-busybox-job-4pbc5
Welcome to xc
Next to Meet you

############################
my-busybox-job-xx2rh   0/1     Completed           0          62s
my-busybox-job-ph6fp   0/1     Completed           0          62s
my-busybox-job-mct9j   0/1     Completed           0          63s
my-busybox-job-xx2rh   0/1     Completed           0          63s
my-busybox-job-ph6fp   0/1     Completed           0          63s
my-busybox-job-mct9j   0/1     Completed           0          64s
my-busybox-job-xx2rh   0/1     Completed           0          64s
my-busybox-job-mct9j   0/1     Completed           0          65s
my-busybox-job-ph6fp   0/1     Completed           0          64s
my-busybox-job-ntf9d   0/1     Pending             0          0s
my-busybox-job-4pbc5   0/1     Pending             0          0s
my-busybox-job-dwqwm   0/1     Pending             0          0s
my-busybox-job-ntf9d   0/1     Pending             0          0s
my-busybox-job-4pbc5   0/1     Pending             0          0s
my-busybox-job-ph6fp   0/1     Completed           0          64s
my-busybox-job-dwqwm   0/1     Pending             0          0s
my-busybox-job-xx2rh   0/1     Completed           0          64s
my-busybox-job-mct9j   0/1     Completed           0          65s
my-busybox-job-ntf9d   0/1     ContainerCreating   0          0s
my-busybox-job-4pbc5   0/1     ContainerCreating   0          0s
my-busybox-job-dwqwm   0/1     ContainerCreating   0          0s
my-busybox-job-ntf9d   0/1     ContainerCreating   0          1s
my-busybox-job-dwqwm   0/1     ContainerCreating   0          1s
my-busybox-job-4pbc5   0/1     ContainerCreating   0          1s
my-busybox-job-4pbc5   1/1     Running             0          2s
my-busybox-job-dwqwm   1/1     Running             0          2s
my-busybox-job-ntf9d   1/1     Running             0          2s
my-busybox-job-4pbc5   0/1     Completed           0          62s
my-busybox-job-dwqwm   0/1     Completed           0          62s
my-busybox-job-ntf9d   0/1     Completed           0          62s
my-busybox-job-dwqwm   0/1     Completed           0          63s
my-busybox-job-ntf9d   0/1     Completed           0          63s
my-busybox-job-4pbc5   0/1     Completed           0          63s
my-busybox-job-4pbc5   0/1     Completed           0          64s
my-busybox-job-dwqwm   0/1     Completed           0          64s
my-busybox-job-ntf9d   0/1     Completed           0          64s
my-busybox-job-ntf9d   0/1     Completed           0          64s
my-busybox-job-dwqwm   0/1     Completed           0          64s
my-busybox-job-4pbc5   0/1     Completed           0          64s

2.2 实战:CronJob使用案例-创建周期性定时任务

[root@master ~]# cat cronjob.yaml 
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          labels:
             app: cro
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

[root@master ~]# kubectl apply -f cronjob.yaml 
cronjob.batch/hello created

[root@master ~]# kubectl get pods
NAME                   READY   STATUS      RESTARTS   AGE
hello-28215840-s5kgt   0/1     Completed   0          22s

[root@master ~]# kubectl get cronjob -w
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     0        <none>          0s
hello   */1 * * * *   False     1        0s              9s
hello   */1 * * * *   False     0        3s              12s
hello   */1 * * * *   False     0        3s              12s

[root@master ~]# kubectl get job -w
NAME             COMPLETIONS   DURATION   AGE
hello-28215840   0/1                      0s
hello-28215840   0/1           0s         0s
hello-28215840   0/1           3s         3s
hello-28215840   1/1           3s         3s

[root@master ~]# kubectl logs hello-28215840-s5kgt
Fri Aug 25 08:00:00 UTC 2023
Hello from the Kubernetes cluster

 

标签:busybox,CronJob,Completed,Job,job,&&,pod,my
From: https://www.cnblogs.com/yangmeichong/p/17657207.html

相关文章

  • Springboot K8s Job 一次性任务 如何禁用端口监听
    问题:SpringBoot一次性任务执行时,也会默认监听服务端口,当使用k8sjob运行时,可能多个pod执行存在端口冲突解决办法:命令行禁用SpringBoot一次性任务启动时端口占用java-cp./XXX-Dspring.config.location=/home/XXXX.propertiesorg.springframework.boot.loader.Properties......
  • 021xxljob大量close_wait
    一、二、服务大量CLOSE_WAIT是如何造成的?如何解决?(1)CLOSE_WAIT是TCP连接的一种状态,表示收到对方发来的FIN包,己方还没有发FIN包。这通常是正常的TCP连接关闭过程中的中间状态。但是如果CLOSE_WAIT状态的连接过多,可能表示有错误或异常导致大量连接无法正常关闭。造成大量......
  • a start job is running for udev wait for complete device initialization
    astartjobisrunningforudevwaitforcompletedeviceinitializationreference:https://github.com/AdnanHodzic/displaylink-debian/issues/331diff/etc/init.d/systemd-udevd+systemctlmasksystemd-udev-settleudevadmtrigger--action=addudevadmsett......
  • xxl-job
    dockerdockerrun-ePARAMS="--server.port=9110--spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true--spring.data......
  • linux下安装xxljob
    一.环境准备服务器上需要安装jdk和maven(1).jdk下载地址:https://www.oracle.com/java/technologies/downloads/(2)下载完成后上传到linux服务器上(3)然后解压使用tar-zxvf jdk-8u351-linux-x64.tar.gz(tar包名改成自己版本的)(4)配置jdk环境变量vimetc/profile:exportJAVA_HOME=......
  • 利用K8S CronJob来实现etcd集群的自动备份
    前言:利用k8sCronJob来实现etcd集群的自动备份,并通过sftp传输到本k8s集群外的服务器上,进行存储。实验步骤:基本环境情况:服务器角色IP系统ETCD版本K8S集群操作服务器192.168.1.136Centos7.93.4.9存储服务器192.168.1.105Centos7.9-创建Dockerfile镜像:[root@k8s-master1~]#mkdir/s......
  • EBS: Error:Txn Failed WIP_WORK_ORDER_LOCKED (JOBNAME=XXXXX)
    Error:TxnFailedWIP_WORK_ORDER_LOCKED(JOBNAME=XXXXX)whileWIPCompletionfromOracleWMS. (DocID2624324.1)LastupdatedonMAY15,2023APPLIESTO:OracleWorkinProcess-Version12.2.7andlaterInformationinthisdocumentappliestoanyplatform.......
  • 19.任务调度之xxl-job原理
    课程目标1、掌握xxl-job的部署、开发方法2、掌握xxl-job的特性和架构设计3、掌握xxl-job的运行原理内容定位适合已经掌握Quartz的同学学习。Quartz这节课是大家必须去看的,因为E-job的底层就是Quartz,xxljob最开始也是用Quartz实现的。1.xxl-job基本介绍1.1.Quartz体系......
  • xxljob配置及基本使用
    以byteeasy项目为例集成xxl-job两个开源项目git地址:[email protected]:xuxueli0323/[email protected]:hbuzc/byteeasy.git 1、导入数据库xxljob的doc文件下的db文件中包含sql文件,复制到navicat执行。2、部署xxl-job项目将打好的xxl-job项目jar包放到新文件夹下;......
  • python3 apscheduler 任务池 异常错误 /opt/www/taskPools1/venv/lib/python3.8/site-
    报错信息:(venv)root@VM-8-7-ubuntu:/opt/www/taskPools1#pythonmain.pyTraceback(mostrecentcalllast):File"/opt/www/taskPools1/venv/lib/python3.8/site-packages/apscheduler/jobstores/mongodb.py",line86,inadd_jobself.collection.insert_on......