知识卡片
三级服务质量等级决定资源不足时先杀谁
内容
[[requests与limits双设置项是对抗多多益善心理的过度申请浪费]]留下的 超额分配风险,靠服务质量等级(QoS Level)来兜底——这是Pod的一个隐含 属性,纯粹由requests和limits的设置方式推导出来,不需要用户单独声明。 三级由高到低:Guaranteed——Pod中所有容器都设置了limits和requests且 两者相等;Burstable——部分容器requests小于limits,或者只设requests不 设limits;BestEffort——limits和requests都不设置。不设限制看起来是”最 灵活”的选择(可以使用节点上所有可用计算资源),但Google在Borg论文里 明确给出近乎惩罚性的建议:节点资源不足时优先杀掉这类Pod——这类Pod正是 最不稳定的风险来源,因为它没有对自己需要多少资源做出任何承诺。因此 建议把数据库这类有状态、不容中断的应用设为Guaranteed(除非用超了自己 声明的limits,或者节点内存压力大到把所有更低等级的Pod都杀光了,否则不 会被自动杀死);临时的、不重要的任务设为BestEffort(调度时更容易找到 宿主机,也更容易被优先牺牲)。这套等级制度背后是一句直白的价值判断—— “所有Pod生来平等,但有些Pod比其他Pod更加平等”(书中借用《动物庄园》 的名句):Kubernetes明确不承诺对所有工作负载一视同仁,而是要求你用 requests/limits的设置方式主动表明这个Pod有多重要。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第14章"资源与调度"14.2节
"服务质量与优先级"(源文件:_epub-src对应OEBPS/Text/chapter165.xhtml)
- 结论依据:原文定义Guaranteed/Burstable/BestEffort三级服务质量等级的
推导规则,引用Google Borg论文对未设置limits/requests的Pod给出的
惩罚性建议,并建议数据库类应用设为Guaranteed、临时任务设为
BestEffort,直接支撑本卡片结论。
- 原始内容:如果Pod中所有的容器都设置了limits和requests,且两者的值
相等,那此Pod的服务质量等级便为最高的Guaranteed……当节点硬件资源
不足时,优先杀掉这类Pod,说得文雅一点,就是给予这类Pod最低的服务
质量等级。