執(zhí)行一次,或者批量執(zhí)行處理程序,完成之后退出容器。 注意: 如果容器內(nèi)執(zhí)?..."/>
您好,登錄后才能下訂單哦!
服務(wù)類的Pod容器:RC、RS、DS、Deployment
工作類的Pod容器:Job--->執(zhí)行一次,或者批量執(zhí)行處理程序,完成之后退出容器。
注意: 如果容器內(nèi)執(zhí)行任務(wù)有誤,會根據(jù)容器的重啟策略操作容器,不過這里
的容器重啟策略只能是: Never和 OnFailure。
在有些場景下,是想要運(yùn)行一些容器執(zhí)行某種特定的任務(wù),任務(wù)一旦執(zhí)行完成,容器也就沒有存在的必要了。在這種場景下,創(chuàng)建pod就顯得不那么合適。于是就是了Job,Job指的就是那些一次性任務(wù)。通過Job運(yùn)行一個(gè)容器,當(dāng)其任務(wù)執(zhí)行完以后,就自動(dòng)退出,集群也不再重新將其喚醒。
從程序的運(yùn)行形態(tài)上來區(qū)分,可以將Pod分為兩類:長時(shí)運(yùn)行服務(wù)(jboss、mysql等)和一次性任務(wù)(數(shù)據(jù)計(jì)算、測試)。RC創(chuàng)建的Pod都是長時(shí)運(yùn)行的服務(wù),Job多用于執(zhí)行一次性任務(wù)、批處理工作等,執(zhí)行完成后便會停止(status.phase變?yōu)镾ucceeded)。
主機(jī) | IP地址 | 服務(wù) |
---|---|---|
master | 192.168.1.21 | k8s |
node01 | 192.168.1.22 | k8s |
node02 | 192.168.1.23 | k8s |
基于[ https://blog.51cto.com/14320361/2464655]() 的實(shí)驗(yàn)繼續(xù)進(jìn)行
- 非并行job:通常創(chuàng)建一個(gè)pod直至其成功結(jié)束。
- 固定結(jié)束次數(shù)的job:設(shè)置spec.completions,創(chuàng)建多個(gè)pod,直到.spec.completions個(gè)pod成功結(jié)束。
- 帶有工作隊(duì)列的并行job:設(shè)置.spec.Parallelism但不設(shè)置.spec.completions,當(dāng)所有pod結(jié)束并且至少一個(gè)成功時(shí),job就認(rèn)為是成功。
Job Controller負(fù)責(zé)根據(jù)Job Spec創(chuàng)建pod,并持續(xù)監(jiān)控pod的狀態(tài),直至其成功結(jié)束,如果失敗,則根據(jù)restartPolicy(只支持OnFailure和Never,不支持Always)決定是否創(chuàng)建新的pod再次重試任務(wù)。
[root@master yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:
name: test-job
spec:
template:
metadata:
name: test-job
spec:
containers:
- name: hello
image: busybox
command: ["echo","hello k8s job!"]
restartPolicy: Never
[root@master yaml]# kubectl apply -f jop.yaml
[root@master yaml]# kubectl get pod
[root@master yaml]# kubectl logs test-job-gs45w
我們可以看到j(luò)ob與其他資源對象不同,僅執(zhí)行一次性任務(wù),默認(rèn)pod借宿運(yùn)行后job即結(jié)束,狀態(tài)為Completed。
[root@master yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:
name: test-job
spec:
template:
metadata:
name: test-job
spec:
containers:
- name: hello
image: busybox
command: ["asdasxsddwefew","hello k8s job!"] #修改
restartPolicy: Never
[root@master yaml]# kubectl delete jobs.batch test-job
[root@master yaml]# kubectl apply -f jop.yaml
[root@master yaml]# kubectl get pod -w
它會一直創(chuàng)建pod直到完成命令。
[root@master yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:
name: test-job
spec:
template:
metadata:
name: test-job
spec:
containers:
- name: hello
image: busybox
command: ["asdasxsddwefew","hello k8s job!"]
restartPolicy: OnFailure
[root@master yaml]# kubectl delete jobs.batch test-job
[root@master yaml]# kubectl apply -f jop.yaml
[root@master yaml]# kubectl get pod -w
它會一直重啟pod完成命令,直到重啟到一定次數(shù)就會刪除job。
[root@master yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:
name: test-job
spec:
parallelism: 2 #同時(shí)啟用幾個(gè)pod
template:
metadata:
name: test-job
spec:
containers:
- name: hello
image: busybox
command: ["echo","hello k8s job!"]
restartPolicy: OnFailure
[root@master yaml]# kubectl apply -f jop.yaml
[root@master yaml]# kubectl get pod
[root@master yaml]# vim jop.yaml
kind: Job
apiVersion: batch/v1
metadata:
name: test-job
spec:
complations: 8 #運(yùn)行pod的總數(shù)量8個(gè)
parallelism: 2 #同時(shí)運(yùn)行2個(gè)pod
template:
metadata:
name: test-job
spec:
containers:
- name: hello
image: busybox
command: ["echo","hello k8s job!"]
restartPolicy: OnFailure
job 字段解釋:
completions:標(biāo)志Job結(jié)束需要成功運(yùn)行的Pod個(gè)數(shù),默認(rèn)為1
parallelism:標(biāo)志并行運(yùn)行的Pod的個(gè)數(shù),默認(rèn)為1
activeDeadlineSeconds:標(biāo)志失敗Pod的重試最大時(shí)間,超過這個(gè)時(shí)間不會繼續(xù)重試.
[root@master yaml]# kubectl delete jobs.batch test-job
[root@master yaml]# kubectl apply -f jop.yaml
[root@master yaml]# kubectl get pod
可以看到pod是兩個(gè)兩個(gè)的啟動(dòng)的。
[root@master yaml]# vim cronjop.yaml
kind: CronJob
apiVersion: batch/v1beta1
metadata:
name: hello
spec:
schedule: "*/1 * * * *" #限定時(shí)間
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["echo","hello","cronjob"]
restartPolicy: OnFailure
[root@master yaml]# kubectl delete jobs.batch test-job
[root@master yaml]# kubectl apply -f jop.yaml
[root@master yaml]# kubectl get pod
[root@master yaml]# kubectl get cronjobs.batch
此時(shí)查看Pod的狀態(tài),會發(fā)現(xiàn),每分鐘都會運(yùn)行一個(gè)新的Pod來執(zhí)行命令規(guī)定的任
務(wù)。
[root@master yaml]# vim cronjop.yaml
kind: CronJob
apiVersion: batch/v1beta1
metadata:
name: hello
spec:
schedule: "5 10 15 1 *" #限定時(shí)間
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["echo","hello","cronjob"]
restartPolicy: OnFailure
[root@master yaml]# kubectl delete cronjobs.batch hello
[root@master yaml]# kubectl apply -f jop.yaml
[root@master yaml]# kubectl get pod
這時(shí)會發(fā)現(xiàn),如果規(guī)定具體時(shí)間,可能并不會執(zhí)行任務(wù)。
[root@master yaml]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
spec:
containers:
- command:
- kube-apiserver
- --runtime-config=batch/v2alpha1=true #添加
[root@master yaml]# systemctl restart kubelet.service
[root@master yaml]# kubectl api-versions
[root@master yaml]# vim cronjop.yaml
kind: CronJob
apiVersion: batch/v1beta1
metadata:
name: hello
spec:
schedule: "47 10 15 1 *" #限定時(shí)間
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["echo","hello","cronjob"]
restartPolicy: OnFailure
[root@master yaml]# kubectl apply -f jop.yaml
[root@master yaml]# kubectl get pod -w
注意:此時(shí)仍然不能正常運(yùn)行指定時(shí)間的Job,這是因?yàn)镵8s官方在cronjob這個(gè)資源對象的支持中還沒有完善此功能,還待開發(fā)。
跟Job資源一樣在cronjob.spec.jobTemplate.spec 下同樣支持并發(fā)Job參數(shù):
parallelism,也支持完成Pod的總數(shù)參數(shù): completionsr
Job 作為 Kubernetes 中用于處理任務(wù)的資源,與其他的資源沒有太多的區(qū)別,它也使用 Kubernetes 中常見的控制器模式,監(jiān)聽 Informer 中的事件并運(yùn)行 syncHandler
同步任務(wù)
而 CronJob 由于其功能的特殊性,每隔 10s 會從 apiserver 中取出資源并進(jìn)行檢查是否應(yīng)該觸發(fā)調(diào)度創(chuàng)建新的資源,需要注意的是 CronJob 并不能保證在準(zhǔn)確的目標(biāo)時(shí)間執(zhí)行,執(zhí)行會有一定程度的滯后。
兩個(gè)控制器的實(shí)現(xiàn)都比較清晰,只是邊界條件比較多,分析其實(shí)現(xiàn)原理時(shí)一定要多注意。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。