怎么配置 ResourceQuota 限制命名空间下的资源使用量

文章导读
在 Kubernetes 中配置 ResourceQuota 是限制命名空间资源总量的标准做法,适用于多租户集群或需要防止单个业务线耗尽集群资源的场景。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

在 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. 查看配额状态

怎么配置 ResourceQuota 限制命名空间下的资源使用量
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/内存限制)