Scheduler的两阶段调度算法
Kubernetes Scheduler的两阶段调度算法
1. 预选阶段(Predicates):硬性条件过滤
目标:从集群所有节点中筛选出符合Pod基本运行条件的候选节点。
关键策略:
- 资源匹配:检查节点的CPU、内存、存储等资源是否满足Pod的
requests
定义。 - 污点与容忍(Taints and Tolerations):若节点存在污点(如
NoSchedule
),Pod需声明对应的容忍(Toleration)才能被调度。 - 节点亲和性(Node Affinity):通过
requiredDuringSchedulingIgnoredDuringExecution
强制Pod部署到特定标签的节点。 - 卷拓扑限制:例如,云盘类型的存储卷需匹配节点所在的可用区。
生产注意点:
- 预选失败常见于资源超售场景,需合理设置Pod的
requests/limits
。 - 使用
kubectl describe pod <pod-name>
可查看因Insufficient cpu/memory
导致的调度失败事件。
2. 优选阶段(Priorities):评分与优化决策
目标:对预选通过的节点打分,选择综合最优节点。
核心评分规则:
- 资源均衡(Balanced Resource Allocation):优先选择CPU/内存利用率更均衡的节点,避免热点。
- 最小请求优先(Least Requested):倾向资源空闲率高的节点,公式:
(NodeFree - PodRequest) / NodeCapacity
。 - Pod亲和性(Inter-Pod Affinity/Anti-Affinity):优化服务拓扑,例如将同一服务的Pod分散到不同可用区(Topology Spread Constraints)。
- 节点权重(Node Prefer Avoid Pods):通过注解手动干预调度优先级。
生产最佳实践:
- 对延迟敏感的服务(如AI推理)启用
Node Resources Least Allocatable
策略,优先分配低延迟节点。 - 结合
PriorityClass
实现抢占式调度,确保高优先级业务优先调度。
调度流程的底层机制
- 异步绑定:调度线程(Scheduling Thread)串行选择节点后,由独立线程异步执行
Bind
操作(如更新Pod的nodeName
字段)。 - 调度周期(Scheduling Cycle):包含预选、优选、绑定三个阶段,若绑定失败(如节点资源突变),Pod重新进入调度队列。
- 扩展性:通过Scheduler Framework插件机制,可自定义
Filter
、Score
等扩展点(如实现GPU资源调度策略)。
生产案例:调度策略配置
# 示例:强制Pod分散在不同可用区
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: nginx
topologyKey: topology.kubernetes.io/zone
总结
Kubernetes调度器通过预选+优选的机制,在保障稳定性的同时实现资源最优分配。生产环境中需结合业务特性调整策略,例如:
- 有状态服务:使用
StatefulSet
并配置volumeClaimTemplates
确保存储拓扑。 - 批量计算:利用
Batch
类资源(如Job)配合低优先级调度。 - 混合云场景:通过
NodeSelector
限制调度到特定厂商节点。
参考资料:
预选与优选核心逻辑
Kubernetes官方调度机制
高级调度策略与扩展性
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程