Cronjob從名字上能夠看到,它就是一個計劃任務,與Linux中的crontab無異,其格式基本上都crontab同樣,docker
其格式以下: ubuntu
Minutes Hours DayofMonth Month DayofWeek Yea
支持 ", - * / "四個字符,api
*:表示匹配任意值,若是在Minutes 中使用,表示每分鐘bash
/: 表示起始時間開始觸發,而後每隔固定時間觸發一次,ide
例如在Minutes 設置的是5/20,則表示第一次觸發是在第5min時,接下來每20min觸發一次,3d
即,第25min,45min等時刻觸發rest
示例:好比每隔1min執行一次任務:則Cron 表達式以下:日誌
*/1 * * * *
如今編寫一個Cronjob資源對象來執行job: 對象
Cronjob 在Kubernetes1.8版本以前使用的API版本是batch/v2alpha1, 須要在API Server啓動時啓用此功能:crontab
--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 NAME:
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就是這麼簡單。