1.驅逐策略
kubelet持續監控主機的資源使用情況,並儘量防止計算資源被耗盡。一旦出現資源緊缺的跡象,kubelet就會主動終止部分pod的執行,以回收資源。
2.驅逐訊號
以下是一些kubelet能用來做決策依據的訊號,依據這些訊號來做驅逐行為。
memory : 記憶體;
nodefs: 指node自身的儲存,儲存daemon的執行日誌等,一般指root分割槽/;
imagefs: 指docker daemon用於儲存image和容器可寫層(writable layer)的磁碟;
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命令不支援在容器中工作,
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的方法:
#cat /sys/fs/cgroup/memory/memory.usage_in_bytes
檢視當前cgroup使用memory情況:
cat /sys/fs/cgroup/memory/memory.stat |grep total_inactive_file
3.軟碟機逐和硬驅逐
如果一個節點有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
4.回收Node級別資源
- 驅逐Node級別資源
-
- 配置了 imagefs 閾值時
- 達到 nodefs 閾值:刪除已停止的 Pod
- 達到 imagefs 閾值:刪除未使用的映象
- 未配置 imagefs 閾值時
- 達到 nodefs閾值時,按照刪除已停止的 Pod 和刪除未使用映象的順序清理資源
- 配置了 imagefs 閾值時
- 驅逐順序為:BestEffort、Burstable、Guaranteed
- 配置了 imagefs 閾值時
- 達到 nodefs 閾值,基於 nodefs 用量驅逐(local volume + logs)
- 達到 imagefs 閾值,基於 imagefs 用量驅逐(容器可寫層)
- 未配置 imagefs 閾值時
- 達到 nodefs閾值時,按照總磁碟使用驅逐(local volume + logs + 容器可寫層)
除了驅逐之外,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 |
驅逐回收將磁碟壓力轉換到其他資源 |
5.節點資源緊缺情況下系統行為
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將會首先被驅逐。