引言

Kubernetes调度器(kube-scheduler)是Kubernetes控制平面的核心组件,负责将待调度的Pod分配到最优的节点上运行。随着集群规模增长和应用场景多样化,默认调度策略已无法满足复杂的需求,Kubernetes提供了Scheduling Framework可扩展框架,支持通过插件方式深度定制调度逻辑。

一、默认调度器工作流程

Kubernetes调度过程分为两个阶段:Scheduling Cycle(调度周期)和Binding Cycle(绑定周期。调度周期为Pod选择一个最优节点,绑定周期将该决定提交到API Server。这个过程是串行执行的,保证同一个Pod不会被多个节点绑定。

过滤阶段(Predicates/Filter plugins):通过一系列过滤插件排除不满足条件的节点。内置插件包括:NodeResourcesFit检查CPU和内存资源是否充足;NodePorts检查端口冲突;VolumeBinding检查存储卷是否可用;NodeAffinity检查节点亲和性;TaintToleration检查污点和容忍匹配。

打分阶段(Priorities/Score plugins):对过滤后的节点评分。内置插件包括:NodeResourcesLeastAllocated偏好分配率低的节点;ImageLocality偏好已有容器镜像的节点;InterPodAffinity偏好已运行相关Pod的节点;NodeAffinity偏好匹配节点亲和性规则;TaintToleration偏好污点匹配。

二、Scheduling Framework架构

Scheduling Framework定义了扩展点(Extension Points),插件注册到不同扩展点参与调度决策。每个扩展点独立执行插件,支持多插件并行。

关键扩展点:QueueSort定义Pod排序规则;PreFilter预处理和缓存节点信息;Filter执行过滤逻辑Filter执行过滤逻辑;PreScore预计算打分中间结果;Score执行打分操作;Reserve预留资源防止并发冲突;PreBind绑定前校验;Bind执行节点绑定;PostBind绑定后清理。

插件API:每个扩展点定义统一接口,插件实现框架提供的接口即可注册。例如Score接口接收状态、Pod、节点名,返回分数和结果状态。

三、自定义调度器实战

编写自定义Score插件:创建ScorePlugin结构体,在Score函数中实现基于GPU显存碎片率的打分逻辑。具体流程:1. 获取节点GPU已分配量和总容量;2. 计算碎片率 = (总容量 - 已分配) / 总容量;3. GPU需求小的Pod偏好碎片率低的节点,大模型Pod偏好碎片率高的节点(减少节点浪费);4. 返回0-100的分数。

在Score插件的NormalizeScore步骤中,将分数归一化到MaxNodeScore范围内,确保不同插件的分数可以公平组合。

四、多调度器与异构调度

Kubernetes支持运行多个调度器:通过Pod的spec.schedulerName字段指定使用的调度器;每个调度器独立部署,监听特定Pod;可用Deployment部署调度器,配置RBAC权限。

Volcano面向AI/ML工作负载的批调度器:支持Gang-Scheduling(同时调度一组Pod)、Fairshare(按租户公平分配)、Queue管理(队列资源配额);在AI训练场景中广泛使用。

Kueue资源配额管理:管理与配额和资源管理相关的调度功能;与kube-scheduler互补,处理资源准入和配额借用;支持Flavor和弹性借用。

五、生产环境最佳实践

调度性能优化:大规模集群(5000+节点)使用PercentageOfNodesToScore按比例随机选择候选节点,默认50%可降至10%而不影响调度质量。

节点亲和性配置:使用preferredDuringSchedulingIgnoredDuringExecution表达软偏好,避免硬亲和导致调度失败;多维度亲和(节点、Pod、拓扑域)组合使用。

拓扑域约束:topologySpreadConstraints确保Pod在指定拓扑域间均匀分布,支持多个约束的Skew因子:约束1为zone域最大偏差1,约束2为node域最大偏差2。

资源预留:system-reserved和kube-reserved为系统组件预留资源,防止工作负载挤占系统资源导致节点NotReady。

六、常见调度问题排错

Pod一直处于Pending状态排查:kubectl describe pod查看Events事件;检查节点污点和Pod容忍匹配;检查资源请求是否超过节点容量;检查PVC是否绑定的可用域与节点匹配。

调度不均问题排查:检查Pod之间反亲和性导致分布分散;检查资源碎片导致节点无法接受Pod;考虑使用Descheduler驱逐重新调度。

七、总结

Kubernetes调度器从简单的过滤打分演进为高度可扩展的框架体系,Scheduling Framework赋予了平台强大的自定义能力。理解调度器的内部机制,对于构建高效、稳定的Kubernetes平台至关重要。

随着AI/ML工作负载、边缘计算、Serverless等场景的普及,Kubernetes调度将继续演进,朝着更智能、更公平、更面向领域的方向发展。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部