1. 程式人生 > >kubernetes之Cronjob定時任務

kubernetes之Cronjob定時任務

失敗 ada ubun nbsp lin delet 限制 功能 ide

Cronjob從名字上可以看到,它就是一個計劃任務,與Linux中的crontab無異,其格式基本上都crontab一樣,

其格式如下:

  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定時任務