目标
没有配额时每个 Pod 都在与整个集群竞争,嗓门最大的负载获胜。ResourceQuota 把每个命名空间变成有界的牧场:requests、limits 与对象数的硬上限由 API 服务器在准入时强制执行。吵闹的分析任务现在会在调度第 51 个 Pod 时被拒,而不是 OOM 掉支付服务。
步骤要点
- 在 analytics 命名空间创建 ResourceQuota:requests.cpu 8、requests.memory 16Gi、limits.memory 24Gi、pods 40。
- 配 LimitRange 为省略 requests 的容器兜底默认值(100m/128Mi),杜绝零成本占位调度。
- kubectl describe resourcequota 核对 used 与 hard 的实时计数,确认执行已生效。
- 故意提交超配额的 Job:应收到 quota exceeded 准入失败而非吃掉集群。
- 压力期间 kubectl top 观察 payments 命名空间内存与重启数不受影响,验证隔离真实有效。
排错提示
部署被配额卡住是滚动更新的 surge 顶到上限,按 surge 余量上调配额或调低 maxSurge;Pod 被限流致死是 limits 远低于真实需求,按负载单独调 limits 而不是放宽命名空间总帽;团队用极小 requests 钻空子时配额只数 requests 不管公平,需再配 PriorityClass 让可让路的批任务在压力下给关键服务让路。
适用边界
配额按命名空间不按用户,多服务共用一个命名空间需要更细的内部治理;对象数配额可能破坏会创建大量小资源的 Operator,上计数限制前先验证其行为。
代码示例
spec:
hard:
requests.cpu: "8"
requests.memory: 16Gi
limits.memory: 24Gi
pods: "40"
# And defaults so nothing schedules as zero-cost
spec:
limits:
- type: Container
defaultRequest: { cpu: 100m, memory: 128Mi }