kubernetesK8s学习笔记第十一期集群资源与弹性下篇资源配额与限制——ResourceQuota LimitRange本笔记为 Kubernetes 系列第十一期聚焦集群资源配额与限制。涵盖ResourceQuota 命名空间资源配额对象数量/计算资源、LimitRange 容器资源默认值与限制范围、request/limit 的配置实验。所有命令和 YAML 示例均已经过整理和注释。全文约4100 字包含15 个 YAML 示例、35 命令示例和9 张对比表格是 Kubernetes 集群资源管理的重要补充。更多kubernetes系列知识kubernetes从入门到进阶知识衔接上一期kubernetesK8s学习笔记第十期集群资源与弹性上篇监控与自动扩缩——Metrics Server HPA— Compiled and Authored by Whisky — July 2 nd, 2026目录引子从“资源管理的第三个层次”说起ResourceQuotaLimitRange总结与知识点一览表引子从“资源管理的第三个层次”说起在第十期开篇我们提出了 Kubernetes 资源管理的三个层次层次问题K8s 组件状态监控层资源用了多少Metrics Server✅ 第十期已讲扩缩层资源不够怎么办HPA✅ 第十期已讲约束层如何防止超用ResourceQuota / LimitRange本期讲解在第十期中我们通过 Metrics Server 获得了资源“可见性”通过 HPA 实现了资源“自动调配”。但还有一个关键问题没有解决如何防止某个命名空间或某个容器占用过多资源影响集群中其他工作负载的正常运行ResourceQuota 和 LimitRange 的关系想象一下你是一个公寓管理员集群管理员有很多个租户命名空间。你需要管理的是ResourceQuota就像是“整栋楼的用水用电额度”——每个单元命名空间的总用水量总 CPU/内存不能超过某个限额。LimitRange就像是“每户人家的水龙头规格”——每家每个容器的水龙头不能太小min也不能太大max如果租户自己没装水龙头管理员会给他一个标准的default。两者分工明确ResourceQuota 管“总量”——防止一个租户用光整栋楼的资源LimitRange 管“个体”——防止一个水龙头要么开不了要么爆水管本期就来分别介绍这两个组件。一句话概括本期的价值ResourceQuota 让你“管住总量”LimitRange 让你“定好规矩”——这就是集群资源管理的“安全网”和“标准尺”。本期学习路径ResourceQuota限制命名空间总资源用量 ↓ LimitRange为单个容器设置默认资源值 ↓ request/limit 的配置实验一、ResourceQuota1.1 为什么需要 ResourceQuota在多租户或多人共享的 Kubernetes 集群中一个常见的问题是某个用户或团队可能会消耗过多的集群资源导致其他用户的应用无法正常运行。ResourceQuota资源配额正是为了解决这个问题而设计的。核心作用ResourceQuota 用于限制命名空间Namespace中可以创建的资源总量防止单个命名空间消耗过多集群资源。ResourceQuota 的工作方式集群管理员为每个命名空间创建一个或多个 ResourceQuota 对象用户在该命名空间下创建资源时配额系统会实时检查资源使用情况如果创建请求会导致资源用量超过配额限制请求会被拒绝HTTP 403配额限制是累加的——同一个命名空间中的多个 ResourceQuota 对象共同生效1.2 配额类型Kubernetes 的 ResourceQuota 可以限制两类资源类型说明示例对象数量限制 Kubernetes 资源的数量pods、services、secrets、configmaps 等计算资源限制物理或虚拟资源容量CPU、内存、存储容量对象数量配额资源说明podsPod 总数servicesService 总数secretsSecret 总数configmapsConfigMap 总数persistentvolumeclaimsPVC 总数deployments.appsDeployment 总数replicasets.appsReplicaSet 总数jobs.batchJob 总数cronjobs.batchCronJob 总数实施对象数量配额可以提高 Kubernetes 集群稳定性避免 etcd 数据库无限增长还可以避免占用节点上其他功能资源如 IP 地址。计算资源配额资源名称说明requests.cpu所有 Pod 的 CPU 请求总和上限requests.memory所有 Pod 的内存请求总和上限limits.cpu所有 Pod 的 CPU 限制总和上限limits.memory所有 Pod 的内存限制总和上限requests.storage所有 PVC 的存储请求总和上限单位说明CPU1 CPU 核心 1000mmillicoresmemory支持两种进制Ki | Mi | Gi | Ti1024 进制如 1Gi 1024Mik | M | G | T1000 进制如 1G 1000M默认单位是字节1.3 配额管理创建 ResourceQuota创建对象数量配额rootmaster30:~# kubectl create quota myquota --hardpods2,services3,secrets5,persistentvolumeclaims10查看 ResourceQuotarootmaster30:~# kubectl get resourcequotasNAME AGE REQUEST LIMIT myquota 10s persistentvolumeclaims:0/10, pods:0/2, secrets:1/5, services:0/3 rootmaster30:~# kubectl describe quota myquotaName: myquota Namespace:quotaResource Used Hard -------- ---- ---- persistentvolumeclaims010pods02secrets15services03通过 YAML 文件创建apiVersion:v1kind:ResourceQuotametadata:name:myquotaspec:hard:persistentvolumeclaims:10pods:2secrets:5services:3测试配额效果# 尝试创建 3 个副本的 Deployment配额限制 pods2rootmaster30:~# kubectl create deployment web --imagenginx --replicas3deployment.apps/web created# 查看 Pod 状态——只有 2 个 Pod 成功创建rootmaster30:~# kubectl get podsNAME READY STATUS RESTARTS AGE web-96d5df5c8-dl7qk1/1 Running040s web-96d5df5c8-j7fhh1/1 Running040s# 第 3 个 Pod 因配额限制创建失败rootmaster30:~# kubectl describe rs web-96d5df5c8... Warning FailedCreate replicaset/web-96d5df5c8 Error creating: podsweb-96d5df5c8-xg6c9is forbidden: exceeded quota: myquota, requested:pods1, used:pods2, limited:pods2修改配额# 将 pod 配额从 2 增加到 10rootmaster30:~# kubectl patch resourcequotas myquota -p {spec:{hard:{pods:10}}}# 重新扩展 ReplicaSetrootmaster30:~# kubectl scale rs web-96d5df5c8 --replicas3# 验证——第 3 个 Pod 成功创建rootmaster30:~# kubectl get pods | wc -l41.4 计算资源配额如果命名空间启用了计算资源配额如requests.cpu、requests.memory用户必须为 Pod 中的容器设定 request 和 limit 值否则配额系统将拒绝 Pod 的创建。为什么必须指定 request 和 limit配额系统需要知道每个 Pod“预定”了多少资源才能准确计算当前已使用的资源量。如果 Pod 没有声明资源请求配额系统无法判断该 Pod 会占用多少资源因此只能拒绝创建。实验未指定计算资源配额示例设置了 CPU 和内存的 request/limit 配额apiVersion:v1kind:ResourceQuotametadata:name:myquotaspec:hard:persistentvolumeclaims:10pods:2secrets:5services:3requests.cpu:1000mrequests.memory:2048Milimits.cpu:1000mlimits.memory:2048MiPod 示例未指定 resourcesapiVersion:v1kind:Podmetadata:name:webspec:containers:-name:webimage:httpdports:-containerPort:80结果Pod 创建被拒绝rootmaster30:~# kubectl apply -f pod-without-quota.yamlError from server(Forbidden): error when creatingpod-without-quota.yaml:podswebis forbidden: failed quota: myquota: must specify limits.cpu for: web;limits.memory for: web;requests.cpu for: web;requests.memory for: web关键理解一旦命名空间配置了计算资源配额所有 Pod 都必须显式指定resources.requests和resources.limits。这是强制性的不是可选的。实验请求超过配额上限配额示例只限制 requestsapiVersion:v1kind:ResourceQuotametadata:name:myquotaspec:hard:requests.cpu:1000mrequests.memory:2048MiPod 示例requests 超过配额apiVersion:v1kind:Podmetadata:name:webspec:containers:-name:webimage:httpdresources:requests:cpu:2000mmemory:4096Mi结果Pod 创建被拒绝rootmaster30:~# kubectl apply -f pod-request-1.yamlError from server(Forbidden): error when creatingpod-request-1.yaml:podswebis forbidden: exceeded quota: myquota, requested:requests.cpu2,requests.memory4Gi, used:requests.cpu0,requests.memory0, limited:requests.cpu1,requests.memory2GiPod 示例requests 在配额范围内apiVersion:v1kind:Podmetadata:name:webspec:containers:-name:webimage:httpdresources:requests:cpu:200mmemory:1024Mirootmaster30:~# kubectl apply -f pod-request-2.yamlrootmaster30:~# kubectl get podNAME READY STATUS RESTARTS AGE web1/1 Running043s# 查看配额使用情况rootmaster30:~# kubectl describe resourcequotas myquotaName: myquota Namespace:quotaResource Used Hard -------- ---- ---- requests.cpu 200m1requests.memory 1Gi 2Gi二、LimitRange2.1 为什么需要 LimitRange在前面的实验中我们了解到如果命名空间设置了计算资源配额所有 Pod 都必须指定 request 和 limit。但是如果用户忘记指定这些值配额系统会直接拒绝 Pod 创建导致用户体验不佳。LimitRange 的作用为命名空间中的 Pod/容器设置默认的 request 和 limit 值从而解决这个问题。核心作用LimitRange 用于限定单个 Pod 或容器的资源请求和限制的默认值、最小值和最大值。LimitRange 支持的资源类型Type资源说明Containercpu、memory限定单个容器的 CPU/内存Podcpu、memory限定 Pod 中所有容器 CPU/内存的总和PersistentVolumeClaimstorage限定 PVC 申请的存储空间大小关键理解LimitRange 的作用对象是单个资源一个容器、一个 Pod、一个 PVC而 ResourceQuota 的作用对象是命名空间级别的资源总和。两者配合使用形成完整的资源管理方案——LimitRange 管“个体”ResourceQuota 管“总量”。2.2 LimitRange 配置LimitRange YAML 示例apiVersion:v1kind:LimitRangemetadata:name:mylimitspec:limits:-type:Containermax:memory:1024Micpu:1min:memory:128Micpu:100mdefault:memory:512Micpu:500mdefaultRequest:memory:256Micpu:200m字段说明default容器未指定 limit 时的默认值上限defaultRequest容器未指定 request 时的默认值max容器可使用的资源最大值min容器可使用的资源最小值重要约束min defaultRequest default max查看 LimitRangerootmaster30:~# kubectl apply -f limits.yamlrootmaster30:~# kubectl get limitrangesNAME CREATED AT mylimit2021-09-09T04:09:15Z rootmaster30:~# kubectl describe limitranges mylimitName: mylimit Namespace:quotaType Resource Min Max Default Request Default Limit Max Limit/Request Ratio ---- -------- --- --- --------------- ------------- ----------------------- Container cpu 100m1200m 500m - Container memory 128Mi 1Gi 256Mi 512Mi -2.3 实验未指定 resources实验目标创建不指定资源的 Pod观察 LimitRange 自动填充默认值。Pod YAMLapiVersion:v1kind:Podmetadata:name:stressspec:containers:-name:stressimage:progrium/stressargs:[-c,1]查看 Pod 资源rootmaster30:~# kubectl apply -f pod-without-limits.yamlrootmaster30:~# kubectl get pod stress -o yaml | grep -A6 resourcesresources:limits:cpu:500mmemory:512Mirequests:cpu:200mmemory:256Mi结论未指定 resources 时LimitRange 自动填充了默认值default 和 defaultRequest。2.4 实验只指定 limit 值结论只指定 limit 值时必须满足min limit maxrequest 会自动设置为与 limit 相同的值而不是 defaultRequest。示例 2-1limit 值大于 max 值spec:containers:-name:webimage:nginxresources:limits:cpu:1.1memory:1100Mirootmaster30:~# kubectl apply -f limit.ymlError from server(Forbidden): error when creatinglimit.yml:podswebis forbidden:[maximum cpu usage per Container is1, but limit is 1100m, maximum memory usage per Container is 1Gi, but limit is 1181116006400m]示例 2-2limit 值小于 min 值spec:containers:-name:webimage:nginxresources:limits:cpu:60mmemory:60Mirootmaster30:~# kubectl apply -f limit.ymlError from server(Forbidden): error when creatinglimit.yml:podswebis forbidden:[minimum cpu usage per Container is 100m, but request is 60m, minimum memory usage per Container is 128Mi, but request is 60Mi]示例 2-3min limit maxspec:containers:-name:webimage:nginxresources:limits:cpu:600mmemory:600Mi结论创建的容器 limits 值必须满足min 指定的 limit max当只指定 limits 值时requests 值与 limits 值保持一致而不是 defaultRequest2.5 实验只指定 request 值结论只指定 request 值时必须满足min request limitlimit 会自动使用 default 值。示例 3-1request 大于 max 值spec:containers:-name:webimage:nginxresources:requests:cpu:1600mmemory:600Mirootmaster30:~# kubectl apply -f limit.ymlThe Podwebis invalid: * spec.containers[0].resources.requests: Invalid value:1600m:must belessthan or equal to cpu limit示例 3-2request 小于 min 值spec:containers:-name:webimage:nginxresources:requests:cpu:60mmemory:60Mirootmaster30:~# kubectl apply -f limit.ymlError from server(Forbidden): error when creatinglimit.yml:podswebis forbidden:[minimum cpu usage per Container is 100m, but request is 60m, minimum memory usage per Container is 128Mi, but request is 60Mi]示例 3-3min request limitspec:containers:-name:webimage:nginxresources:requests:cpu:400mmemory:400Mi结论创建的容器 requests 值必须满足min requests limits当只指定 requests 值时limits 值与 default 值保持一致2.6 LimitRange for PVC补充LimitRange 还可以限制 PVC 的存储大小适用于需要控制存储用量的场景。apiVersion:v1kind:LimitRangemetadata:name:storagelimitsspec:limits:-type:PersistentVolumeClaimmax:storage:2Gimin:storage:1Gi作用限制该命名空间中 PVC 申请的存储大小必须在 1Gi 到 2Gi 之间。三、总结与知识点一览表3.1 回到“资源管理的第三个层次”在开篇的引子中我们提出了资源管理的三个层次。至此三个层次已经全部讲完层次问题K8s 组件状态监控层资源用了多少Metrics Server✅ 第十期已讲扩缩层资源不够怎么办HPA✅ 第十期已讲约束层如何防止超用ResourceQuota / LimitRange✅ 本期已讲一句话回顾本期我们通过 ResourceQuota 实现了“管住总量”通过 LimitRange 实现了“定好规矩”——这就是集群资源管理的“安全网”和“标准尺”。3.2 ResourceQuota vs LimitRange 对比对比项ResourceQuotaLimitRange作用范围命名空间级别资源总量单个资源级别容器/Pod/PVC控制内容资源用量的上限资源请求的默认值、最小值和最大值主要目的防止命名空间超用防止单个容器超用或未指定资源是否强制✅ 强制超限则拒绝✅ 强制不符合 min/max 则拒绝两者关系管“总量”管“个体”3.3 核心配置字段速查字段含义适用对象max资源最大值LimitRangemin资源最小值LimitRangedefault默认 limit 值LimitRangedefaultRequest默认 request 值LimitRangehard配额硬限制ResourceQuotarequests.cpu/memory资源请求配额ResourceQuotalimits.cpu/memory资源限制配额ResourceQuota3.4 常用命令速查操作命令创建 ResourceQuotakubectl create quota name --hardkeyvalue查看 ResourceQuotakubectl get resourcequotas/kubectl describe quota name修改 ResourceQuotakubectl patch resourcequotas name -p {spec:{hard:{pods:10}}}删除 ResourceQuotakubectl delete resourcequota name创建 LimitRangekubectl apply -f limits.yaml查看 LimitRangekubectl get limitranges/kubectl describe limitrange name删除 LimitRangekubectl delete limitrange name3.5 配额与限制协同工作示意图text┌─────────────────────────────────────────────────────────────┐ │ 命名空间 │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ ResourceQuota总量天花板 │ │ │ │ ┌────────────────────────────────────────────────┐ │ │ │ │ │ Pod 1LimitRange 管个体 │ │ │ │ │ │ request: 200m CPU / 256Mi 内存 │ │ │ │ │ │ limit: 500m CPU / 512Mi 内存 │ │ │ │ │ └────────────────────────────────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────┐ │ │ │ │ │ Pod 2LimitRange 管个体 │ │ │ │ │ │ request: 200m CPU / 256Mi 内存 │ │ │ │ │ │ limit: 500m CPU / 512Mi 内存 │ │ │ │ │ └────────────────────────────────────────────────┘ │ │ │ │ ┌────────────────────────────────────────────────┐ │ │ │ │ │ Pod 3LimitRange 管个体 │ │ │ │ │ │ request: 200m CPU / 256Mi 内存 │ │ │ │ │ │ limit: 500m CPU / 512Mi 内存 │ │ │ │ │ └────────────────────────────────────────────────┘ │ │ │ │ 总 Request: 600m CPU / 768Mi 内存 │ │ │ │ 总 Limit: 1500m CPU / 1536Mi 内存 │ │ │ └──────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘3.6 常见错误排查错误现象可能原因解决方法Pod 创建失败提示exceeded quota命名空间配额已用尽检查配额使用情况删除不必要资源或提高配额Pod 创建失败提示must specify limits.cpu命名空间有配额但 Pod 未指定 resources为 Pod 添加 resources 配置或配置 LimitRange 默认值Pod 创建失败提示minimum cpu usage is xxx资源值小于 LimitRange 的 min 值调整资源值到 min 以上Pod 创建失败提示maximum cpu usage is xxx资源值大于 LimitRange 的 max 值调整资源值到 max 以下kubectl describe quota显示 Used 接近 Hard配额即将耗尽提前规划扩容或清理资源3.7 生产环境最佳实践实践说明先配 LimitRange再配 ResourceQuotaLimitRange 确保所有 Pod 都有 request/limitResourceQuota 才能有效工作为每个命名空间设置合理的配额根据团队规模和应用需求设置合理的 CPU/内存配额定期审查配额使用情况使用kubectl describe quota定期检查配额使用率预留系统资源不要将集群所有资源都分配给配额为系统组件预留一部分配额不是越多越好合理的配额有助于提高资源利用率避免浪费下一期预告KubernetesK8s学习笔记第十二期集群健康与安全——探针 认证授权。涵盖Health Checkliveness/readiness/startup 探针、认证管理X509 证书、授权管理RBAC、服务账户ServiceAccount。— Compiled and Authored by Whisky — July 2 nd, 2026