Kubernetes调度器通过Filter(Predicates)和Score(Priorities)两阶段机制选择最优Node,优化需结合合理Requests/Limits设置、Scheduler Framework插件、TopologySpreadConstraints与Cluster Autoscaler协同。

理解Kubernetes调度器的核心机制
Go语言是Kubernetes调度器(kube-scheduler)的实现语言,其调度逻辑本质上是一组可扩展的过滤(Filter)和打分(Score)函数。默认调度器会遍历所有Node,先用Predicates(如资源是否足够、污点容忍、亲和性规则)筛出可行节点,再用Priorities(如LeastRequested、BalancedResourceAllocation)对候选节点打分,最终选择得分最高的Node。
优化调度效果,首先要清楚哪些环节可干预:自定义调度器、调度框架插件(Scheduler Framework)、Pod拓扑分布约束、以及应用层的资源声明方式。单纯调大CPU Limit并不会提升利用率,反而可能造成资源浪费或抢占失败。
合理设置Requests和Limits,避免“虚报”资源
Kubernetes按Requests分配资源(决定能否调度)和驱逐优先级,而Limits仅用于运行时限制。若只设Limits不设Requests,系统默认Requests=Limits,极易导致调度僵化;若Requests远小于实际使用量,又会引发节点过载。
- 用
metrics-server + kubectl top持续观测Pod实际CPU/Memory使用率,建议Requests设为P90使用峰值的1.2–1.5倍 - 对批处理类Job,可使用
resourcePolicy: "burstable"配合低Requests+高Limits,配合QoS保障关键服务 - 启用
VerticalPodAutoscaler (VPA)自动推荐并调整Requests/Limits,但注意VPA不支持Limit自动更新,需配合策略人工审核
用调度框架插件精准控制资源分配行为
Kubernetes v1.21+默认启用Scheduler Framework,允许你在Go中编写扩展插件,插入到调度流水线的特定阶段。相比旧版自定义调度器,它更轻量、易维护,且与默认调度器共存。
立即学习“go语言免费学习笔记(深入)”;
- 在
Filter阶段写插件:例如检查节点当前负载(通过NodeMetrics API),拒绝调度到CPU使用率>70%的节点 - 在
Score阶段写插件:例如给空闲内存多的节点加分,或对同机架Pod降分以分散故障域 - 插件用Go实现,编译进调度器二进制或以Out-of-Tree方式通过gRPC注册;官方示例见kubernetes-sigs/scheduler-plugins仓库
结合拓扑分布与弹性伸缩,提升集群整体水位
单靠单Pod调度优化不够,还需从全局视角平衡负载。Kubernetes原生提供TopologySpreadConstraints和Cluster Autoscaler协同工作:
- 用
topologyKey: topology.kubernetes.io/zone确保Pod跨可用区均匀分布,防止单AZ资源耗尽 - 配置
minDomains和whenUnsatisfiable: DoNotSchedule避免因局部不均导致调度失败 - Cluster Autoscaler根据Pending Pod的Requests自动增减Node,但需配合HPA/VPA——HPA扩副本提升横向密度,VPA调Requests提升纵向密度,二者共同推高节点平均利用率










