• K8S之Job和CronJob控制器


    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
    
    • 1
    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"']
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    更新资源清单文件

    kubectl apply -f job.yaml
    
    • 1

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

    kubectl get Job
    
    • 1

    在这里插入图片描述

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

    kubectl get pods | grep my-job
    
    • 1

    在这里插入图片描述

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

    kubectl logs my-job-s9m5s
    
    • 1

    在这里插入图片描述

    动态查看pod状态

    kubectl get pods -w | grep my-job
    
    • 1

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

    vim job.yaml
    
    • 1
    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"']
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    更新资源清单文件

    kubectl apply -f job.yaml
    
    • 1

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

    CronJob

    概念

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

    适用场景

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

    使用案例

    vim cronjob.yaml 
    
    • 1
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    更新资源清单文件

    kubectl apply -f cronjob.yaml
    
    • 1

    查看刚才创建的cronJob

    kubectl get cronjob
    
    • 1

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

    kubectl get jobs --watch
    
    • 1

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

     kubectl get cronjob
    
    • 1

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

    kubectl get jobs
    
    • 1

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

    kubectl get pods | grep my-cron-job
    
    • 1

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

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

    在这里插入图片描述

  • 相关阅读:
    Linux文件系统
    macOS查看切换当前用户和shell
    基于SpringBoot的医疗预约服务管理系统
    傅里叶在图像中的应用FFT算法---fft实战应用案例
    C# Thread.Sleep(0)有什么用?
    DCDC Bootstrap自举电路
    Mac通过brew安装PostgreSQL保姆级实践步骤
    使用DataGrip对Hive进行操作
    从C语言到C++:C++入门知识(1)
    URL because the SSL module is not available
  • 原文地址:https://blog.csdn.net/weixin_40364776/article/details/137431694