k8s 中资源限制 limit 和 request 的关系
在 Kubernetes(k8s)中,resources
字段里的 requests
和 limits
是用来管理容器资源使用的两个关键参数。如果你在 YAML 配置中只设置了 limits
而没有设置 requests
,会带来一些潜在的问题和影响,具体如下:
✅ 背景知识
requests:调度时使用,告诉调度器「我需要的最小资源」。
limits:运行时强制限制,告诉 kubelet 「不能超过的资源上线」。
❗只设置 limits
不设置 requests
会发生什么?
调度器使用默认
requests
(通常是 0)如果你只设置了
limits
,而不设置requests
,调度器会使用默认值(大多数情况下是 0)进行调度。后果:Pod 可能会被调度到资源非常紧张的节点上,导致该节点资源过载或 OOM(Out of Memory)。
影响资源公平分配
Kubernetes 的调度器依赖
requests
来做资源的负载均衡,如果设置不合理,就会影响整体资源调度的效率。Pod 可能被驱逐(Evicted)
当节点内存紧张时,Kubernetes 会优先驱逐
requests
小或为 0 的 Pod。所以只设
limits
的 Pod 更容易被驱逐。不利于 HPA(Horizontal Pod Autoscaler)
如果你使用了 HPA,它会依据
requests
来评估资源使用百分比。如果没设置requests
,可能导致 HPA 无法合理判断负载,缩放策略失效。
✅ 建议
始终 同时设置 requests
和 limits
,并且合理估算请求和限制的差距,以便:
避免资源挤兑
提高调度效率
降低 OOM 风险
支持 HPA 等高级特性
如果使用的是 Java 10,还可以使用额外配置 -XX:MaxRAMPercentage
。不过这个配置是软限制,不如 xmx/xms 配合 limit/request 更让人放心。
版权声明: 本文为 InfoQ 作者【陈德伟】的原创文章。
原文链接:【http://xie.infoq.cn/article/3786dac5c3524a78b35ee0a04】。文章转载请联系作者。
评论