1. 程式人生 > >【讀書筆記】Cronjob原理及源碼分析

【讀書筆記】Cronjob原理及源碼分析

之前 jobs 所有 res net pes 垃圾回收gc ive 發現


原文鏈接:https://mp.weixin.qq.com/s?__biz=MzI0NjI4MDg5MQ==&mid=2715291842&idx=1&sn=e605f9b4099d946f94ca6783a8e4a6f6

背景:

??? CronJob是Kubernetes提供的定時任務功能,CronJob可以根據你指定的cron策略來完成任務。我們在使用CronJob的時候,我們發現,當創建一個CronJob的時候,只會創建一個CronJob,當到指定時間時,會創建一個job和一個pod,隨著時間的推移,我們會發現,越來越多的job和pod,甚至是滿屏的job和pod,我們在調用API刪除這個cronjob的時候,發現只會刪除cronjob這個資源,而不會刪除對應的已有的job和pod,然後,我們嘗試刪除job,發現刪除job,會把對應的pod刪除掉,為什麽好多的操作不符合心理預期呢?心裏冒著十萬個為什麽?

原作者疑問

1. cronjob是怎麽定時創建job的呢?

2. 為什麽刪除的時候,只是刪除了cronjob,而沒有刪除對應的job和pod呢?

3. cronjob、job和pod之間的關系是怎麽樣的呢?

4. job和pod的關系是怎麽對應上的呢?

原作者答案

Q:cronjob和job是如何維護關系的呢?

A: cronjob和job關系,使用了types.UID,來判斷的,每個cronjob擁有唯一的UID,然後列出所有的jobs,使用遍歷job的策略來判斷job應該屬於哪個cronjob。

Q:job和pod的關系是怎麽樣維護的呢?

A: 先拿到了job中的Selector,然後,根據選擇器來獲取對應標簽的pods

Q:cronjob是怎麽定時創建job的呢?

A: 通過代碼發現,cronjob會在後臺啟動一個go程,後臺一直在處理cronjob,job和pod,同時也在維護cornjob的Active列表數據的正確性,同時,我們也在syncOne()函數中找到了他後臺周期期創建job的操作。job是cronjob-controller創建的,邏輯是,當創建一個cronjob後,會把這個cronjob交接到cronjob-controller下的goroutine,然後就返回了,正在創建任務的是controller下的goroutine。

Q:刪除是cronjob,為何沒有刪除對應的job和pod?

A: 刪除的時候,會首先檢查並發job的並發策略,如果不為0,會設置為0,並更新這個job的狀態,然後找到對應的pod,刪除完pod後再刪除job本身,如果有一個pod刪除失敗,會直接退出而不會刪除job。刪除完job後,再從cronjob的Active列表中移除job。

對於刪除cronjob,可能沒有立即刪除job和pod,是因為刪除的時候會有三種策略,即:

DeletionPropagation string="Orphan","Foreground"(默認),"Background"

Orphan:垃圾回收GC自動觸發;

Background:垃圾回收器會在後臺執行刪除(手動觸發,立即後臺處理)。

Foreground:API調用後會設置刪除的過期時間,並把他放入到要刪除的隊列,在沒刪除之前,前臺一直可見(手動觸發,可能不立即處理)。

當真正執行Delete(或者其他操作)的時候,根據資源獲取resource,然後重新組裝deleteOptions策略,然後刪除。

# 註意,刪除cronjob的時候不會自動刪除job,這些job可以用kubectl delete job來刪除

參考鏈接:

Cronjob源碼地址http://github.com/kubernetes/kubernetes/pkg/controller/cronjob/cronjob_controller.go

Cronjob中文文檔:https://www.kubernetes.org.cn/cronjob

【讀書筆記】Cronjob原理及源碼分析