Kubernetes中的Job(工作计划)ampampampCronJob(定时工作计划)Demo实战
写在前面本文内容涉及: 工作计划job 的创建,参数解析,并行多work 的job 创建定时工作计划cron job 的创建Demo个别地方使用了 ansible ,不影响阅读
很多道理我憋在心里,想要跟这个世界好好的说上一说! ——烽火戏诸侯《剑来》 Job&CronJobJob:批处理工作计划
Kubernetes从1.2版本 开始支持批处理类型的应用,我们可以通过Kubernetes Job 资源对象来定义并启动一个批处理任务。
批处理任务通常 并行(或者串行) 启动多个计算进程去处理一批工作项(work item) 处理完成后,整个批处理任务结束。
K8s官网中这样描述 : Job 会创建一个或者多个 Pods,并将继续重试 Pods 的执行,直到指定数量的 Pods 成功终止。 随着 Pods 成功结束,Job 跟踪记录成功完成的 Pods 个数。 当数量达到指定的成功个数阈值时,任务(即 Job)结束。 删除 Job 的操作会清除所创建的全部 Pods。 挂起 Job 的操作会删除 Job 的所有活跃 Pod,直到 Job 被再次恢复执行。
一种简单的使用场景下,你会创建一个 Job 对象以便以一种可靠的方式运行某 Pod 直到完成。 当第一个 Pod 失败或者被删除(比如因为节点硬件失效或者重启)时,Job 对象会启动一个新的 Pod。也可以使用 Job 以并行的方式运行多个 Pod。
考虑到批处理的并行问题, Kubernetes将Job分以下三种类型。
类型
描述
Non-parallel Jobs
通常 一个Job只启动一个Pod ,除非Pod异常,才会重启该Pod ,一旦此Pod正常结束, Job将结束 。
Parallel Jobs with a fixed completion count
并行Job会启动多个Pod ,此时需要设定Job的.spec.completions 参数为一个正数,当正常结束的Pod数量达至此参数设定的值后, Job结束 。此外, Job的.spec.parallelism参数用来控制并行度 ,即同时启动几个Job来处理Work Item .
Parallel Jobs with a work queue
任务队列方式的并行Job 需要一个独立的Queue , Work item都在一个Queue中存放 ,不能设置Job的.spec.completions参数 ,此时Job有以下特性。
每个Pod都能独立判断和决定是否还有任务项需要处理。
如果某个Pod正常结束,则Job不会再启动新的Pod.
如果一个Pod成功结束,则此时应该不存在其他Pod还在工作的情况,它们应该都处于即将结束、退出的状态。
如果所有Pod都结束了,且至少有一个Pod成功结束,则整个Job成功结束。
嗯,我们就第一个,第二搞一个Demo,第三中之后有时间搞,其实就是资源配置参数的问题
环境准备 [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl config set-context $(kubectl config current-context) --namespace=liruiling-job-create Context "kubernetes-admin@kubernetes" modified. [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl create ns liruiling-job-create namespace/liruiling-job-create created [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $vim myjob.yaml 创建一个job
创建一个Job,执行 echo "hello jobs"
myjob.yaml apiVersion: batch/v1 kind: Job metadata: creationTimestamp: null name: my-job spec: template: metadata: creationTimestamp: null spec: containers: - command: - sh - -c - echo "hello jobs" - sleep 15 image: busybox name: my-job resources: {} restartPolicy: Never status: {} [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl apply -f myjob.yaml job.batch/my-job created [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get pods NAME READY STATUS RESTARTS AGE my-job--1-jdzqd 0/1 ContainerCreating 0 7s [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get jobs NAME COMPLETIONS DURATION AGE my-job 0/1 17s 17s [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get pods NAME READY STATUS RESTARTS AGE my-job--1-jdzqd 0/1 Completed 0 24s
STATUS 状态变成 Completed 意味着执行成功,查看日志 [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get jobs NAME COMPLETIONS DURATION AGE my-job 1/1 19s 46s [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl logs my-job--1-jdzqd hello jobs [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $ job的配置参数解析
job的restart策略 restartPolicy: Never Nerver : 只要任务没有完成,则是新创建pod运行,直到job完成 会产生多个pod OnFailure : 只要pod没有完成,则会重启pod,直到job完成
activeDeadlineSeconds:最大可以运行时间 [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl explain jobs.spec | grep act activeDeadlineSeconds may be continuously active before the system tries to terminate it; value given time. The actual number of pods running in steady state will be less false to true), the Job controller will delete all active Pods associated [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $vim myjobact.yaml
使用 activeDeadlineSeconds:最大可以运行时间 创建一个job
myjobact.yamlapiVersion: batch/v1 kind: Job metadata: creationTimestamp: null name: my-job spec: template: metadata: creationTimestamp: null spec: activeDeadlineSeconds: 5 #最大可以运行时间 containers: - command: - sh - -c - echo "hello jobs" - sleep 15 image: busybox name: my-job resources: {} restartPolicy: Never status: {}
超过5秒任务没有完成,所以从新创建一个pod运行 [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl delete -f myjob.yaml job.batch "my-job" deleted [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl apply -f myjobact.yaml job.batch/my-job created [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get pods NAME READY STATUS RESTARTS AGE my-job--1-ddhbj 0/1 ContainerCreating 0 7s [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get jobs NAME COMPLETIONS DURATION AGE my-job 0/1 16s 16s [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get pods NAME READY STATUS RESTARTS AGE my-job--1-ddhbj 0/1 Completed 0 23s my-job--1-mzw2p 0/1 ContainerCreating 0 3s [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get pods NAME READY STATUS RESTARTS AGE my-job--1-ddhbj 0/1 Completed 0 48s my-job--1-mzw2p 0/1 Completed 0 28s [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get jobs NAME COMPLETIONS DURATION AGE my-job 0/1 55s 55s
其他的一些参数
parallelism: N 一次性运行N个pod
completions: M job结束需要成功运行的Pod个数,即状态为Completed的pod数
backoffLimit: N 如果job失败,则重试几次
parallelism:一次性运行几个pod,这个值不会超过completions的值。创建一个并行多任务的JobapiVersion: batch/v1 kind: Job metadata: creationTimestamp: null name: my-job spec: backoffLimit: 6 #重试次数 completions: 6 # 运行几次 parallelism: 2 # 一次运行几个 template: metadata: creationTimestamp: null spec: containers: - command: - sh - -c - echo "hello jobs" - sleep 15 image: busybox name: my-job resources: {} restartPolicy: Never status: {}
创建一个有参数的job [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl apply -f myjob-parma.yaml job.batch/my-job created [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get pods jobs Error from server (NotFound): pods "jobs" not found [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get pods job Error from server (NotFound): pods "job" not found [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get jobs NAME COMPLETIONS DURATION AGE my-job 0/6 19s 19s
查看参数设置的变化,运行6个job [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get pods NAME READY STATUS RESTARTS AGE my-job--1-9vvst 0/1 Completed 0 25s my-job--1-h24cw 0/1 ContainerCreating 0 5s my-job--1-jgq2j 0/1 Completed 0 24s my-job--1-mbmg6 0/1 ContainerCreating 0 1s [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get jobs NAME COMPLETIONS DURATION AGE my-job 2/6 35s 35s [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get jobs NAME COMPLETIONS DURATION AGE my-job 3/6 48s 48s [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $ $kubectl get pods NAME READY STATUS RESTARTS AGE my-job--1-9vvst 0/1 Completed 0 91s my-job--1-b95qv 0/1 Completed 0 35s my-job--1-h24cw 0/1 Completed 0 71s my-job--1-jgq2j 0/1 Completed 0 90s my-job--1-mbmg6 0/1 Completed 0 67s my-job--1-njbfj 0/1 Completed 0 49s [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get jobs NAME COMPLETIONS DURATION AGE my-job 6/6 76s 93s 实战:计算圆周率2000位
命令行的方式创建一个job [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl create job job3 --image=perl --dry-run=client -o yaml -- perl -Mbignum=bpi -wle "print bpi(500)" apiVersion: batch/v1 kind: Job metadata: creationTimestamp: null name: job3 spec: template: metadata: creationTimestamp: null spec: containers: - command: - perl - -Mbignum=bpi - -wle - print bpi(500) image: perl name: job3 resources: {} restartPolicy: Never status: {}
拉取相关镜像,命令行创建job [root@vms81.liruilongs.github.io]-[~/ansible] $ansible node -m shell -a "docker pull perl" [root@vms81.liruilongs.github.io]-[~/ansible] $kubectl create job job2 --image=perl -- perl -Mbignum=bpi -wle "print bpi(500)" job.batch/job2 created [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get pods NAME READY STATUS RESTARTS AGE job2--1-5jlbl 0/1 Completed 0 2m4s
查看运行的job输出 [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl logs job2--1-5jlbl 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491 Cronjob(定时任务)
在 cronjob 的 yaml 文件里的 .spec.jobTemplate.spec 字段里,可以写 activeDeadlineSeconds 参数,指定 cronjob 所生成的 pod 只能运行多久
Kubernetes从1.5 版本开始增加了一种新类型的Job,即类似LinuxCron的定时任务Cron Job ,下面看看如何定义和使用这种类型的Job首先,确保Kubernetes的版本为1.8及以上 。
在 Kubernetes 1.9 版本后,kubectl 命令增加了别名cj 来表示cronjob ,同时kubectl set image/env 命令也可以作用在CronJob 对象上了。创建一个 Cronjob
每分钟创建一个pod执行一个date命令 [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl create cronjob test-job --image=busybox --schedule="*/1 * * * *" --dry-run=client -o yaml -- /bin/sh -c "date" apiVersion: batch/v1 kind: CronJob metadata: creationTimestamp: null name: test-job spec: jobTemplate: metadata: creationTimestamp: null name: test-job spec: template: metadata: creationTimestamp: null spec: containers: - command: - /bin/sh - -c - date image: busybox name: test-job resources: {} restartPolicy: OnFailure schedule: "*/1 * * * *" status: {}
可是使用yaml文件或者命令行的方式创建 [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get pods No resources found in liruiling-job-create namespace. [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl apply -f jobcron.yaml cronjob.batch/test-job configured [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get job NAME COMPLETIONS DURATION AGE test-job-27330246 0/1 0s 0s [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get pods NAME READY STATUS RESTARTS AGE test-job-27330246--1-xn5r6 1/1 Running 0 4s [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get pods NAME READY STATUS RESTARTS AGE test-job-27330246--1-xn5r6 0/1 Completed 0 100s test-job-27330247--1-9blnp 0/1 Completed 0 40s
运行 --watch 命令,可以更直观地了解Cron Job定期触发任务执行的历史和现状: [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl apply -f jobcron.yaml cronjob.batch/test-job created [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get cronjobs NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE test-job */1 * * * * False 0 12s [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get jobs --watch NAME COMPLETIONS DURATION AGE test-job-27336917 0/1 0s test-job-27336917 0/1 0s 0s test-job-27336917 1/1 25s 25s test-job-27336918 0/1 0s test-job-27336918 0/1 0s 0s test-job-27336918 1/1 26s 26s ^C [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $kubectl get jobs -o wide NAME COMPLETIONS DURATION AGE CONTAINERS IMAGES SELECTOR test-job-27336917 1/1 25s 105s test-job busybox controller-uid=35e43bbc-5869-4bda-97db-c027e9a36b97 test-job-27336918 1/1 26s 45s test-job busybox controller-uid=82d2e4a5-716c-42bf-bc7d-3137dd0e50e8 [root@vms81.liruilongs.github.io]-[~/ansible/k8s-jobs-create] $
TikTok加强对青少年的隐私保护控制路透8月13日消息,字节跳动旗下的短视频分享应用TikTok周四宣布,对青少年进行更严格的隐私保护控制,寻求解决关于未能保护儿童免受隐藏广告和不当内容影响的批评。TikTok表示,
手机运行中或下载软件时提示内存不足,什么情况又如何解决?近几年手机科技发展十分迅速,各种新技术热词不断上映,屏幕高刷新率曲面屏折叠屏16G内存5G双模海思麒麟9905G芯片和国产鸿蒙操作系统等等,现在的手机更新换代速度实在是太快了,很多
维度M40专业性价比点评维度M40今年一款性价比新品旗舰手机,维度M40游戏增强版莫属,,这次的维度M40游戏增强版在电竞手机体验方面可谓做足了功课,综合表现丝毫不逊于其他专业电竞手机。时尚的不像电竞手机
雷柏女性无线鼠标最少女心的鼠标鼠标作为大家办公最离不开的小物件之一,俨然已经成为了大家的刚需。今天要分享的及是一款外形科技感贼强而且颜值超高的雷柏乐萌系列气垫鼠标,少女心的设计真的超级能提升幸福感!大面积镂空的
腾讯极光盒子3C简评小身板亦有大作用,三种定制模式随心选你有多久没有看电视了?想必看到这个问题的时候,很多人和笔者一样,已经好久好久没打开过了,至于为什么不打开,原因在于手机比电视方便,因为手机上可以看自己想看的各种影音资源,而电视就不
中国6G迈出重要一步,北京邮电起到关键作用,被央视点名表扬在长达几十年的时间里,西方国家一直掌控着移动通讯技术的核心专利。但5G时代的到来,让我国彻底扭转了长期处于被动的局面,成功利用5G技术实现弯道超车,走在美日英等发达国家的前面。截止
原来iPhone手机隐藏7个冷知识,小技巧大作用,让手机更好用虽然一直有人说不买苹果手机了,但还是忍不住每次新机发布就入手。主要还是因为iPhone手机确实很好用,使用起来不仅流畅自如,还有非常好用的隐藏功能。这里就来分享iPhone手机隐藏
走近自然常数e,了解它梦幻般的神奇据资料介绍,自然常数e是欧拉(1707。4。151783。9。18)在写给哥德巴赫(1690。3。181764。11。20)的信中首次使用了e这个名字。1744年,欧拉证明了e是无
单反相机哪个牌子好用?人像用的是尼康,风景用的是隹能,至于那个品牌好还真看不出来。00hr对于一个想要系统学习摄影的爱好者,入手一台单反是很有必要的。现在单反主流厂商是佳能和尼康,购买单反的人一般都在者
如果微信开始收费使用,每个月5元,你们还会用微信吗?感谢您的阅读!微信月收费5元,可能微信就会被推入到深渊。替代微信的软件可都在摩拳擦掌,微信很早就在悬崖边,随时有掉落的风险。01收费的社交软件在自寻短见很多人都在聊付费平台,什么叫
被西方诬陷偷偷支援俄罗斯,大疆被迫暂停俄乌业务我国最低调的科技巨头,居然被西方包装成了俄罗斯背后的军火商。这家公司就是全世界最会造无人机的大疆,不久之前,乌克兰某高官在社交平台发文炮轰大疆只给俄罗斯用云哨系统而不给乌克兰用,这