引發Pod驅逐的原因
最近在處理一個項目的k8s集羣時,頻繁遇到pod在不同節點驅逐的現象。
如此頻繁的驅逐引發了"節點狀態振盪",是某node節點或多個Node節點出發了"驅逐信號"造成的。
集羣由1個master和4台node組成,經仔細檢查發現存在如下問題:
- 其中master-node節點和另外3台node節點內核為3.10版本,只有一台node節點為5.4的新版內核
- 其中一台node節點文件句柄數沒有修改為,1024
- 五台的磁盤空間均比較小,但是經查有3台可以通過邏輯卷擴容
-
磁盤佔用率,已經發現有2台出現磁盤佔用率超過80%的現象
kubelet 有如下所示的默認硬驅逐閾值:memory.available<100Mi nodefs.available<10% nodefs.inodesFree<5% imagefs.available<15%
由上可見,文件句柄數過小和磁盤空間使用過高都會觸發閾值,內核版本過低可能造成資源分配不平衡及內存佔用高(內存泄漏風險)也會引發驅逐。
如上逐一解決後,觀察一週時間,至今還沒有發生驅逐現象
總結:在集羣規模較小的情況下,要充分保障各資源情況,否則發生驅逐後到其它節點仍然無法滿足資源需求,會引起節點震盪。集羣機器數量較多,被驅逐到其它節點上的pod,在多台機器上資源不滿足的概率較小。
以下是一些相關説明:
驅逐信號
什麼是驅逐信號呢?簡單理解就是,kubelet什麼時候什麼場景下開始驅逐pod呢?總的有幾個參考值吧,這就是驅逐信號,k8s提供了以下幾種驅逐信號
驅逐信號 描述
memory.available node.status.capacity[memory] - node.stats.memory.workingSet nodefs.available node.stats.fs.available nodefs.inodesFree node.stats.fs.inodesFree imagefs.available node.stats.runtime.imagefs.available imagefs.inodesFree node.stats.runtime.imagefs.inodesFree memory.available是針對內存資源,其餘4個驅逐信號都是針對磁盤空間的。
上面的每個信號都支持字面值或百分比的值。基於百分比的值的計算與每個信號對應的總容量相關。
memory.available 的值從 cgroupfs 獲取,而不是通過類似 free -m 的工具。 這很重要,因為 free -m 不能在容器中工作
kubelet 只支持兩種文件系統分區。
nodefs 文件系統,kubelet 將其用於卷和守護程序日誌等。
imagefs 文件系統,容器運行時用於保存鏡像和容器可寫層。
imagefs 可選。kubelet 使用 cAdvisor 自動發現這些文件系統。 kubelet 不關心其它文件系統。當前不支持配置任何其它類型。 例如,在專用 filesytem 中存儲卷和日誌是 不可以 的。
我們可以想想worker節點中什麼最耗磁盤空間,無非也就下面幾項 鏡像文件:有的很大,幾百M。每次更新deployment,都會拉取新的鏡像,長此以往,不通版本的鏡像肯定要消耗很大磁盤空間的。imagefs文件系統正是管理這些鏡像的,如果我們配置的驅逐信號中有imagefs.available或者imagefs.inodesFree,且觸發驅逐閥值後,k8s將會主動清理一些沒有使用的版本鏡像,以此來釋放更多的磁盤空間。 日誌:隨着應用的長時間運行,日誌會越來越龐大,volume不管你使用的是emptyDir,hostPath,還是nfs,clustersfs,都會將日誌存儲在節點上的,佔用worker節點的磁盤空間也將會越來越大。docker中的日誌分為倆種,docker主進程的標準輸出日誌和項目中用户產生的文件日誌,正好對應nodefs文件系統中的卷和守護程序日誌。如果我們配置的驅逐信號中有nodefs.available或者nodefs.inodesFree且觸發驅逐閥值後,k8s將會清理這些日誌,清理這些的日誌的方式只能是驅逐pod了。
軟驅逐閾值
使用一對由驅逐閾值和寬限期組成的配置對。在寬限期內持續超過閥值則進行驅逐。比如下面這倆行配置,表示的意義是當節點的memory.available小於500Mi,且在1分30內持續小於500Mi時,開啟觸發驅逐。下面這倆行是成對出現的。
軟驅逐閾值使用關鍵字eviction-soft
--eviction-soft=memory.available<500Mi --eviction-soft-grace-period=memory.available=1m30s
硬驅逐閾值
相對於軟驅逐閾值,區別就是沒有緩衝時間,只要觸發驅逐信號,就立即開始驅逐而不是優雅的終止。
硬驅逐閾值使用關鍵字eviction-hard。比如下面例子
--eviction-hard=memory.available<500Mi,nodefs.available<20%
- 引發Pod驅逐的原因
- Oracle12c ora-28040報錯及修改字符集
- rbd空間擴容失敗問題
- centos進入dracut模式修復grub啟動
- java oom堆棧分析
- jvm參數説明
- go自定義函數
- 生產環境centos7 openssh與ssl升級
- 無法啟動的docker容器鏡像內mysql數據恢復
- Kubectl證書過期更新
- MySQL load導入大數據
- ceph 運維常用指令
- 重啟pod發現有pod無法掛在pvc
- K8s污點和容忍度
- ceph rbd擴容
- centos升級內核
- k8s 節點優化
- k8s 選擇版本時注意cgroup問題(內存泄漏)
- k8s 創建用户及rbac授權