Pending状态的Pod是否占用ResourceQuota?及K8s相关代码查找咨询
是的,Pending状态的Pod依然会占用ResourceQuota的资源配额。
ResourceQuota的统计逻辑基于Pod的spec.containers[].resources.requests(若未设置requests则使用limits,两者都未设置则不统计)计算资源占用量,只要Pod对象存在于集群中(未被删除),无论处于Pending、Running还是其他非终止状态,都会被计入命名空间的资源配额使用量。
举个实际场景:如果命名空间CPU配额为1核,你创建了一个请求0.8核的Pod但因无合适节点调度处于Pending状态,此时再创建请求0.3核的Pod会被拒绝——因为Pending Pod已占用了大部分配额,总请求量超出限制。只有当Pending Pod被删除后,对应的配额才会释放。
Kubernetes的ResourceQuota相关代码集中在几个核心目录,可按以下路径定位:
ResourceQuota控制器核心逻辑
路径:pkg/controller/resourcequota/resource_quota_controller.go
这是ResourceQuota控制器的主入口,syncResourceQuota方法触发配额同步计算,其中调用的calculateUsage函数会遍历命名空间内所有资源(包括Pod),统计资源占用量并更新Quota状态。Pod资源配额评估器
路径:pkg/quota/pod/pod_quota.go
这里定义了PodEvaluator并实现了配额系统的Evaluator接口,核心方法包括:Usage: 提取单个Pod的CPU、内存等requests/limits,计算其资源占用量Constraints: 判断Pod的资源请求是否符合Quota限制
这是Pod与ResourceQuota交互的核心逻辑文件,且不会过滤Pending状态的Pod——只要Pod对象存在就会计算其资源请求。
通用配额计算框架
路径:pkg/quota/generic/evaluator.go
这里实现了通用的资源配额统计逻辑,会调用各类资源的Evaluator(比如PodEvaluator)汇总命名空间内的总资源使用量,是连接控制器与具体资源评估器的中间层。
内容的提问来源于stack exchange,提问作者hqx

