Kubernetes配额问题排查:作业运行两周后Pod因配额不足停摆且无运行Pod
这种情况我碰到过好几次,核心原因是Job产生的已终止(Completed/Failed)Pod没有被清理,它们的资源请求依然会被ResourceQuota统计占用配额,哪怕这些Pod早就不在运行状态了。
第一步:验证问题根源
先确认是不是历史Pod在搞鬼:
查看
rate-jobs命名空间下所有状态的Pod,包括已终止的:kubectl get pods -n rate-jobs你大概率会看到一堆
Completed或者Failed状态的Pod,这些就是占用配额的“元凶”。查看ResourceQuota的实际使用情况,对比限制和已使用量:
kubectl describe resourcequota rate-jobs-compute-resources -n rate-jobs这个命令会清晰展示
hard(配额上限)和used(已使用量)的数值,你会发现已使用量已经接近或达到了上限。
第二步:解决方法
1. 立即清理历史Pod
先手动释放被占用的配额:
# 删除所有Completed状态的Pod kubectl delete pods -n rate-jobs --field-selector=status.phase=Completed # 如果有Failed的Pod也需要清理,执行这条 kubectl delete pods -n rate-jobs --field-selector=status.phase=Failed
执行完之后再尝试创建新Pod,应该就能正常运行了。
2. 配置Job自动清理历史Pod
手动清理只是临时解决,要避免以后再出现这个问题,需要修改Job的历史保留策略:
编辑现有Job的配置,减少保留的历史Pod数量:
kubectl patch job <你的Job名称> -n rate-jobs -p '{"spec":{"successfulJobsHistoryLimit":1,"failedJobsHistoryLimit":0}}'这里设置成功的Job只保留1个历史Pod,失败的直接清理,你可以根据自己的需求调整数值。
如果是CronJob生成的Job,要修改CronJob的模板配置,让它创建的所有Job都自动清理历史:
apiVersion: batch/v1 kind: CronJob metadata: name: <你的CronJob名称> namespace: rate-jobs spec: schedule: "你的调度规则" jobTemplate: spec: successfulJobsHistoryLimit: 1 failedJobsHistoryLimit: 0 template: # 你的Pod模板内容
3. (可选)调整ResourceQuota上限
如果你的业务确实需要更多资源,可以调整ResourceQuota的hard限制,但这只是治标不治本,优先推荐前面的自动清理方案。
补充说明
Kubernetes的ResourceQuota统计的是命名空间内所有存在的Pod的资源请求(requests),不管Pod处于运行、终止还是等待状态,只要Pod对象还存在,就会被算入配额使用量。Job默认会保留3个成功Pod和1个失败Pod,运行两周的作业会积累大量这类“僵尸”Pod,最终耗尽配额。
内容的提问来源于stack exchange,提问作者Shahbour

