配额与默认值是什么
ResourceQuota 与 LimitRange 都是命名空间级对象,解决两个层面的问题:前者限制整个命名空间的资源总量与对象数量,防止某个团队把集群吃干;后者规定单个容器(或存储声明)的默认值与上下限,让没写资源声明的工作负载也能被补齐或被拦住。多团队共享集群时这两个对象通常要一起配,只配一半会带来要么创建失败、要么无人约束的尴尬局面。
基本信息
| ResourceQuota 字段 | requests.cpu、limits.memory、pods、services、count/jobs.batch 等 |
|---|---|
| LimitRange 字段 | default、defaultRequest、max、min、maxLimitRequestRatio |
| 生效方式 | 配额按命名空间累计,超限创建返回 403 并在事件里提示 |
| 联动规则 | 配额里出现 requests.cpu 时,容器必须声明 requests 才能创建 |
| 查看 | kubectl describe quota -n 命名空间 与 kubectl describe limitrange |
| 适用范围 | 只作用于本命名空间,不跨命名空间累计 |
典型使用场景
- 多团队共享集群:按命名空间切分资源,防止互相抢占
- 新命名空间开箱可用:用 LimitRange 给未声明资源的容器补默认值
- 限制单容器最大值,避免一个大 Pod 吃掉整台节点
- 按部门统计资源占用,为成本归口提供依据
- 测试环境压低上限,逼出真实的资源需求
组合示例
组合示例
apiVersion: v1
kind: ResourceQuota # 命名空间总量上限
metadata:
name: dev-quota
namespace: dev
spec:
hard:
requests.cpu: "8"
requests.memory: 16Gi
limits.cpu: "16"
limits.memory: 32Gi
pods: "50"
---
apiVersion: v1
kind: LimitRange # 单容器默认值与上下限
metadata:
name: dev-defaults
namespace: dev
spec:
limits:
- type: Container
default: { cpu: 500m, memory: 512Mi }
defaultRequest: { cpu: 100m, memory: 128Mi }
max: { cpu: "4", memory: 8Gi }两个对象的分工
| 对象 | 作用范围 | 典型配置 | 行为 |
|---|---|---|---|
| ResourceQuota | 命名空间总量 | requests.cpu、limits.memory、pods | 超额创建报 403 并写事件 |
| LimitRange | 单个容器或存储声明 | default、defaultRequest、max、min | 未声明时补默认值,超限则拒绝 |
配额里只要出现 requests.cpu 之类的键,所有容器就必须显式声明对应 requests;这正是需要同时配 LimitRange 的原因。
kubectl get resourcequota -n dev -o yaml 里的 status.used 与 status.hard 是判断“还剩多少额度”的最直接依据。
LimitRange 还能约束存储声明与比值:maxLimitRequestRatio 限制 limits 与 requests 的倍数,避免申请很小、上限开得极大的取巧写法。
配额是团队自治的基础设施:没有配额,任何命名空间都能把集群资源吃光,事后也说不清是谁的负载。