Scheduler的两种调度算法
Kubernetes调度器核心机制深度解析(生产环境实战指南)
在Kubernetes集群中,调度器(Scheduler) 是决定Pod如何分配到Worker节点的核心组件。它的作用类似于机场的智能调度系统:既要确保每个航班(Pod)有合适的停机位(节点),又要全局考虑资源利用率和容灾能力。调度过程并非简单的“随机分配”,而是通过两阶段精密算法完成:预选(Predicates) 和 优选(Priorities)。以下内容结合生产环境经验,解析其核心逻辑。
一、预选阶段(Predicates):硬性条件筛选
预选阶段的目标是快速过滤掉绝对不符合条件的节点,类似于求职简历的初筛。只有通过所有“必选项”的节点才能进入下一轮。
1. 核心筛选维度
-
资源硬性检查
- 节点必须满足Pod声明的
requests资源(CPU/Memory/Ephemeral Storage)。 - 扩展资源检查(如GPU卡数、FPGA等)。
生产经验:资源不足是调度失败的常见原因,需监控节点资源碎片。
- 节点必须满足Pod声明的
-
节点标签与污点匹配
- 检查
nodeSelector或nodeAffinity是否匹配节点标签。 - 节点污点(Taints)必须被Pod的
tolerations容忍。
示例:GPU节点通常有accelerator=gpu标签和NoSchedule污点。
- 检查
-
存储与拓扑约束
- 持久卷(PV)的区域(Zone)或可用区必须与节点匹配。
- 检查CSI存储插件的容量和访问模式。
-
安全策略
- PodSecurityPolicy(PSP)或新一代的Pod Security Standards(PSS)。
- SELinux、AppArmor等安全上下文(SecurityContext)。
2. 生产环境典型场景
案例1:部署数据库Pod
- 必须选择带有
disk=ssd标签的节点。 - 需要容忍节点的
dedicated=db:NoSchedule污点。 - 检查内存是否满足
8Gi的requests声明。
案例2:多可用区部署
- 通过
topologySpreadConstraints限制Pod在多个可用区均匀分布。
二、优选阶段(Priorities):评分择优
通过预选的节点进入评分阶段,调度器为每个节点打分(0-10分),最终选择得分最高的节点。若多个节点得分相同,则随机选择。
1. 核心评分策略
-
资源平衡策略
LeastAllocated:优先选择资源利用率最低的节点(默认策略)。BalancedResourceAllocation:避免CPU和内存使用率差异过大。
-
拓扑感知调度
Zone/Region Spread:跨可用区部署以提高容灾能力。NodeAffinity权重:满足preferredDuringScheduling的节点加分。
-
节点亲和性/反亲和性
- 优先选择与现有Pod亲和性强的节点(如同节点部署缓存和计算Pod)。
- 避免与反亲和性Pod共存(如避免同一节点部署多个高负载服务)。
-
自定义扩展
- 通过
Prioritizer插件实现业务专属逻辑(如基于实时负载的动态调度)。
- 通过
2. 生产环境调优技巧
场景1:避免节点过载
- 启用
PodTopologySpread插件,设置maxSkew=1,确保Pod均匀分布。 - 配置资源
limits防止单个Pod耗尽节点资源。
场景2:优先级抢占
- 定义
PriorityClass,高优先级Pod可抢占低优先级Pod的资源。 - 注意:被抢占的Pod会进入
Terminating状态,需业务容忍短暂中断。
三、高级调度实战(生产级配置)
1. 调度器扩展
Kubernetes支持通过调度框架(Scheduler Framework)自定义插件:
apiVersion: kubescheduler.config.k8s.io/v1beta3
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: custom-scheduler
plugins:
preFilter:
enabled:
- name: "SamplePreFilterPlugin"
score:
enabled:
- name: "SampleScorePlugin"
weight: 2
2. 常见问题排查
-
Pending Pod诊断
kubectl describe pod <pod-name>:查看Events中的调度失败原因。kubectl get events --field-selector involvedObject.name=<pod-name>。
-
节点资源碎片
- 使用
kube-resource-report生成资源利用率报告。 - 启用
Descheduler重新平衡已调度Pod。
- 使用
四、总结
调度器的核心逻辑可归纳为:
- 预选(Predicates):过滤掉不符合硬性条件的节点。
- 优选(Priorities):对候选节点评分,选择最优目标。
生产环境中需结合监控(Prometheus)、自动化(Cluster Autoscaler)和策略调优,才能实现高效稳定的调度。理解这一机制,是优化Kubernetes集群性能的关键一步。
浙公网安备 33010602011771号