3. 资源配额(ResourceQuota)与LimitRange基础概念回顾
在集群升级过程中,资源配额与LimitRange是保障集群稳定性的第一道防线。理解它们的核心机制、作用范围以及常见误用场景,是后续进行瓶颈分析与调优的前提。
3.1 ResourceQuota:命名空间级别的资源硬边界
ResourceQuota 是 Kubernetes 内置的准入控制机制,用于限制命名空间(Namespace)级别的资源消耗总量。它定义了该命名空间下所有 Pod、PVC、Service 等对象可使用的资源上限。
核心作用:防止单个命名空间内的应用“抢占”集群资源,保障多租户场景下的资源公平性。
3.1.1 可限制的资源类型
| 资源类别 | 示例 | 说明 |
|---|---|---|
| 计算资源 | requests.cpu, limits.memory |
限制所有 Pod 的 CPU/Memory 请求与上限总和 |
| 存储资源 | requests.storage, persistentvolumeclaims |
限制 PVC 总容量与数量 |
| 对象数量 | pods, services, configmaps |
限制命名空间内各类 Kubernetes 对象的最大数量 |
| 扩展资源 | requests.nvidia.com/gpu |
限制 GPU 等特殊硬件资源 |
3.1.2 典型配置示例
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: production
spec:
hard:
requests.cpu: "20"
requests.memory: "40Gi"
limits.cpu: "40"
limits.memory: "80Gi"
pods: "50"
persistentvolumeclaims: "10"
requests.storage: "500Gi"
升级陷阱:在集群升级期间,如果 ResourceQuota 设置过紧(例如
pods: "50" 但实际需要 55 个 Pod 完成滚动更新),会导致新 Pod 无法调度,升级流程卡死。这是最常见的瓶颈之一。
3.2 LimitRange:Pod/容器级别的资源默认值与约束
LimitRange 在命名空间级别生效,为未显式设置资源请求/限制的 Pod 或容器提供默认值,并强制约束单个 Pod/容器的资源上下界。
核心作用:防止单个容器“饥饿”或“滥用”资源,同时减少用户手动配置的工作量。
3.2.1 LimitRange 的两种约束模式
- 默认值注入(Default):当 Pod 未设置
resources.requests或resources.limits时,LimitRange 自动注入默认值。 - 边界约束(Min/Max):强制 Pod 的请求/限制必须在
min和max之间,否则拒绝创建。
3.2.2 典型配置示例
apiVersion: v1
kind: LimitRange
metadata:
name: container-limits
namespace: production
spec:
limits:
- max:
cpu: "4"
memory: "8Gi"
min:
cpu: "100m"
memory: "128Mi"
default:
cpu: "500m"
memory: "512Mi"
defaultRequest:
cpu: "200m"
memory: "256Mi"
type: Container
调优要点:升级前检查 LimitRange 的
max 值是否低于新版本控制面组件的资源需求(例如 kube-apiserver 在 v1.28+ 可能要求更多内存)。若 max.memory 设为 4Gi,但新版本 apiserver 需要 6Gi,则升级后 Pod 无法启动。
3.3 ResourceQuota 与 LimitRange 的协同关系
两者共同构成命名空间资源治理的“双保险”:
- LimitRange 控制单个容器的资源上下界与默认值。
- ResourceQuota 控制命名空间内所有容器的资源总量上限。
若未配置 LimitRange,ResourceQuota 可能因 Pod 未设置资源请求而无法准确统计;若未配置 ResourceQuota,LimitRange 无法防止命名空间整体资源超卖。
3.4 升级场景中的关键差异对比
| 对比维度 | ResourceQuota | LimitRange |
|---|---|---|
| 作用范围 | 命名空间级别 | 命名空间级别 |
| 作用对象 | 所有 Pod、PVC、Service 等 | 单个 Container / Pod |
| 约束类型 | 总量硬限制(Hard Limit) | 默认值 + 边界约束(Min/Max) |
| 升级影响 | 配额不足导致新 Pod 无法调度 | 默认值/边界与新版组件需求冲突 |
| 调优方向 | 升级前扩容配额,预留缓冲 | 升级前检查 max 值,适配新版本 |
3.5 常见误用与避坑指南
- 误区一:只配 ResourceQuota 不配 LimitRange
后果:未设置资源请求的 Pod 会被 ResourceQuota 拒绝,或导致统计失真。 - 误区二:LimitRange 的 max 值设置过小
后果:升级后控制面组件(如 kube-controller-manager)因资源需求增加而无法启动。 - 误区三:ResourceQuota 的 pods 上限未考虑滚动更新
后果:升级期间新旧 Pod 共存,总数超过 quota,更新流程中断。 - 误区四:升级前未使用
kubectl describe quota检查余量
后果:升级过程中才发现资源不足,回滚成本高。
最佳实践:在集群升级前至少 2 周,使用
kubectl get resourcequota -A -o yaml 导出所有命名空间的配额配置,结合 kubectl top pod -A 的实际使用量,计算升级所需的配额余量。建议将 ResourceQuota 的 pods 上限临时提升 20%~30%,为滚动更新预留缓冲。