「Bug」Kubernetes 節(jié)點(diǎn)出現(xiàn) DiskPressure,并且自動(dòng)恢復(fù)
2020-04-14
Bug 描述
測試機(jī)進(jìn)行一次完整的部署(近 90 個(gè)新 Pod 被調(diào)度到同一個(gè)節(jié)點(diǎn))后,通過 Dashboard 查看,發(fā)現(xiàn) Pod 容器組有一個(gè) Failed Pod。
容器總體個(gè)數(shù)正常,F(xiàn)ailed Pod 是“多余的”。
排查流程
- 在 Dashboard 中查看該 Pod,只顯示它處于 Failed 狀態(tài),沒有更多提示。沒什么用。。
- 通過 k9s 查看該 Pod 的詳細(xì)信息,發(fā)現(xiàn)它是因?yàn)?DiskPressure 而被驅(qū)逐(Evicted)。
- 用 ssh 進(jìn)入這個(gè)節(jié)點(diǎn),通過
df -h命令確認(rèn)磁盤狀態(tài),發(fā)現(xiàn)磁盤利用率為 46%,遠(yuǎn)低于 DiskPressure 的默認(rèn)觸發(fā)條件:85%。DiskPressure 自己消失了。。
既然磁盤壓力自己恢復(fù)了,應(yīng)該是 kubernetes 自己有某種清理策略,開始網(wǎng)上查詢資料:
- 網(wǎng)上查詢資料 Kubernetes Node節(jié)點(diǎn)DiskPressure異常處理,了解到是 kubelet 組件負(fù)責(zé)管理節(jié)點(diǎn)資源。
- 搜索到官方文檔 kubernets - 回收節(jié)點(diǎn)資源
- 上述文檔說在 with-imagefs 和 without-imagefs 時(shí),遇到 DiskPressure,有不同的資源回收策略。
- 清理策略比較復(fù)雜,后面再討論。
- 通過
vim查看 kubelet 日志/var/log/message,搜索關(guān)鍵字Evicted,DiskPressure,Pressure等,查找到了DiskPressure相關(guān)信息 - 觀察 DiskPressure 日志的上下文,發(fā)現(xiàn)有
imageGCManager清理 image 相關(guān)的日志。這顯然就是一個(gè)自動(dòng)回收資源的事件。 - 搜索 kubernetes image gc,找到官方文檔:配置 kubelet 垃圾回收策略
- 另有硬驅(qū)逐策略的默認(rèn)閾值 Hard Eviction Thresholds 一致,
- 相關(guān) Issue: Kubernetes Issue - Can we deprecate '--image-gc-high-threshold' and 'image-gc-low-threshold'
- 相關(guān)提案:Kubelet - Eviction Policy
分析結(jié)果
總的來說,就是 DiskPressure 是因?yàn)闅v史鏡像過多引起的。目前有兩種方法可以讓 kubernetes 自己進(jìn)行數(shù)據(jù)清理:
方法一:配置鏡像的垃圾回收策略
已被標(biāo)記為棄用
這涉及到兩個(gè)參數(shù):
image-gc-high-threshold: 當(dāng)磁盤使用率超過這個(gè)值時(shí),就會(huì)觸發(fā)鏡像回收器。默認(rèn)值為 85%。image-gc-low-threshold: 當(dāng)鏡像回收器被觸發(fā)后,它至少會(huì)使磁盤使用率低于這個(gè)閾值(否則不會(huì)停)。默認(rèn)值為 80%。
方法二:配置驅(qū)逐策略(推薦)
根據(jù)官方文檔說明,為了統(tǒng)一 kubernetes 中的資源回收參數(shù),未來將棄用方法一。
新的鏡像GC策略已經(jīng)被合并到了Pod驅(qū)逐策略中,詳細(xì)的配置方法見下文。
容器鏡像GC、Pod驅(qū)逐以及節(jié)點(diǎn)壓力
節(jié)點(diǎn)壓力 DiskPressure 會(huì)導(dǎo)致 Pod 被驅(qū)逐,也會(huì)觸發(fā)容器鏡像的 GC。
根據(jù)官方文檔 配置資源不足時(shí)的處理方式,Kubelet 提供如下用于配置容器 GC 及 Evicetion 的閾值:
--eviction-hard和eviction-soft: 對(duì)應(yīng)舊參數(shù)--image-gc-high-threshold,這兩個(gè)參數(shù)配置鏡像 GC 及驅(qū)逐的觸發(fā)閾值。磁盤使用率的閾值默認(rèn)為 85%- 區(qū)別在于
eviction-hard是立即驅(qū)逐,而eviction-soft在超過eviction-soft-grace-period之后才驅(qū)逐。
- 區(qū)別在于
--eviction-minimum-reclaim: 對(duì)應(yīng)舊參數(shù)--image-gc-low-threshold。這是進(jìn)行資源回收(鏡像GC、Pod驅(qū)逐等)后期望達(dá)到的磁盤使用率百分比。磁盤使用率的閾值默認(rèn)值為 80%。
問:能否為 ImageGC 設(shè)置一個(gè)比 DiskPressure 更低的閾值?因?yàn)槲覀兿M茏詣?dòng)進(jìn)行鏡像 GC,但是不想立即觸發(fā) Pod 驅(qū)逐。
答:這應(yīng)該可以通過設(shè)置 eviction-soft 和長一點(diǎn)的 eviction-soft-grace-period 來實(shí)現(xiàn)。
另外 --eviction-minimum-reclaim 也可以設(shè)小一點(diǎn),清理得更干凈。示例如下:
--eviction-soft=memory.available<1Gi,nodefs.available<2Gi,imagefs.available<200Gi
--eviction-soft-grace-period=3m
--eviction-minimum-reclaim=memory.available=0Mi,nodefs.available=1Gi,imagefs.available=2Gi

浙公網(wǎng)安備 33010602011771號(hào)