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

語言: CN / TW / HK

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