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最好的用例实际是:
- 批处理工作:比如说你想每天运行一次批处理工作,或者在指定日程中运行。它可能是像从存储库或数据库中读取文件那样,将它们调配给一个服务来解决文件。
- 运维/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的几个要害参数:
- failedJobHistoryLimit &
successfulJobsHistoryLimit:依据你提供的保留数量删除失败和胜利的job历史记录。当你尝试列出job时,这对于缩小所有失败的条目十分有用。例如: - backoffLimit:如果你的Pod失败,重试的总次数。
- activeDeadlineSeconds:如果你想对cronjob的运行工夫进行硬性限度,能够应用此参数。例如,如果你想只运行1分钟的cronjob,你能够将其设置为60。
通过本文咱们理解了创立Job以及Cron Job的步骤并且一些具体的配置过程和要害参数,心愿藉由本文能够帮忙你开始上手理解K8S Job和Cron Job,轻松搞定批处理工作!
原文链接:
https://devopscube.com/create...