kubernetes之Cronjob定時任務
其格式如下:
Minutes Hours DayofMonth Month DayofWeek Yea
支持 ", - * / "四個字符,
*:表示匹配任意值,如果在Minutes 中使用,表示每分鐘
/: 表示起始時間開始觸發,然後每隔固定時間觸發一次,
例如在Minutes 設置的是5/20,則表示第一次觸發是在第5min時,接下來每20min觸發一次,
即,第25min,45min等時刻觸發
示例:比如每隔1min執行一次任務:則Cron 表達式如下:
*/1 * * * *
現在編寫一個Cronjob資源對象來執行job:
Cronjob 在Kubernetes1.8版本之前使用的API版本是batch/v2alpha1, 需要在API Server啟動時啟用此功能:
--runtime-config=batch/v2alpha1=true
在版本>1.8後,API版本已轉為batch/v1beta1,並且默認啟用。
apiVersion: batch/v1beta1 kind: CronJob metadata: name: hello #Cronjob的名稱 spec: schedule: "*/1 * * * *" #job執行的周期,cron格式的字符串 jobTemplate: #job模板 spec: template: spec: containers: - name: hello-cronjob image: 10.3.1.15:5000/ubuntu:16.04 command: ["bash","-c","date;echo Hello from the Kubernetes cluste"] #job具體執行的任務 restartPolicy: OnFailure
創建並查看任務狀態:
root@ubuntu15:# kubectl get cronjob NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello */1 * * * * False 0 <none> #剛創建還沒有活躍的工作,也沒有計劃任何工作
然後,每隔一分鐘執行kubectl get cronjob hello 查看任務狀態,發現的確是每分鐘調度了一次。
root@ubuntu# kubectl get cronjob hello NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello */1 * * * * False 1 Thu, 01 Feb 2018 06:22:00 +0000 root@ubuntu15:/data/yaml# kubectl get cronjob hello NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello */1 * * * * False 0 Thu, 01 Feb 2018 06:22:00 +0000 #可以看到在指定的時間內已成功執行了一個job,在LAST-SCHEDULE,目前有0個活動作業,意味著作業已完成或失敗。
通過在Node查找Cronjob對應的容器,可以看到每隔一分鐘產生一個容器,執行完後就會正常退出,而不會再重啟容器。
root@ubuntu:/# docker ps -a |grep hello-cronjob 94f0e79db981 10.3.1.15:5000/ubuntu "bash -c 'date;ech..." 11 seconds ago Exited (0) 11 seconds ago k8s_hello-cronjob_hello-15174... 3d79b4e4a8f0 10.3.1.15:5000/ubuntu "bash -c 'date;ech..." About a minute ago Exited (0) About a minute ago k8s_hello-cronjob_hello-15176... f5d99c855c77 10.3.1.15:5000/ubuntu "bash -c 'date;ech..." 2 minutes ago Exited (0) 2 minutes ago k8s_hello-cronjob_hello-15174... 0fd8f23cb624 10.3.1.15:5000/ubuntu "bash -c 'date;ech..." 3 minutes ago Exited (0) 3 minutes ago k8s_hello-cronjob_hello-15174...
查看任意容器的日誌:
root@ubuntu:/# docker logs 96f93b1dbf53 Thu Feb 1 06:08:19 UTC 2018 Hello from the Kubernetes cluste root@ubuntu:/# docker logs 2271a37d07b4 Thu Feb 1 06:07:19 UTC 2018 Hello from the Kubernetes cluste #兩個相臨的時間的容器剛好是一分鐘執行一次命令。
如上每一次執行一次任務就會產生一個容器,且任務執行完成後就會正常退出容器,根據在定義contains
重啟策略為 OnFailure所以不會再重啟容器,下次執行任務的時間到了就會再啟動一個容器來執行,
這樣就會不會造成很多Exited的容器,但是Kubernetes
不會讓它出現這樣的情況的,在CronJob中有個字段來限制歷史作業的個數:
.spec.successfulJobsHistoryLimit: #成功完成的作業保存多少個,默認為3 .spec.failedJobsHistoryLimit: #失敗的作業保存多少個,默認為1 # 設置為0則不會保存。這兩個字段與jobTemplate同級.
使用如下命令可更加直觀的實時看到每次Cron Job定期觸發任務執行的歷史和現狀情況:
root@ubuntu:/# kubectl get job --watch NAME DESIRED SUCCESSFUL AGE hello-1517466900 1 1 2m hello-1517466960 1 1 1m hello-1517467500 1 1 46s 其中,NAME為CronJob的名稱,每一次執行任務都會啟動一個Pod SUCCESSFUL 列為1,表示任務執行成功。
找出由CronJob資源對象創建出來的Pod: 可以通過上面的CronJob
root@ubuntu:/# kubectl get pods --show-all -o wide |grep hello-1517467500 hello-1517467500-brhlx 0/1 Completed 0 56s <none> 10.3.1.16
找到對應的Pod後,查看它的日誌:
root@ubuntu:/# kubectl logs hello-1517467980-q9dvk Thu Feb 1 06:33:13 UTC 2018 Hello from the Kubernetes cluste #正式前面設置的命令輸出結果
如果不需要這個CronJob,刪除之:
root@ubuntu:/# kubectl delete cronjob hello
Cronjob就是這麽簡單。
kubernetes之Cronjob定時任務