pod 不写 resources 就创建失败,是因为启用 resourcequota 的命名空间强制要求所有 pod 显式声明 requests 和 limits,否则准入控制器(resourcequota.admission.k8s.io)会拒绝请求;requests 是调度依据,limits 是运行上限,二者须满足 min ≤ requests ≤ limits ≤ max,且单位需规范(如 cpu 用 m、memory 用 mi/gi)。

必须在 Pod 的 spec.containers[].resources 中显式配置 requests 和 limits,否则在启用了 ResourceQuota 的命名空间中,Pod 创建会直接被拒绝(HTTP 403)。这不是可选项,而是强制约束。
为什么 Pod 里不写 resources 就创建失败?
当 Namespace 中存在 ResourceQuota 对象且启用了 CPU/memory 配额时,Kubernetes 要求所有新建 Pod 必须声明 requests.cpu、requests.memory 等字段。否则准入控制器会拦截请求,并返回类似这样的错误:
error: failed to create resource: admission webhook "resourcequota.admission.k8s.io" denied the request: object didn't match resource quota "dev-quota"
这不是 bug,是设计行为——配额系统无法对“未知量”做总量控制。
常见误操作包括:
- 只写了
limits没写requests(仍会失败) - 写了
requests但值为"0"或空字符串(等同于未设置) - 使用了
LimitRange但没检查其min是否被违反(比如min.memory: 128Mi,而你写了requests.memory: 64Mi)
如何正确填写 requests 和 limits 的值?
核心原则:requests 是调度依据,limits 是运行天花板;二者单位必须一致,且需满足 min ≤ requests ≤ limits ≤ max(受 LimitRange 约束)。
实际配置建议:
-
cpu单位统一用m(如500m),避免写0.5—— 虽然语义等价,但部分旧版 kubelet 对小数解析不稳定 -
memory单位优先用Mi或Gi(二进制),不用MB/GB—— 1Gi = 1024Mi,而 1GB = 1000MB,混用会导致 OOM 风险 - 不要让
limits远高于requests(例如requests: 256Mi/limits: 4Gi),这会降低调度器填装率,也削弱内存压力感知能力 - Java/Node.js 类应用要额外预留 JVM 堆外内存或 GC 元数据空间,
limits应 ≥heap + native + buffer
LimitRange 怎么影响你的 Deployment YAML?
LimitRange 不会自动注入 values,但它像一道过滤网:你在 Deployment 里写的 resources 必须落在它的 min/max 范围内,否则 kubectl apply 会静默失败(Pod 处于 Pending 状态,kubectl describe pod 显示 “exceeded maximum allowed”)。
典型陷阱:
- 定义了
min.cpu: 100m,但容器只写requests.cpu: 50m→ 创建失败 - 定义了
default.memory: 512Mi,但你没写limits.memory→ 容器会自动获得512Mi限制,可能低于实际需求 - 多个容器共用一个 Pod,
requests总和超过 Node 可分配资源 → 调度失败,和LimitRange无关,但容易误判
验证方式:kubectl describe limitrange -n <ns></ns> 查看当前命名空间的硬性边界。
Deployment 中 resources 配置的最小可行示例
以下是一个能通过 ResourceQuota + LimitRange 双重校验的 Deployment 片段(假设 namespace 已配置 min.memory: 128Mi, max.memory: 2Gi):
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
spec:
template:
spec:
containers:
- name: app
image: my-registry/api:v2.1
resources:
requests:
cpu: "250m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "1Gi"
注意:requests.memory 必须 ≥ 128Mi,limits.memory 必须 ≤ 2Gi,且 requests ≤ limits。少一个字段、越一个边界,都会卡在准入阶段。
最常被忽略的一点:即使你只部署一个容器,也要确保它的 requests 值能让调度器在至少一个 Node 上找到足够空闲资源——LimitRange 管范围,ResourceQuota 管总量,而真实调度成功与否,取决于 Node 的 allocatable。











