2026-10-26 01:14:35
K8S原生调度与资源管理模块主要涵盖资源模型、默认调度器机制、调度策略及优先级抢占机制,同时支持GPU等设备管理。具体内容如下:
一、资源模型与资源管理Pod作为最小调度单位:
Pod是k8s中原子化的调度单元,所有调度和资源管理属性均属于Pod对象的字段,其中CPU和内存配置是核心。
资源类型:
可压缩资源(CPU):不足时Pod会“饥饿”但不会退出,CPU配额支持分数形式(如0.5个CPU表示一半算力)。
不可压缩资源(内存):不足时触发OOM(Out of Memory)错误,导致Pod被终止。
资源限制配置:
CPU和内存限制需在每个Container中定义,调度时以Pod为单位计算。
Limits与Requests:
Requests:Pod启动时申请的最小资源量,调度器(kube-scheduler)根据此值筛选可用节点。
Limits:Pod运行时的资源上限,kubelet通过Cgroups按此值设置实际限制。
设计理念:参考Borg论文的“动态资源边界”,允许作业实际使用资源少于请求值,提升资源利用率。
QoS(服务质量)模型:
根据Limits和Requests的设置方式,Pod被划分为三个QoS级别,影响资源紧张时的回收顺序:
Guaranteed:同时设置Limits和Requests,或仅设置Limits(Requests与Limits相等)。
Burstable:至少一个Container设置了Requests,但未全部设置Limits。
BestEffort:既未设置Limits也未设置Requests。
资源回收顺序:当宿主机资源不足时,kubelet按BestEffort → Burstable → Guaranteed的顺序驱逐Pod;同QoS级别内,根据Pod优先级进一步排序。
调度流程:
节点筛选(Predicate):通过一组过滤算法(如资源检查、亲和性规则)筛选出所有可运行Pod的节点。
节点打分(Priority):对筛选后的节点按优先级算法(如资源利用率、负载均衡)打分,选择得分最高的节点。
绑定结果:将Pod的spec.nodeName字段设置为目标节点名称,完成调度。
调度队列与缓存:
默认使用优先级队列(PriorityQueue),支持动态调整队列内容(如抢占场景)。
调度器缓存集群信息(如节点资源、Pod状态),加速Predicate和Priority算法执行。
可扩展性(Scheduler Framework):
提供生命周期钩子接口,允许用户自定义调度逻辑,例如:
替换默认调度队列实现,控制Pod出队时机。
插入自定义过滤算法,按业务需求选择节点。
插件机制基于Go语言,需在编译时集成。
GeneralPredicates:基础过滤规则,检查节点CPU、内存等资源是否满足Pod需求。
Volume相关规则:
MaxPDVolumeCountPredicate:限制节点上持久卷(PV)数量。
VolumeZonePredicate:确保PV与节点在同一可用区。
VolumeBindingPredicate:检查PV绑定状态。
宿主机相关规则:
PodToleratesNodeTaints:匹配节点污点(Taint)与Pod容忍度(Toleration)。
NodeMemoryPressurePredicate:避免将Pod调度到内存压力大的节点。
Pod亲和性规则:
PodAffinityPredicate:根据Pod间的亲和性(如共存)或反亲和性(如隔离)筛选节点。
优先级:
高优先级Pod可挤走低优先级Pod,避免被搁置。优先级通过PriorityClass对象定义,数值越大优先级越高。
抢占流程:
触发条件:高优先级Pod因资源不足调度失败。
寻找候选节点:调度器搜索集群,找到删除部分低优先级Pod后可容纳高优先级Pod的节点。
执行驱逐:终止候选节点上的低优先级Pod,为高优先级Pod腾出资源。
基本功能:
支持Pod申请GPU数量(如nvidia.com/gpu: 2),但缺乏对异构GPU集群的精细管理(如按计算能力分配)。
局限性:
无法指定Pod运行在特定性能的GPU上(如最高算力GPU)。
需依赖Device Plugin扩展实现高级功能(如厂商自定义插件)。
