kubelet持續監控主機的資源使用狀況,並儘可能防止計算資源被耗盡。一旦出現資源緊缺的跡象,kubelet就會主動終止部分pod的運行,以回收資源。node
如下是一些kubelet能用來作決策依據的信號,依據這些信號來作驅逐行爲。web
memory : 內存;docker
nodefs: 指node自身的存儲,存儲daemon的運行日誌等,通常指root分區/;app
imagefs: 指docker daemon用於存儲image和容器可寫層(writable layer)的磁盤;ide
Eviction Signal | Condition | Description |
---|---|---|
memory.available |
MemoryPressue | memory.available := node.status.capacity[memory] - node.stats.memory.workingSet |
nodefs.available |
DiskPressure |
|
nodefs.inodesFree |
DiskPressure | nodefs.inodesFree := node.stats.fs.inodesFree |
imagefs.available |
DiskPressure | imagefs.available := node.stats.runtime.imagefs.available (鏡像以及容器可寫層等) |
imagefs.inodesFree |
DiskPressure | imagefs.inodesFree := node.stats.runtime.imagefs.inodesFree |
memory.available的值不是根據系統的free 收集,取值來自於cgroupfs,free -m命令不支持在容器中工做,spa
cgroup.event_control #用於eventfd的接口 memory.usage_in_bytes #顯示當前已用的內存 memory.limit_in_bytes #設置/顯示當前限制的內存額度 memory.failcnt #顯示內存使用量達到限制值的次數 memory.max_usage_in_bytes #歷史內存最大使用量 memory.soft_limit_in_bytes #設置/顯示當前限制的內存軟額度 memory.stat #顯示當前cgroup的內存使用狀況 memory.use_hierarchy #設置/顯示是否將子cgroup的內存使用狀況統計到當前cgroup裏面 memory.force_empty #觸發系統當即儘量的回收當前cgroup中能夠回收的內存 memory.pressure_level #設置內存壓力的通知事件,配合cgroup.event_control一塊兒使用 memory.swappiness #設置和顯示當前的swappiness memory.move_charge_at_immigrate #設置當進程移動到其餘cgroup中時,它所佔用的內存是否也隨着移動過去 memory.oom_control #設置/顯示oom controls相關的配置 memory.numa_stat #顯示numa相關的內存
查看系統總memory:日誌
cat /proc/meminfo |grep MemTotal
查看當前已使用memory的方法:code
#cat /sys/fs/cgroup/memory/memory.usage_in_bytes
查看當前cgroup使用memory狀況:blog
cat /sys/fs/cgroup/memory/memory.stat |grep total_inactive_file
若是一個節點有10Gi內存,咱們但願在內存不足1Gi時候進行驅逐,能夠用下面兩種方式進行定位驅逐閾值:接口
memory.available<10% memory.available<1Gi
1.軟驅逐(Soft Eviction):配合驅逐寬限期(eviction-soft-grace-period和eviction-max-pod-grace-period)一塊兒使用。系統資源達到軟驅逐閾值並在超過寬限期以後纔會執行驅逐動做。
--eviction-soft:描述驅逐閾值,例如:memory.available<1.5G --eviction-soft-grace-period:驅逐寬限期,memory.available=1m30s --eviction-max-pod-grace-period:終止pod最大寬限時間,單位s
2.硬驅逐(Hard Eviction ):系統資源達到硬驅逐閾值時當即執行驅逐動做。
這些驅逐閾值可使用百分比,也可使用絕對值,如:
--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi --eviction-minimum-reclaim="memory.available=0Mi,nodefs.available=500Mi,imagefs.available=2Gi"` --system-reserved=memory=1.5Gi
除了驅逐以外,Kubelet 還支持一系列的容器和鏡像垃圾回收選項,它們將來將會被驅逐替代:
垃圾回收參數 | 驅逐參數 | 解釋 |
---|---|---|
--image-gc-high-threshold |
--eviction-hard 或 --eviction-soft |
現存的驅逐回收信號能夠觸發鏡像垃圾回收 |
--image-gc-low-threshold |
--eviction-minimum-reclaim |
驅逐回收實現相同行爲 |
--minimum-image-ttl-duration |
因爲驅逐不包括TTL配置,因此它還會繼續支持 | |
--maximum-dead-containers |
一旦舊日誌存儲在容器上下文以外,就會被棄用 | |
--maximum-dead-containers-per-container |
一旦舊日誌存儲在容器上下文以外,就會被棄用 | |
--minimum-container-ttl-duration |
一旦舊日誌存儲在容器上下文以外,就會被棄用 | |
--low-diskspace-threshold-mb |
--eviction-hard or eviction-soft |
驅逐回收將磁盤閾值泛化到其餘資源 |
--outofdisk-transition-frequency |
--eviction-pressure-transition-period |
驅逐回收將磁盤壓力轉換到其餘資源 |
1.Scheduler行爲
Master上的scheduler再也不向該節點調度pod,節點情況與調度行爲的對應關係以下:
MemoryPressure:再也不調度新的BestEffort pod到這個節點 DiskPressure:再也不向這一節點調度pod
2.Node的OOM行爲
kubelet根據pod的Qos爲每一個容器設置一個oom_score_adj,若是kubelet沒法在系統OOM以前回收足夠的內存。則oom_killer會根據內存使用比例來計算oom_score,最後結果和oom_score_adj相加,得分最高的pod將會首先被驅逐。