首页/云/Kubernetes 速查/用数据校准 requests/limits
调度与资源52 条

用数据校准 requests/limits

上线前压测、上线后按监控回归:requests 参考稳态 P95 用量,limits 按峰值与运行时特性放大,避免长期拍脑袋。

Kubernetes 速查云更新于 2026-10-13

requests 与 limits 各自决定什么

requests 决定调度器给 Pod 找什么样的节点,也是 cgroup 权重与 QoS 划分的依据;limits 决定容器最多能用多少资源。设低了,节点超卖严重,高峰互相争抢导致延迟抖动;设高了,节点利用率低、扩容成本上升,还会把 Pod 挤到没有节点可调度。可行做法是用压测和监控数据校准:requests 参考稳态用量,limits 在峰值上留出余量,并按运行时特性(GC、线程池、缓存)修正。

基本信息

适用对象所有声明 resources 的工作负载(Deployment、StatefulSet、Job 等)
关键字段containers[].resources.requests 与 limits 下的 cpu、memory
数据来源kubectl top、监控系统历史曲线、上线前压测报告
常见单位cpu 用 m(1000m 等于 1 核),memory 用 Mi、Gi
相关机制QoS 等级、LimitRange 默认值、HPA 利用率口径

典型使用场景

  • 新服务上线:压测阶段采集用量曲线,给出第一版 requests 与 limits
  • 容量治理:节点利用率偏低或长期超卖时,按监控数据重新校准
  • 故障复盘:出现 OOMKilled 或 CPU 限流后回归资源声明
  • 大版本升级后:运行时或依赖变化会改变资源画像,需要复测
  • 成本优化:在不牺牲稳定性的前提下压出真实所需资源

取证与校准路径

取证与校准路径
kubectl top pod -l app=web --containers            # 当前用量,可判断是否严重超卖
kubectl get pod web-x -o jsonpath='{.spec.containers[*].resources}'
kubectl describe node node1 | sed -n '/Allocated resources/,/Events/p'   # 节点已分配 vs 可分配
# 口径参考(按容器分别统计):
# requests ≈ 稳态 P95;CPU limits ≈ 峰值 × 1.2-1.5;内存 limits ≈ 峰值 + 明确余量

资源校准口径

资源requests 参考limits 参考注意
CPU稳态 P95 用量峰值乘 1.2-1.5可压缩资源,超限被限流而非杀进程
内存常驻内存 P95峰值加余量不可压缩,超限直接触发 OOMKilled
并发相关按并发模型评估随连接数上升线程池与连接池会放大内存峰值
缓存按常驻缓存量按最大缓存缓存策略变化时需重新评估
QoS 取决于声明组合:所有容器都写 requests 且与 limits 相等是 Guaranteed;只写 limits 时 requests 会自动取相同值;完全没写才是 BestEffort,节点内存紧张时最先被驱逐。
校准不是一次性工作:大版本升级、依赖变化、流量结构改变都会让资源画像漂移,建议按季度或重大变更后回归一次。

易错点

  • 按平均用量设 requests:长期处于超卖争抢状态,高峰延迟抖动,扩副本也解决不了争抢问题
  • 内存 limits 贴着实测峰值:一次流量尖峰就 OOMKilled,容器反复重启且日志里看不到应用报错
  • 只调 requests 不回归 limits 或只调其一:容量模型与限流阈值脱节,行为难以预测
  • 改大 requests 后不看调度结果:节点容量不足时 Pod 变 Pending,需与节点扩容策略一并评估

数据来源与参考

  • Kubernetes 官方文档 · 管理容器资源(实践总结)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌