知识卡片
ResourceQuota在名称空间层面做的是比Pod更高层次的广义资源约束
内容
[[requests与limits双设置项是对抗多多益善心理的过度申请浪费]]、
[[三级服务质量等级决定资源不足时先杀谁]]、[[软驱逐硬驱逐的观察期设计
及驱逐与垃圾收集的本质差异]]这些机制都是Pod层面的单点约束,但现实中
经常需要面向更高层次控制资源——限制由多个Pod构成的整个微服务系统能
消耗的资源总量,或者限制一个团队能用的总资源。举个具体例子:一个
32GiB内存、16个处理器的集群,要求A团队最多用20GiB内存和10个处理器、
B团队最多用10GiB内存和4个处理器、剩余2GiB和2个处理器预留给未来分配——
这类需求Kubernetes的方案是先建一个专属的名称空间,再在名称空间里建
ResourceQuota对象来描述整体约束。ResourceQuota和调度没有直接关系,
约束对象也不是Pod,所以它管的”资源”可以是广义的——不仅能设处理器、
内存这类物理资源限额,还能设Pod最大数量、ReplicaSet最大数量、Service
最大数量、全部PersistentVolumeClaim的总存储容量这类抽象资源限额;甚至
在Kubernetes预置的资源模型不够用时,还能通过设备插件(Device Plugin)
机制扩展出像nvidia.com/gpu:4这样的自定义资源配置。这说明Kubernetes
的资源约束体系是分层的:Pod层管”这一个工作负载该分到多少、该不该被
牺牲”,名称空间层管”这一批工作负载/这个团队总共能用多少”,两个层次
互不替代,各自解决不同粒度的资源治理问题。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第14章"资源与调度"14.3节
"驱逐机制"(源文件:_epub-src对应OEBPS/Text/chapter166.xhtml)
- 结论依据:原文用A、B两个团队按名称空间分配总资源的具体例子说明
ResourceQuota的用途,并指出它针对的是广义资源(不仅是处理器内存,
还包括Pod/ReplicaSet/Service数量、PVC总容量,甚至可通过Device
Plugin扩展自定义资源),直接支撑本卡片结论。
- 原始内容:现实中我们还常会遇到面向更高层次去控制资源的需求……
Kubernetes的解决方案是先为它们建立一个专用的名称空间,然后在名称
空间里建立ResourceQuota对象来描述如何进行整体的资源约束……不仅能够
设置处理器、内存等物理资源的限额,还可以设置诸如Pod最大数量……等
各种抽象资源的限额。