• 入门教程:5步创建K8S Job,搞定批处理


    Kubernetes jobs主要是针对短时和批量的工作负载。它是为了结束而运行的,而不是像deployment、replicasets、replication controllers和DaemonSets等其他对象那样持续运行。

    本文将介绍如何创建Kubernetes jobs和cronjobs,以及一些小技巧。

    Kubernetes Jobs会一直运行到Job中指定的任务完成。也就是说,如果pods给出退出代码0,那么Job就会退出。而在正常的Kubernetes中,无论退出代码是什么,deployment对象在终止或出现错误时都会创建新的pod,以保持deployment的理想状态。

    在job运行过程中,如果托管pod的节点发生故障,Job pod将被自动重新安排到另一个节点。

    Kubernetes Jobs用例

    对于Kubernetes Jobs最好的用例实践是:

    1. 批处理任务:比如说你想每天运行一次批处理任务,或者在指定日程中运行。它可能是像从存储库或数据库中读取文件那样,将它们分配给一个服务来处理文件。

    2. 运维/ad-hoc任务:比如你想要运行一个脚本/代码,该脚本/代码会运行一个数据库清理活动,甚至备份一个Kubernetes集群。

    如何创建Kubernetes Job

    在本例中,我们将使用Ubuntu 容器来运行一个带有for循环的shell脚本,并根据你传递给容器的参数来呼应消息。这个参数是一个数字,决定shell脚本循环应该运行多少次。

    例如,如果你传递了参数100,那么shell脚本将呼应消息100次然后容器将会退出。

    你可以访问以下链接查看Dockerfile和shell脚本:
    https://github.com/devopscube/Kubernetes-jobs-example/tree/master/Docker

    我们先从一个简单设置的job开始。

    Step1:使用自定义的Docker镜像创建一个job.yaml文件,命令参数为100。100将会作为参数传递给docker ENTRYPOINT脚本。

    apiVersion: batch/v1  kind: Job  metadata:      name: kubernetes-job-example      labels:     
        jobgroup: jobexample  spec:      template:     
        metadata:       
          name: kubejob       
          labels:         
            jobgroup: jobexample     
        spec:       
          containers:       
          - name: c         
            image: devopscube/kubernetes-job-demo:latest         
            args: ["100"]       
          restartPolicy: OnFailure   
    

    Step2 :使用kubectl创建一个job.yaml文件的job

    kubectl apply -f job.yam
    

    Step3:使用kubectl检查job的状态

    kubectl get jobs
    

    Step4:使用kubectl获取pod列表

    kubectl get po
    

    Step5:使用kubectl获取job pod 日志。使用你在输出中看到的Pod名称替换原本的Pod名称。

    kubectl logs kubernetes-job-example-bc7s9 -f
    

    在这里插入图片描述

    并行运行多Job pods

    当一个job被部署后,你可以让它在多个Pod上并行运行。例如,在一个job中如果你想要运行6个 pods,同时并行运行2个pods,你需要添加以下2个参数到你的job manifets中:

    completions: 6
    parallelism: 2
    

    以下是带有那些参数的manifest:

    
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: kubernetes-parallel-job
      labels:
        jobgroup: jobexample
    spec:
      completions: 5
      parallelism: 2
      template:
        metadata:
          name: kubernetes-parallel-job
          labels:
            jobgroup: jobexample
        spec:
          containers:
          - name: c
            image: devopscube/kubernetes-job-demo:latest
            args: ["100"]
          restartPolicy: OnFailure
    

    为Kubernetes Job生成随机名称

    你不能从一个job manifest文件中创建多个job,因为Kubernetes会报错,说存在一个同名的job。为了规避这个问题,你可以在元数据中添加 generateName 名称参数。

    例如:

    
    apiVersion: batch/v1
    kind: Job
    metadata:
      generateName: kube-job-
      labels:
        jobgroup: jobexample
    

    在上方示例中,每次你运行该manifest,job将以kube-job-作为前缀,后面跟着一个随机字符串来创建。

    如何创建Kubernetes CronJob

    如果你想按照特定的时间表运行批处理job,例如,每2个小时运行一次。你可以用cron表达式创建一个Kubernetes cronjob。Job会按照你在job中提到的时间表自动启动。

    下面我们将介绍如何指定一个cron计划,你可以使用crontab生成器(https://crontab-generator.org/)来生成自己的时间计划。

    schedule: "0,15,30,45 * * * *"
    

    下图显示了Kubernetes cronjob schedule语法。在这里插入图片描述
    如果我们以cronjob的形式每15分钟运行一次我们之前的job,manifest应该如下所示。创建一个名为cron-job.yaml的文件,并复制以下manifest:

    
    apiVersion: batch/v1beta1
    kind: CronJob
    metadata:
        name: kubernetes-cron-job
    spec:
      schedule: "0,15,30,45 * * * *"
      jobTemplate:
        spec:
          template:
            metadata:
              labels:
                app: cron-batch-job
            spec:
              restartPolicy: OnFailure
              containers:
              - name: kube-cron-job
                image: devopscube/kubernetes-job-demo:latest
                args: ["100"]
    

    让我们使用kubectl部署cronjob。
    kubectl create -f cron-job.yaml
    列出cronjobs:

    kubectl get cronjobs
    

    你可以列出cronjob pod并从处于运行状态或完成状态的pods中获取日志来检查Cronjob日志。

    手动运行Kubernetes CronJob

    在某些情况下,你可能希望以临时的方式执行cronjob。你可以通过从现有的cronjob创建一个job来实现。

    例如,如果你想手动触发一个cronjob,我们应该这样做:

    
    kubectl create job --from=cronjob/kubernetes-cron-job manual-cron-job
    

    --from=cronjob/kubernetes-cron-job将复制cronjob模板并创建一个名为manual-cron-job的job。

    Kubernetes Job的关键参数

    根据你的需求,你还可以使用kubernetes jobs/cronjobs的几个关键参数:

    1. failedJobHistoryLimit &
      successfulJobsHistoryLimit:根据你提供的保留数量删除失败和成功的job历史记录。当你尝试列出job时,这对于减少所有失败的条目非常有用。例如:

    2. backoffLimit:如果你的Pod失败,重试的总次数。

    3. activeDeadlineSeconds:如果你想对cronjob的运行时间进行硬性限制,可以使用此参数。例如,如果你想只运行1分钟的cronjob,你可以将其设置为60。

    通过本文我们了解了创建Job以及Cron Job的步骤并且一些详细的配置过程和关键参数,希望藉由本文可以帮助你开始上手了解K8S Job和Cron Job,轻松搞定批处理任务!

    原文链接:
    https://devopscube.com/create-kubernetes-jobs-cron-jobs/

  • 相关阅读:
    我的 vs code 中setting 设置
    创建Vue cli 脚手架中遇到的空格,函数问题的解决
    C#与.Net的关系
    c#可以开发哪些类型的应用程序
    json注解使用(jackson与fastjson)
    MySQL优化:如何避免回表查询
    二叉树基础知识总结
    Redis,Memcache,MongoDb的特点
    MySQL的InnoDB存储引擎为什么要用自增的主键?
    分布式事务atomikos使用
  • 原文地址:https://www.cnblogs.com/rancherlabs/p/14600437.html
Copyright © 2020-2023  润新知