容器按照持續運行的時間可以分為兩類:服務類容器和工作類容器
服務類容器:持續提供服務
工作類容器:一次性任務,處理完后容器就退出
Deployment,replicaset和daemonset都用於管理服務類容器,
對於工作類的容器,我們用job
編輯一個簡單的job類型的yml文件
1.apiversion:當前job的apiversion是batch/v1
2.kind:當前的資源類型是job
3.restartpolicy指定什么情況下需要重啟容器。對於job只能設置為never或者onfailure
對於其他的controller(比如deployment,replicaset等)可以設置為always
創建job應用
通過kubectl get job進行查看
顯示destire為1,成功1
說明是按照預期啟動了一個pod,並且成功執行
查看pod的狀態
由於myjob的pod處於completed的狀態,所以需要加--show-all參數才能顯示出來
通過kubectl logs 查看pod標准輸出
如果job沒有執行成功,怎么辦?
修改job.yml文件,故意引起一個錯誤,然后重新啟動myjob
先將原來的job刪除
然后重新啟動一個新的job
重新啟動一個job,我們發現有一個未成功的job,查看pod的時候竟然有兩個job相關的pod,目標job只有1個啊,為什么??
我們再次查看一下
目前達到了6個
原因是:當地一個pod啟動時,容器失敗退出,根據restartPolicy:Never,此失敗容器不會被重啟,但是job destired的pod是1,目前successful為1。由於我們的命令是錯誤的,successful永遠不能到1,
job contorller會一直創建新的pod達到job得期望狀態,最多重新創建6次,因為K8S為job提供了spec.bakcofflimits來限制重試次數,默認為6.
如果將restartpolicy設置為OnFailure會怎么樣?我們來實驗一下
修改job.yml文件
將restartpolicy修改為OnFailure
重新啟動job.yml
pod數量只有1,job為失敗得狀態
但是pod得restart得次數在變化,說明onfailure生效,容器失敗后會自動重啟
並行執行job
之前我們得實驗都是一次運行一個job里只有一個pod,當我們同時運行多個pod得時候,怎么進行設置呢?
可以通過:parallelism設置
修改job.yml文件
此次我們執行一個job同時運行3個pod
kubectl apply -f job.yml
job一共啟動了3個pod,而且AGE相同,說明是並行運行得。
還可以通過completions設置job成功完成pod的總數;
配置含義:每次運行3個pod,知道運行了6個結束
重新執行一下
kubectl apply -f job.yml
也不是很准,但是確實不是同時並行啟動的
定時執行job
kubernetes提供了類似crontab定時執行任務的功能
首先修改apiserver使api支持cronjob
vim /etc/kubernetes/manifests/kube-apiserver.yaml
- --runtime-config=batch/v1beta1=true 加入這一行
保存退出
kubectl apiversions 查看api版本(如果這里沒有生效的話,需要重啟kubelet這個服務)
systemctl restart kubelet.service
修改yml文件如下:
apiVersion: batch/v1beta1 batch/v1beta1當前cronjob的apiserver
kind: CronJob 當前資源類型為cronjob
metadata:
name: cronjob
spec:
schedule: "*/1 * * * *" 指定什么時候運行job,格式與linux中的計划任務一致
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
command: ["echo","hello k8s job!"]
restartPolicy: OnFailure
~
運行這個job
kubectl apply -f job.yml
如果出現一下錯誤請一定要檢查yml文件的內容,進行修改
正常運行如下:
查看cronjob
kubectl get cronjob
查看job,通過時間間隔可以看到,每1分種創建一個pod
kubectl get job
查看pod日志
刪除cronjob
kubectl delete cronjob cronjob