kubectl describe quota compute-quota -n prod
kubectl get pod -n prod -o jsonpath='{range .items[*]}{.spec.containers[*].resources.requests.cpu}{"\n"}{end}'
kubectl delete job -n prod --field-selector status.successful=1

命名空间 ResourceQuota 配了 requests.cpu 20,新 Pod 报 exceeded quota: compute-resources, requested: requests.cpu=2。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,配额按所有 Pod 的 requests 之和计算,缩容后没释放的旧 ReplicaSet 和 Completed 的 Job Pod 也占额度。只看正在运行的 Pod 会漏算。

「命名空间配额打满」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。改完隔一天再看一次,当场正常不代表能稳住。

测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

处理上按这个顺序:用 describe quota 看 Used 和 Hard 的差值;统计该命名空间所有 Pod 的 requests 总和 包括已结束的;清理 Completed 的 Job 和不再使用的 ReplicaSet;确实不够就提配额 别靠改小 requests 绕过。

改完只确认一件事:describe quota 的 Used 降到 Hard 以下 新 Pod 能正常创建。

作者 9823189