引言
Kubernetes已成为容器编排的事实标准,其调度系统是整个集群的"大脑"。理解kube-scheduler的工作原理,对于优化集群性能、保障服务可靠性至关重要。本文从调度框架出发,深入Pod放置策略与优先级机制,并展示如何开发自定义调度器来满足特定业务需求。
调度器核心流程
kube-scheduler的调度周期分为两阶段:
- 过滤阶段(Predicates):筛选出所有可调度Node,排除不满足硬性约束的节点
- 打分阶段(Priorities):对通过过滤的节点评分,选出最优放置目标
这两个阶段通过Scheduling Framework暴露为Extender插件接口,每个阶段都有对应的Extension Points供扩展。
Pod放置策略
- nodeSelector/nodeAffinity:基于标签的简单/灵活调度约束
- podAntiAffinity:保障多副本分散部署,提升可用性
- Taints/Tolerations:节点排斥特定Pod,实现专用节点池
- Topology Spread Constraints:按拓扑域均匀分布Pod
优先级与抢占
PriorityClass定义Pod调度优先级。当高优先级Pod无法调度时,抢占机制会驱逐低优先级Pod以释放资源。需注意抢占可能引发级联驱逐,建议配合PDB(PodDisruptionBudget)和优雅终止来规避风险。
自定义调度器开发
Scheduling Framework v1(1.18 稳定)允许通过插件扩展调度逻辑:
// PreFilter: 预计算Pod调度所需信息
func (pl *CustomScheduler) PreFilter(ctx context.Context, state *CycleState, pod *v1.Pod) *Status {
// 检查前置条件
return nil
}
// Filter: 节点过滤
func (pl *CustomScheduler) Filter(ctx context.Context, state *CycleState, pod *v1.Pod, nodeInfo *framework.NodeInfo) *Status {
// 自定义过滤逻辑
return nil
}
// Score: 节点评分
func (pl *CustomScheduler) Score(ctx context.Context, state *CycleState, pod *v1.Pod, nodeName string) (int64, *Status) {
return calculateScore(pod, nodeName), nil
}开发自定义调度器适用于:特定硬件亲和(GPU拓扑感知)、成本优化、QoS保障等场景。
最佳实践建议
合理设置Resource Requests/Limits是调度效率的基石;合理利用亲和/反亲和策略可显著提升应用韧性;调度器扩展优先级从简单到复杂依次尝试:Scheduler Profile → Scheduler Extender → 独立自定义调度器。

发表评论 取消回复