结论:调度器按节点维度的 requests 做装箱判定,"总剩余够但没有单节点装得下"就是碎片。治理手段分三层:调度侧用 Descheduler 重平衡、节点侧统一规格与自动伸缩、规格侧让 requests 贴近真实用量。
展开:成因诊断:kubectl describe pod 看到 Insufficient cpu/memory,但集群总体利用率不高——典型如节点剩余 1 核 × 10 台,新 Pod 要 4 核。解法展开:1)Descheduler 是官方重平衡器,策略如 LowNodeUtilization(把低利用率节点上的 Pod 驱逐到高利用率节点,腾空后缩容)、RemoveDuplicates、按污点/亲和性纠偏;驱逐依赖 PDB 限制中断范围。2)节点规格趋同:混用大小机型天然制造碎片,大 Pod 只能落大机型;Karpenter/Cluster Autoscaler 在 Pending 时按需求供给合适机型,比固定节点组更抗碎片。3)requests 校准:requests 虚高(拍脑袋 4 核实际用 0.5 核)是碎片的最大来源——用 VPA 的推荐模式或 Prometheus 历史数据持续校准;4)binpack 打分:调度器插件 NodeResourcesFit 配 MostAllocated 策略让 Pod 尽量堆满部分节点,留整块空闲节点给大 Pod。易错点:驱逐不解决 requests 虚高,只是搬运;碎片率监控指标(不可调度 CPU 占比)应纳入容量看板。
追问方向:调度框架的 Filter/Score 两阶段、Coscheduling(gang scheduling)解决什么(批任务要么全上要么全不上)。