k8s驅逐篇(2)-kubelet節點壓力驅逐
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節點壓力驅逐做一下原始碼分析。
- 記一次批量更新整型型別的列 → 探究 UPDATE 的使用細節
- 編碼中的Adapter,不僅是一種設計模式,更是一種架構理念與解決方案
- 執行緒池底層原理詳解與原始碼分析
- 30分鐘掌握 Webpack
- 線性迴歸大結局(嶺(Ridge)、 Lasso迴歸原理、公式推導),你想要的這裡都有
- Django 之路由層
- 【前端必會】webpack loader 到底是什麼
- day42-反射01
- 中心化決議管理——雲端分析
- HashMap底層原理及jdk1.8原始碼解讀
- 詳解JS中 call 方法的實現
- 列印 Logger 日誌時,需不需要再封裝一下工具類?
- 初識設計模式 - 代理模式
- 設計模式---享元模式
- 密碼學奇妙之旅、01 CFB密文反饋模式、AES標準、Golang程式碼
- [ML從入門到入門] 支援向量機:從SVM的推導過程到SMO的收斂性討論
- 從應用訪問Pod元資料-DownwardApi的應用
- Springboot之 Mybatis 多資料來源實現
- Java 泛型程式設計
- CAS核心思想、底層實現