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 无法防止命名空间整体资源超卖。

ResourceQuota 与 LimitRange 协同关系 LimitRange 作用于:单个 Container / Pod 功能:默认值注入 + 边界约束 防止:单容器资源滥用 ResourceQuota 作用于:整个 Namespace 功能:总量硬限制 防止:命名空间资源超卖 提供默认值 辅助统计 总量约束 兜底限制 升级场景下的协同失效模式 1. LimitRange 的 max 值低于新版本组件需求 → Pod 创建失败 2. ResourceQuota 的 pods 上限不足 → 滚动更新卡死 3. 两者未同时配置 → 资源统计不准确,升级后资源争抢 4. 升级前未校验配额余量 → 新版本控制面组件无法调度

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%,为滚动更新预留缓冲。