2. Kubernetes 资源配额基础:Resource Quota 定义、LimitRange 作用、命名空间级别资源管控

在 Argo CD 滚动升级场景中,资源配额(Resource Quota)与限制范围(LimitRange)是保障集群稳定性、防止资源争抢的核心机制。本章将系统讲解 Kubernetes 原生资源管控体系,为后续“滚动升级资源校准”奠定理论基础。

2.1 Resource Quota:命名空间资源硬边界

Resource Quota 是 Kubernetes 内置的准入控制机制,作用于命名空间级别,用于限制该命名空间内所有 Pod、Service、PVC 等对象可消耗的资源总量。一旦配额耗尽,后续创建请求将被拒绝(返回 403 Forbidden)。

资源类型 配额字段 说明
CPU requests.cpu / limits.cpu 所有 Pod 的 CPU 请求/上限总和
内存 requests.memory / limits.memory 所有 Pod 的内存请求/上限总和
存储 requests.storage 所有 PVC 的存储请求总和
对象数量 count/pods / count/services / count/configmaps 命名空间内各类对象的最大数量
关键原则:Resource Quota 只限制总量,不限制单个 Pod 的规格。若未设置 LimitRange,单个 Pod 可能占用全部配额,导致其他 Pod 无法调度。

2.1.1 典型 Resource Quota 定义示例

apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-team-quota
  namespace: dev
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    count/pods: "20"
    count/services: "10"
    count/configmaps: "30"

上述配额限制 dev 命名空间内所有 Pod 的 CPU 请求总和不超过 4 核,内存请求不超过 8Gi,Pod 总数不超过 20 个。超出任一硬限制,Kubernetes API Server 将拒绝创建新资源。

2.2 LimitRange:Pod 与容器的资源约束

LimitRange 与 Resource Quota 配合使用,为命名空间内的 Pod 或容器设置默认请求/限制以及最小/最大约束。它解决了两个关键问题:

  • 默认值注入:若 Pod 未显式设置资源请求/限制,LimitRange 自动注入默认值。
  • 边界控制:防止单个 Pod 请求过大或过小,避免资源碎片或配额滥用。
LimitRange 类型 作用范围 常用字段
Container 单个容器 min / max / default / defaultRequest
Pod Pod 内所有容器总和 min / max
PersistentVolumeClaim PVC 存储请求 min / max

2.2.1 LimitRange 配置示例

apiVersion: v1
kind: LimitRange
metadata:
  name: dev-limits
  namespace: dev
spec:
  limits:
  - type: Container
    min:
      cpu: "50m"
      memory: "64Mi"
    max:
      cpu: "2"
      memory: "4Gi"
    default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "200m"
      memory: "256Mi"
  - type: PersistentVolumeClaim
    min:
      storage: "1Gi"
    max:
      storage: "100Gi"
最佳实践:在 Argo CD 管理的命名空间中,始终同时部署 Resource Quota 和 LimitRange。LimitRange 确保每个 Pod 有合理的资源声明,Resource Quota 控制总量上限,两者形成“上下夹击”的管控闭环。

2.3 命名空间级别资源管控架构

下图展示了 Resource Quota 与 LimitRange 在命名空间内的协同工作流程:

命名空间资源管控架构 命名空间:dev Resource Quota 总量硬限制:CPU 4核 / 内存 8Gi LimitRange 容器边界:50m~2核 / 64Mi~4Gi Pod A request: 200m / 256Mi limit: 500m / 512Mi Pod B request: 300m / 512Mi limit: 1核 / 1Gi Pod C request: 100m / 128Mi limit: 200m / 256Mi 配额使用统计(实时) CPU 请求:600m / 4核(15%) | 内存请求:896Mi / 8Gi(10.9%) Pod 数量:3 / 20(15%) | 剩余可创建:17 个 Pod

2.4 资源配额与滚动升级的关联

在 Argo CD 滚动升级过程中,Resource Quota 和 LimitRange 直接影响升级的成功率与速度:

  • 蓝绿部署:新版本 Pod 创建时,若配额不足,升级将卡在 Pending 状态,导致流量切换失败。
  • 金丝雀发布:金丝雀 Pod 需要额外资源配额,若未预留,金丝雀可能无法启动。
  • 回滚场景:回滚时旧版本 Pod 重新创建,同样受配额限制,配额不足将导致回滚失败。
常见陷阱:许多团队只设置 Resource Quota 而忽略 LimitRange,导致部分 Pod 未设置资源限制,在滚动升级时意外占用全部配额,引发级联故障。务必同时部署两者。

2.5 资源配额校验命令速查

操作 命令
查看命名空间配额 kubectl get resourcequota -n <namespace>
查看配额使用详情 kubectl describe resourcequota <name> -n <namespace>
查看 LimitRange kubectl get limitrange -n <namespace>
模拟创建 Pod 检查配额 kubectl apply --dry-run=server -f pod.yaml

2.6 本章小结

  • Resource Quota 定义命名空间资源总量硬边界,防止资源滥用。
  • LimitRange 约束单个 Pod/容器的资源范围,并注入默认值。
  • 两者配合形成上下双层管控,是滚动升级资源校准的前提条件。
  • 在 Argo CD 部署前,必须确认目标命名空间的配额是否满足新版本 Pod 的资源需求。