zoukankan      html  css  js  c++  java
  • k8s 中Job、Cronjob

    Job负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。

    CronJob则就是在Job上加上了时间调度。

    一、job

    Job这个资源对象来创建一个任务,我们定一个Job来执行一个倒计时的任务,定义YAML文件

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-demo
    spec:
      template:
        metadata:
          name: job-demo
        spec:
          restartPolicy: Never
          containers:
          - name: counter
            image: busybox
            command:
            - "bin/sh"
            - "-c"
            - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
    

    查看运行日志

    #kubectl describe jobs job-demo
    Name:           job-demo
    Namespace:      default
    Selector:       controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e
    Labels:         controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e
                    job-name=job-demo
    Pods Statuses:  1 Running / 0 Succeeded / 2 Failed
    Pod Template:
      Labels:  controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e
               job-name=job-demo
      Containers:
       counter:
        Image:      busybox
        Port:       <none>
        Host Port:  <none>
        Command:
          bin/bash
          -c
          for i in 9 8 7 6 5 4 3 2 1; do echo $i; done
        Environment:  <none>
        Mounts:       <none>
      Volumes:        <none>
    Events:
      Type    Reason            Age   From            Message
      ----    ------            ----  ----            -------
      Normal  SuccessfulCreate  60s   job-controller  Created pod: job-demo-d26wx
      Normal  SuccessfulCreate  42s   job-controller  Created pod: job-demo-tm896
      Normal  SuccessfulCreate  2s    job-controller  Created pod: job-demo-wpbcs
    

    https://kubernetes.io/zh/docs/concepts/workloads/controllers/job/   官网

    注意JobRestartPolicy仅支持NeverOnFailure两种,不支持Always,我们知道Job就相当于来执行一个批处理任务,执行完就结束了,如果支持Always的话是不是就陷入了死循环了?

    二、CronJob

    CronJob其实就是在Job的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性地在给定时间点运行。这个实际上和我们Linux中的crontab就非常类似了。

    一个CronJob对象其实就对应中crontab文件中的一行,它根据配置的时间格式周期性地运行一个Job,格式和crontab也是一样的。

    crontab的格式如下:

    分 时 日 月 星期 要运行的命令 第1列分钟0~59 第2列小时0~23) 第3列日1~31 第4列月1~12 第5列星期0~7(0和7表示星期天) 第6列要运行的命令

    现在,我们用CronJob来管理我们上面的Job任务,

    我们这里的KindCronJob了,要注意的是.spec.schedule字段是必须填写的,用来指定任务运行的周期,格式就和crontab一样,另外一个字段是.spec.jobTemplate, 用来指定需要运行的任务,格式当然和Job是一致的。还有一些值得我们关注的字段.spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit,表示历史限制,是可选的字段。它们指定了可以保留多少完成和失败的Job,默认没有限制,所有成功和失败的Job都会被保留。然而,当运行一个Cron Job时,Job可以很快就堆积很多,所以一般推荐设置这两个字段的值。如果设置限制的值为 0,那么相关类型的Job完成后将不会被保留.

    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
      name: hello
    spec:
      schedule: "*/1 * * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: hello
                image: busybox
                args:
                - /bin/sh
                - -c
                - date; echo Hello from the Kubernetes cluster
              restartPolicy: OnFailure
    

    查看cronjob

    # kubectl get cronjob hello
    NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
    hello   */1 * * * *   False     0        51s             3m25s
    
    # kubectl get pod
    NAME                     READY   STATUS      RESTARTS   AGE
    hello-1606739520-d67pb   0/1     Completed   0          87s
    hello-1606739580-cpfbp   0/1     Completed   0          27s
    
    # kubectl logs hello-1606739580-cpfbp
    Mon Nov 30 12:33:25 UTC 2020
    Hello from the Kubernetes cluster
    

    https://kubernetes.io/zh/docs/tasks/job/automated-tasks-with-cron-jobs/     使用 CronJob 运行自动化任务

    当然,也可以用kubectl run来创建一个CronJob

    kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
    $ kubectl get cronjob
    NAME      SCHEDULE      SUSPEND   ACTIVE    LAST-SCHEDULE
    hello     */1 * * * *   False     0         <none>
    $ kubectl get jobs
    NAME               DESIRED   SUCCESSFUL   AGE
    hello-1202039034   1         1            49s
    $ pods=$(kubectl get pods --selector=job-name=hello-1202039034 --output=jsonpath={.items..metadata.name} -a)
    $ kubectl logs $pods
    Mon Aug 29 21:34:09 UTC 2016
    Hello from the Kubernetes cluster
    
  • 相关阅读:
    git .gitignore不生效的解决方法
    python 爬虫中常需要睡眠防止被封IP time sleep
    Python 实现字典操作详解
    Python遍历字典到列表中出现覆盖前面数据或者字典对值(值为列表)赋值出现重复的问题
    小红书app之shield 逆向
    淘宝h5 页面 sign加密算法
    jemter-base64加密
    Python 中更优雅的日志记录方案
    logging再学习
    elasticsearch中must和should条件同时满足
  • 原文地址:https://www.cnblogs.com/zjz20/p/14063389.html
Copyright © 2011-2022 走看看