K8S原生调度与资源管理模块

K8S原生调度与资源管理模块
最新回答
宛若晴空

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语言,需在编译时集成。

三、默认调度器策略解析
  • 预选策略(Filter):

    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腾出资源。

五、GPU管理与Device Plugin机制
  • 基本功能:

    支持Pod申请GPU数量(如nvidia.com/gpu: 2),但缺乏对异构GPU集群的精细管理(如按计算能力分配)。

  • 局限性:

    无法指定Pod运行在特定性能的GPU上(如最高算力GPU)。

    需依赖Device Plugin扩展实现高级功能(如厂商自定义插件)。

图:k8s调度器架构,展示Predicate过滤、Priority打分及扩展点位置