kubelet監控叢集節點的 CPU、記憶體、磁碟空間和檔案系統的inode 等資源,根據kubelet啟動引數中的驅逐策略設定,當這些資源中的一個或者多個達到特定的消耗水平,kubelet 可以主動地驅逐節點上一個或者多個pod,以回收資源,降低節點資源壓力。
kubelet結合以下資料項來做出驅逐決定:
(1)驅逐訊號;
(2)驅逐策略;
(3)驅逐監測間隔;
節點上的memory、nodefs、pid等資源都有驅逐訊號,kubelet通過將驅逐訊號與驅逐策略進行比較來做出驅逐決定;
驅逐訊號列舉如下:
(1)memory.available
;
(2)nodefs.available
;
(3)nodefs.inodesFree
;
(4)imagefs.available
;
(5)imagefs.inodesFree
;
(6)pid.available
;
kubelet支援以下檔案系統分割區:
(1)nodefs:節點的主要檔案系統,用於本地磁碟卷、emptyDir、紀錄檔儲存等。 例如,nodefs包含/var/lib/kubelet/
;
(2)imagefs:可選檔案系統,供容器執行時儲存容器映象和容器可寫層。
kubelet節點壓力驅逐包括了兩種,軟碟機逐和硬驅逐;
軟碟機逐機制表示,當node節點的memory、nodefs等資源達到一定的閾值後,需要持續觀察一段時間(寬限期),如果期間該資源又恢復到低於閾值,則不進行pod的驅逐,若高於閾值持續了一段時間(寬限期),則觸發pod的驅逐。
kubelet軟碟機逐相關啟動引數設定:
(1)eviction-soft
:一組軟碟機逐條件,如memory.available<1.5Gi,nodefs.available<500Mi
, 如果驅逐條件持續時長超過對應的驅逐寬限期,則觸發pod驅逐;
(2)eviction-soft-grace-period
:一組軟碟機逐寬限期,如memory.available=1m30s,nodefs.available=1m30s
;
(3)eviction-max-pod-grace-period
:pod被軟碟機逐時,停止pod中container的最大寬限期,預設值0,單位秒;
硬驅逐策略沒有寬限期,當達到硬驅逐條件時,kubelet會立即觸發pod的驅逐,而不是優雅終止。
kubelet硬驅逐相關啟動引數設定:
(1)eviction-hard
:一組硬驅逐條件,如memory.available<1Mi,nodefs.available<1Mi,nodefs.inodesFree<1
,kubelet的預設硬驅逐條件為memory.available<100Mi,nodefs.available<10%,imagefs.available<15%,nodefs.inodesFree<5%
;
(1)最小驅逐回收--eviction-minimum-reclaim
;
在某些情況下,驅逐pod只能回收少量的資源,這可能導致頻繁滿足驅逐條件而觸發驅逐操作;
為了解決上述問題,可以設定--eviction-minimum-reclaim
引數,當因某個驅逐訊號而觸發驅逐,驅逐回收後的資源量不再滿足驅逐條件後,會繼續回收--eviction-minimum-reclaim
引數設定的資源量;
如果某一次驅逐邏輯中沒有驅逐pod,則會等待10s後再進行下一次的驅逐邏輯輪詢呼叫;
對於因記憶體資源緊張而發生驅逐時,kubelet根據以下情況來確定pod的驅逐順序:
(1)pod的實際資源使用量是否超過其請求量,超過的優先被驅逐;
(2)pod的優先順序定義(pod.Spec.Priority
),值越小越容易被驅逐;
(3)pod實際資源使用量與其請求量的差值大小,差值越小,則越容易被驅逐;
對於因pid資源緊張而發生驅逐時,kubelet根據以下情況來確定pod的驅逐順序:
(1)pod的優先順序定義(pod.Spec.Priority
),值越小越容易被驅逐;
對於因可用nodefs大小、nodefs inode資源緊張而發生驅逐時,kubelet根據以下情況來確定pod的驅逐順序:
(1)pod對於資源的實際使用(包括pod的本地卷與pod中所有容器的紀錄檔),實際使用量超過請求量的優先被驅逐;
(2)pod對於資源的實際使用(包括pod的本地卷與pod中所有容器的紀錄檔)與其請求量之間的差值大小,差值越小,則越容易被驅逐;
對於因可用imagefs大小、imagefs inode資源緊張而發生驅逐時,kubelet根據以下情況來確定pod的驅逐順序:
(1)pod容器可寫層資源的實際使用,實際使用量超過請求量的優先被驅逐;
(2)pod容器可寫層資源的實際使用與其請求量之間的差值大小,差值越小,則越容易被驅逐;
對於因可用fs大小、inode資源緊張而發生驅逐時,kubelet根據以下情況來確定pod的驅逐順序:
(1)pod對於資源的實際使用(包括pod容器可寫層、pod的本地卷與pod中所有容器的紀錄檔),實際使用量超過請求量的優先被驅逐;
(2)pod對於資源的實際使用(包括pod容器可寫層、pod的本地卷與pod中所有容器的紀錄檔)與其請求量之間的差值大小,差值越小,則越容易被驅逐;
當nodefs(kubelet的根檔案系統)與imagefs(docker映象儲存的檔案系統)所在分割區相同時,判斷為無專用imagefs檔案系統,否則判斷為有專用imagefs檔案系統;
總結一下就是,nodefs是kubelet啟動引數--root-dir
目錄所在分割區,imagefs是docker安裝目錄所在的分割區;
(1)根據kubelet啟動引數設定,獲取驅逐策略設定;
(2)從cAdvisor、CRIRuntimes獲取各種統計資訊,如節點上各個資源的總量以及使用量情況、容器的資源宣告及使用量情況等;
(3)比對驅逐策略設定以及上述的各種資源統計資訊,篩選出會觸發驅逐的驅逐訊號;
(4)將上面篩選出來的驅逐訊號做排序,將記憶體驅逐訊號排在所有其他訊號之前,並從排序後的結果中取出第一個驅逐訊號;
(5)主動嘗試回收fs、inode資源,如果回收的資源足夠,則直接return,不需要往下執行驅逐pod的邏輯;
(6)根據最終篩選出來的那一個驅逐訊號,使用對應的排序函數給pod列表進行排序;
(7)遍歷排序後的pod列表,嘗試驅逐pod;
幾個注意點:
(1)每次的驅逐流程,最多隻驅逐一個pod;
(2)一次驅逐流程完成後,如果本次流程有驅逐pod,則馬上繼續迴圈執行pod驅逐流程,如果本次驅逐流程沒有驅逐pod,則等待10s後再回圈執行pod驅逐流程;
(3)驅逐pod,只是將pod.status.phase
值更新為Failed
,並附上驅逐reason:Evicted
以及觸發驅逐的詳細資訊,不會刪除pod;而pod.status.phase
值被更新為Failed
後,replicaset controller會再次建立出新的pod呼叫到其他節點上,達到驅逐pod的效果;
當因fs、inode資源緊張而需要驅逐pod時,會在驅逐pod之前,先嚐試主動回收fs、inode資源;
對於因可用nodefs大小、nodefs inode資源緊張而發生驅逐時,不會觸發主動回收fs、inode資源;
對於因可用imagefs大小、imagefs inode資源緊張而發生驅逐時,會觸發下列操作來主動回收fs、inode資源:
(1)刪除已停止的容器;
(2)刪除沒有被使用的容器映象;
對於因可用fs大小、fs inode資源緊張而發生驅逐時,會觸發下列操作來主動回收fs、inode資源:
(1)刪除已停止的容器;
(2)刪除沒有被使用的容器映象;
kubelet監控叢集節點的 CPU、記憶體、磁碟空間和檔案系統的inode 等資源,根據kubelet啟動引數中的驅逐策略設定,當這些資源中的一個或者多個達到特定的消耗水平,kubelet 可以主動地驅逐節點上一個或者多個pod,以回收資源,降低節點資源壓力。
本篇文章從什麼時候發生驅逐、驅逐哪些pod、怎麼驅逐pod三個角度對kubelet節點壓力驅逐進行了分析。
下一篇將對kubelet節點壓力驅逐做一下原始碼分析。