K8S資源回收機制

原文:https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/node

一 問題現象
服務器的磁盤空間爆滿(90%以上),觸發某種機制,致使大量pod處於被驅逐狀態(Evicted),大部分鏡像被刪除,全部服務均不可用。docker

二 問題追蹤
發現服務器的存儲達到某個狀態(假如是超過90%)後會刪除自身的一些資源,比較明顯的是刪除了大量的鏡像,所以會出現一些pod的狀態是鏡像下載失敗,包括k8s自身的系統鏡像。服務器自己並不存在自動清理根目錄,除非是寫自動清理的腳本。排查了一圈,並不存在,所以極大機率是k8s本身給刪的。我在官方的一篇文檔中,找到了這個機制。服務器

三 機制說明
每一個node上的kubelet都負責按期採集資源佔用數據,並與預設的 threshold值進行比對,若是超過 threshold值,kubelet就會嘗試殺掉一些Pod以回收相關資源,對Node進行保護。kubelet關注的資源指標threshold大約有以下幾種:ide

  • memory.available
  • nodefs.available
  • nodefs.inodesFree
  • imagefs.available
  • imagefs.inodesFree

每種threshold又分爲eviction-soft和eviction-hard兩組值。soft和hard的區別在於前者在到達threshold值時會給pod一段時間優雅退出,然後者則崇尚「暴力」,直接殺掉pod,沒有任何優雅退出的機會。這裏還要提一下nodefs和imagefs的區別:日誌

nodefs: 指node自身的存儲,存儲daemon的運行日誌等,通常指root分區/;
imagefs: 指docker daemon用於存儲image和容器可寫層(writable layer)的磁盤;
在我遇到的問題中,咱們的imagefs和nodefs分區是同一個分區,即/分區,佔用率很高(96%)。列一下其中一些指標的閾值:blog

memory.available<100Mi
nodefs.available<10%
nodefs.inodesFree<5%
imagefs.available<15%
(至於其餘的指標閾值爲啥沒有,由於我沒找到。)資源

其中比較重要的動做,就是達到nodefs和imagefs的閾值後的回收機制。文檔

K8S資源回收機制

簡單來講,就是nodefs超過閾值了,k8s會自動幹掉本機上的pod和pod對應的容器(這裏是k8s的驅逐機制,刪除本節點pod,在其餘節點啓動,在不放守護機制的前提下是不順滑的,存在必定時間的服務中斷);若是imagefs超過閾值了,會刪除沒有使用到的鏡像文件。get

那麼問題來了:若是nodefs和imagefs是同一個分區,會出現什麼問題呢?k8s會首先驅逐本機上的pod到其餘節點,而後資源仍然不夠,會刪除沒有被使用到的鏡像,直到剩餘空間低於設定的閾值,甚至會刪除k8s的系統鏡像。kubernetes

四 解決辦法
1 修改這幾個指標的閾值(不推薦)

2 添加監控,在閾值到達以前提早處理

相關文章
相關標籤/搜索