知识卡片

requests与limits双设置项是对抗"多多益善"心理的过度申请浪费

普通读书笔记卡

内容

资源配额设在容器上(Pod的配额是所含容器需求的累加值,无须手动设置), 但Kubernetes给了requests和limits两个独立设置项,用途完全不同:requests 是给调度器用的,Kubernetes选哪个节点运行Pod只看requests;limits才是给 cgroups用的,真正传给cgroups做资源限制的是limits的值。这个设计源自 Google在Borg/Omega系统长期运行中总结的经验:用户申请资源配额时天然 倾向”多多益善”——按可能面临的最大压力甚至未来增长去估算,为了避免服务 中断都往大了申请。如果直接按申请量分配限额,结果会是硬件资源大部分 时间闲置、但这些闲置资源又已经”名花有主”、无法被别人使用。用requests 和limits拆开只是第一步——调度器按requests(相对保守的估计)去撮合, 但如果真按最保守安全的方式分配,就意味着编排系统必须为万一发生的极端 情况买单:如果允许节点分配给Pod的资源总和超过自己能提供的最大资源, 一旦某一刻这些Pod的真实消耗真的超标了,节点就无法继续履行调度时对Pod 许下的资源承诺,只能杀掉部分Pod腾资源——这正是[[三级服务质量等级决定 资源不足时先杀谁]]要解决的问题。理解这个链条能看清一件事:Kubernetes 牺牲”绝对安全”换取”硬件利用率”这个取舍,本身就注定了后续必须再造一整套 “该先牺牲谁”的规则来兜底,这不是可有可无的附加功能,而是这个取舍必然 带来的配套成本。

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第14章"资源与调度"14.2节 "服务质量与优先级"(源文件:_epub-src对应OEBPS/Text/chapter165.xhtml) - 结论依据:原文说明requests供调度器决策、limits供cgroups限制的分工, 引用Google Borg论文关于用户过度申请资源的经验总结,并说明如果不允许 超额分配会导致硬件闲置浪费、但允许超额分配又必须为极端情况准备驱逐 机制,直接支撑本卡片结论。 - 原始内容:requests是供调度器使用的……limits才是供cgroups使用的…… 大多数的工作负载在运行过程中真正使用到的资源,其实都远小于它所请求 的资源配额……如果直接按照申请的资源去分配限额,所导致的结果必然是 一方面服务器在大多数时间里都会有大量硬件资源闲置。