kubelet節點壓力驅逐。kubelet監控叢集節點的 CPU、記憶體、磁盤空間和檔案系統的inode 等資源,根據kubelet啟動參數中的驅逐政策配置,當這些資源中的一個或者多個達到特定的消耗水準,kubelet 可以主動地驅逐節點上一個或者多個pod,以回收資源,降低節點資源壓力。
kubelet節點壓力驅逐
kubelet監控叢集節點的 CPU、記憶體、磁盤空間和檔案系統的inode 等資源,根據kubelet啟動參數中的驅逐政策配置,當這些資源中的一個或者多個達到特定的消耗水準,kubelet 可以主動地驅逐節點上一個或者多個pod,以回收資源,降低節點資源壓力。
基于kubernets v1.17.4
1.什麼時候發生驅逐
kubelet結合以下資料項來做出驅逐決定:
(1)驅逐信号;
(2)驅逐政策;
(3)驅逐監測間隔;
1.1 驅逐信号
節點上的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:可選檔案系統,供容器運作時存儲容器鏡像和容器可寫層。
1.2 驅逐政策
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
參數配置的資源量;
1.3 驅逐監測間隔
如果某一次驅逐邏輯中沒有驅逐pod,則會等待10s後再進行下一次的驅逐邏輯輪詢調用;
2.驅逐哪些pod
2.1 記憶體資源
對于因記憶體資源緊張而發生驅逐時,kubelet根據以下情況來确定pod的驅逐順序:
(1)pod的實際資源使用量是否超過其請求量,超過的優先被驅逐;
(2)pod的優先級定義(
pod.Spec.Priority
),值越小越容易被驅逐;
(3)pod實際資源使用量與其請求量的內插補點大小,內插補點越小,則越容易被驅逐;
2.2 pid資源
對于因pid資源緊張而發生驅逐時,kubelet根據以下情況來确定pod的驅逐順序:
(1)pod的優先級定義(
pod.Spec.Priority
),值越小越容易被驅逐;
2.3 fs資源
2.3.1 有專用imagefs檔案系統
對于因可用nodefs大小、nodefs inode資源緊張而發生驅逐時,kubelet根據以下情況來确定pod的驅逐順序:
(1)pod對于資源的實際使用(包括pod的本地卷與pod中所有容器的日志),實際使用量超過請求量的優先被驅逐;
(2)pod對于資源的實際使用(包括pod的本地卷與pod中所有容器的日志)與其請求量之間的內插補點大小,內插補點越小,則越容易被驅逐;
對于因可用imagefs大小、imagefs inode資源緊張而發生驅逐時,kubelet根據以下情況來确定pod的驅逐順序:
(1)pod容器可寫層資源的實際使用,實際使用量超過請求量的優先被驅逐;
(2)pod容器可寫層資源的實際使用與其請求量之間的內插補點大小,內插補點越小,則越容易被驅逐;
2.3.2 無專用imagefs檔案系統
對于因可用fs大小、inode資源緊張而發生驅逐時,kubelet根據以下情況來确定pod的驅逐順序:
(1)pod對于資源的實際使用(包括pod容器可寫層、pod的本地卷與pod中所有容器的日志),實際使用量超過請求量的優先被驅逐;
(2)pod對于資源的實際使用(包括pod容器可寫層、pod的本地卷與pod中所有容器的日志)與其請求量之間的內插補點大小,內插補點越小,則越容易被驅逐;
關于是否有專用imagefs檔案系統的判斷
當nodefs(kubelet的根檔案系統)與imagefs(docker鏡像存儲的檔案系統)所在分區相同時,判斷為無專用imagefs檔案系統,否則判斷為有專用imagefs檔案系統;
總結一下就是,nodefs是kubelet啟動參數
--root-dir
目錄所在分區,imagefs是docker安裝目錄所在的分區;
3.怎麼驅逐pod
pod驅逐流程
(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資源
當因fs、inode資源緊張而需要驅逐pod時,會在驅逐pod之前,先嘗試主動回收fs、inode資源;
有專用imagefs檔案系統
對于因可用nodefs大小、nodefs inode資源緊張而發生驅逐時,不會觸發主動回收fs、inode資源;
對于因可用imagefs大小、imagefs inode資源緊張而發生驅逐時,會觸發下列操作來主動回收fs、inode資源:
(1)删除已停止的容器;
(2)删除沒有被使用的容器鏡像;
無專用imagefs檔案系統
對于因可用fs大小、fs inode資源緊張而發生驅逐時,會觸發下列操作來主動回收fs、inode資源:
(1)删除已停止的容器;
(2)删除沒有被使用的容器鏡像;
總結
kubelet監控叢集節點的 CPU、記憶體、磁盤空間和檔案系統的inode 等資源,根據kubelet啟動參數中的驅逐政策配置,當這些資源中的一個或者多個達到特定的消耗水準,kubelet 可以主動地驅逐節點上一個或者多個pod,以回收資源,降低節點資源壓力。
本篇文章從什麼時候發生驅逐、驅逐哪些pod、怎麼驅逐pod三個角度對kubelet節點壓力驅逐進行了分析。
下一篇将對kubelet節點壓力驅逐做一下源碼分析。