小请求可以在大限制下完成调度,超过节点可分配容量的请求则保持 Pending。

调度器计算资源请求,而不是瞬时使用率

Kubernetes 调度判断的是 Pod 在资源请求和其他放置约束下是否适合某个节点,不是简单查看当前 CPU 曲线,然后把任务塞进看起来最空闲的位置。请求为未来需求提供记账输入,实际使用率则是另一种观测。决定一个表面空闲的集群是否有能力容纳特定 Pod 之前,需要同时理解两者,不能让其中一个指标替代全部容量判断。 以准入后的真实配置为依据 对于普通应用容器,调度器在判断节点是否容纳 Pod 时,会计算它们的请求。初始化需求、Pod 额外开销以及受支持的 Pod 级资源配置,也可能影响有效请求。最终经过准入的 Pod 才是实际输入,包括默认值和修改结果,而不只是操作者记得提交的源文件。排查时应读取保存下来的对象,确认控制面实际看到什么。 Node allocatable 也不同于硬件总容量,它表示按照节点配置可以提供给 Pod 的资源量。其他工作负载即使暂时空闲,其资源请求仍然占用调度记账中的空间。不过,请求并不表示应用已经实际分配了同样多的物理内存,也不表示独占相应数量的 CPU 核心。放置记账、实时消耗和独占策略属于不同机制,不能混用“预留”一词解释。 限制通过执行栈约束运行中的工作负载,通常不会在调度检查时替代已经显式填写的较小请求。因此,一个容器的 CPU limit 可以大于单个节点 CPU 容量,同时仍然凭较小 request 完成调度。这个被接受的限制不会制造额外处理器,也不承诺进程一定能够达到填写的上限;它只是配置了允许使用的边界。 坏掉的样子 Pending 可能源于请求资源不足,也可能由污点、亲和性、存储、拓扑或其他条件阻塞。改变资源值之前,应查看 PodScheduled 条件和调度事件。降低请求无法修复不匹配的节点选择器或不可用的卷;如果原请求本来真实,盲目降低还可能把调度失败转化成运行期争用,并没有建立合理容量方案。 默认值让省略字段尤其容易误读。填写 limit 而不填 request,且没有准入机制提供另一默认请求时,Kubernetes 会把该资源限制复制为请求。因此,只设置一个很大的 limit,也可能形成很大的调度需求。应查看实际对象中的两个映射,并考虑 LimitRange 的影响,再解释放置失败,不能假定省略请求就等于完全没有记账成本。 ...

四月 2, 2028 · 3 分钟 · XB Field Notes