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...

咱们先从一个简略设置的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: 6parallelism: 2

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

apiVersion: batch/v1kind: Jobmetadata:  name: kubernetes-parallel-job  labels:    jobgroup: jobexamplespec:  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/v1kind: Jobmetadata:  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/v1beta1kind: CronJobmetadata:    name: kubernetes-cron-jobspec:  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...