K8S调度-依据资源模型实行资源回收-Eviction

QoS 划分的主要应用场景,是当宿主机资源紧张的时候,kubelet 对 Pod 进行 Eviction(即资源回收)时需要用到的。

当 Kubernetes 所管理的宿主机上不可压缩资源短缺时,就有可能触发 Eviction。

(1)Kubernetes 设置的 Eviction 的默认阈值如下所示:

memory.available < 100 Mi

nodefs.available < 10 %

nodefs.inodesFree < 5 %

imagefs.available < 15 %

(2)K8S默认的资源回收阈值可以自行设置:

资源回收分为两类:Soft 和 Hard

kubelet --eviction-hard=imagefs.available < 15 %,memory.available < 100 Mi,nodefs.available < 10 %,imagefs.available=2m

(1)Soft Eviction 允许你为 Eviction 过程设置一段"优雅时间"

imagefs.available=2m 意味着当 imagefs 不足的阈值达到 2 分钟之后,kubelet 才会开始 Eviction 的过程。

(2)Hard Eviction 模式下,Eviction 过程就会在阈值达到之后立刻开始。

Eviction 阈值的数据来源,主要依赖于从 cgroups 读取到的值,以及使用 cAdvisor 监控到的数据。

(3) Eviction 阈值达到后 -- 宿主机进入"锁定"状态

宿主机的 Eviction 阈值达到后,就会进入 MemoryPressure 或者 DiskPressure 状态,从而避免新的 Pod 被调度到这台宿主机上。

当宿主机进入 MemoryPressure 或 DiskPressure 状态时,Kubernetes 会立即把该节点标记为"资源告急",并自动做两件事:
(1)给节点打上硬污点

控制平面会为节点添加对应的污点:

node.kubernetes.io/memory-pressure:NoSchedule

node.kubernetes.io/disk-pressure:NoSchedule

调度器(kube-scheduler)在筛选节点时,只要看到这类污点且 Pod 没有配置相应容忍度(toleration),就会直接跳过该节点,因此新的 Pod 不会被分配到这台宿主机。
(2)触发主动驱逐

对已经在节点上运行的 Pod,kubelet 会启动 Node-pressure Eviction:

优先驱逐 BestEffort 或 Burstable 且磁盘/内存用量高的实例,以尽快回收资源;

驱逐顺序按 QoS 等级和用量评分,Guaranteed Pod 最后被清。

(4)Eviction 阈值达到后 -- kubelet 对 pod 实行资源回收

(1) BestEffort 类别的 Pod

(2) Burstable 类别、并且发生"饥饿"的资源使用量已经超出了 requests 的 Pod

(3) Guaranteed 类别

Kubernetes 会保证只有当 Guaranteed 类别的 Pod 的资源使用量超过了其 limits 的限制,或者宿主机本身正处于 Memory Pressure 状态时,Guaranteed 的 Pod 才可能被选中进行 Eviction 操作。

相关推荐
嗨 ! 海洋8 小时前
K8S- 调度器-MoveAllToActiveQueue插件刷新调度机会
k8s api对象调度·k8s资源调度
嗨 ! 海洋12 小时前
K8S- 调度器的DefaultPreemption插件实现抢占
k8s api对象调度·k8s资源调度