天天看點

k8s驅逐篇(2)-kubelet節點壓力驅逐

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節點壓力驅逐做一下源碼分析。

繼續閱讀