3、资源配额模型(Resource Quota Model)概念

资源配额模型是 Kubernetes 多租户与资源治理的核心机制,它通过声明式策略限制命名空间或集群范围内的资源消耗总量。本章从 CPU/内存/存储/对象数四个维度拆解配额定义,并对比命名空间级与集群级两种作用域的设计差异。

3.1 配额维度与定义

资源配额覆盖三类资源:计算资源(CPU、内存)、存储资源(PVC 容量、临时存储)、对象计数(Pod、Service、ConfigMap 等)。每个维度均可设置 requests(预留)和 limits(上限)两个阈值。

资源类别 配额字段(示例) 说明
CPU requests.cpu / limits.cpu 单位:核心数(如 4、500m)
内存 requests.memory / limits.memory 单位:字节(如 8Gi、512Mi)
临时存储 requests.ephemeral-storage / limits.ephemeral-storage 单位:字节(如 10Gi)
持久卷声明 persistentvolumeclaims PVC 数量上限
存储总量 requests.storage 所有 PVC 请求容量总和上限
对象计数 count/pods / count/services / count/configmaps 各类 API 对象数量上限
关键原则:配额是 累加性约束——命名空间内所有 Pod 的 requests.cpu 总和不得超过配额值;limits 同理。对象计数配额防止单个命名空间创建过多小对象导致 etcd 压力。

3.2 命名空间级配额(ResourceQuota)

命名空间级配额通过 ResourceQuota 资源对象定义,作用于单个命名空间。以下是一个典型配置示例:

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"
    requests.storage: "50Gi"
    persistentvolumeclaims: "10"
    count/pods: "20"
    count/services: "10"
    count/configmaps: "30"
    count/secrets: "30"

当命名空间内资源总和达到硬限制时,Kubernetes 会拒绝后续创建请求,并返回 403 Forbidden 错误。配额生效范围包括:

  • Pod 级别:每个 Pod 必须设置 requests 和 limits(若未设置,默认值由 LimitRange 补充)。
  • PVC 级别:存储总量和 PVC 数量双重约束。
  • 对象级别:按 API 资源类型分别计数。

3.3 集群级配额(ClusterResourceQuota)

集群级配额由 OpenShift 扩展(标准 Kubernetes 社区版需通过 ResourceQuota 配合 ClusterResourceQuota 或第三方策略引擎实现)。它允许管理员跨多个命名空间设置统一配额上限,适用于租户隔离场景。

特性 命名空间级(ResourceQuota) 集群级(ClusterResourceQuota)
作用域 单个命名空间 一组命名空间(通过标签选择器)
管理粒度 细粒度,每个团队独立 粗粒度,统一管控
适用场景 开发/测试环境隔离 多租户生产集群、SaaS 平台
冲突处理 命名空间级优先 集群级与命名空间级取最小值
实践建议:集群级配额通常用于“租户总预算”,命名空间级配额用于“团队子预算”。两者叠加时,实际生效值为两者中的 最小值,避免超卖。

3.4 配额模型架构图

下图展示从集群管理员到命名空间工作负载的配额分层模型:

资源配额分层模型 集群级配额(ClusterResourceQuota) 命名空间 A 配额 命名空间 B 配额 命名空间 C 配额 Pod / Deployment / StatefulSet CPU: 2 核 / 内存: 4Gi PVC: 3 个 / 存储: 20Gi Pod / Service CPU: 1 核 / 内存: 2Gi ConfigMap: 5 个 Pod / CronJob / PVC CPU: 3 核 / 内存: 6Gi 存储: 30Gi / 对象: 50 配额叠加规则: • 集群级配额定义租户总预算(如所有命名空间 CPU 总和 ≤ 16 核) • 命名空间级配额定义团队子预算(如命名空间 A CPU ≤ 4 核) • 实际生效值 = min(集群级配额, 命名空间级配额) —— 取更严格者

3.5 配额生效与冲突处理

当多个配额同时作用于同一资源时,Kubernetes 遵循以下优先级:

  1. 命名空间级配额直接约束该命名空间内所有资源。
  2. 集群级配额通过标签选择器关联命名空间,约束关联命名空间的总和。
  3. 冲突时:取两者中的 最小值 作为实际生效阈值,确保不突破任何一级限制。
常见陷阱:若只设置集群级配额而未设置命名空间级配额,单个命名空间可能耗尽所有配额,导致其他命名空间无法创建资源。建议始终同时配置两级配额,形成“总预算 + 子预算”的双层防护。

3.6 配额模型与策略即代码的衔接

资源配额模型是策略即代码(Policy as Code)在资源治理层面的具体实现。通过将配额定义写入 Git 仓库,配合 CI/CD 流水线自动应用到集群,可实现:

  • 版本化:配额变更可追溯、可回滚。
  • 自动化:新命名空间创建时自动绑定配额模板。
  • 审计:配额超限告警与合规检查。