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