在 Kubernetes 中配置 ResourceQuota 是限制命名空间资源总量的标准做法,适用于多租户集群或需要防止单个业务线耗尽集群资源的场景。
先说结论:ResourceQuota 通过硬性限额拦截超额申请,但不会预留资源,需配合 LimitRange 强制 Pod 声明资源需求。
- 适合:多团队共享集群、需要控制成本或防止资源滥用的环境。
- 先准备:规划好 CPU/内存上限,确认命名空间内现有负载用量。
- 验收:创建超额 Pod 应被拒绝,正常 Pod 能成功调度且配额计数更新。
命令速用版
以下 YAML 定义了一个限制 CPU 和内存总量的配额对象,可直接应用:
apiVersion: v1
kind: ResourceQuota
metadata:
name: mem-cpu-demo
namespace: quota-mem-cpu-example
spec:
hard:
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
应用命令:
kubectl apply -f quota.yaml
为什么会这样
ResourceQuota 的核心逻辑是“聚合统计”而非“资源预留”。它统计命名空间下所有非终止状态资源的 requests 和 limits 总和,一旦新建请求导致总和超过 hard 限制,API Server 会直接拒绝(返回 403)。它不影响已运行的 Pod,也不保证节点一定有足够物理资源,只确保逻辑配额不超标。
分步处理
1. 创建或确认命名空间
配额是命名空间级别的,先确保目标命名空间存在。
kubectl create namespace quota-mem-cpu-example
2. 应用配额配置
将上述 YAML 保存为文件并应用。注意配额立即生效,后续创建资源会受限制。
3. 配合 LimitRange(建议)
若配额开启了 CPU 或内存限制,Pod 必须显式声明 requests。为防止用户遗漏,可创建 LimitRange 设置默认值。
怎么验证是否生效
1. 查看配额状态
kubectl describe resourcequota mem-cpu-demo -n quota-mem-cpu-example
观察 Used 和 Hard 字段,确认已用资源量随 Pod 创建增加。
2. 尝试超额创建
尝试创建一个会导致总量超标的 Pod,预期看到错误提示 Forbidden: exceeded quota。
3. 检查 Pod 事件
若 Pod 创建成功但无法调度,检查 Events 字段,排除是否因节点物理资源不足而非配额问题。
常见坑
1. Pod 未声明 resources
若配额限制了 requests.cpu,未声明 requests 的 Pod 会被直接拒绝。建议配合 LimitRange 设置默认值。
2. 多个配额对象冲突
同一命名空间存在多个 ResourceQuota 时,系统可能以最小值生效,导致预期不一致,建议每个命名空间只维护一个活跃配额。
3. 不影响已运行资源
修改配额不会驱逐已超标的旧 Pod,只拦截新请求。若已有负载超标,需手动缩容。
参考来源
- Kubernetes Official Docs: Resource Quotas (https://kubernetes.io/docs/concepts/policy/resource-quotas/)
- 知识库:如何在 Kubernetes 中利用 Resource-Quota 防止命名空间级别的资源超额占用
- 知识库:Kubernetes 实操:创建命名空间与资源配额 (CPU/内存限制)