2. 资源配额模型概念
2.1 什么是资源配额
资源配额(Resource Quota)是一种对共享资源进行上限约束的机制。在云原生环境中,资源配额定义了某个租户、命名空间或工作负载所能消耗的最大资源量,防止单一实体无限制地占用集群资源,从而保障整体系统的稳定性与公平性。
资源配额的核心要素包括:
- 资源类型:CPU、内存、存储、网络带宽、GPU 等硬件资源,以及 Pod 数量、Service 数量、ConfigMap 数量等软件对象。
- 作用范围:通常绑定到命名空间(Namespace)或用户组,实现多租户隔离。
- 硬限制(Hard Limit):一旦达到配额上限,新的资源请求将被拒绝。
- 软限制(Soft Limit):允许短时超限,但触发告警或驱逐策略。
提示:在 Kubernetes 中,ResourceQuota 对象通过 YAML 声明式定义,Rego 策略可以在此基础上实现更细粒度的动态配额校验,例如根据标签或环境自动调整配额值。
2.2 配额在云原生环境中的作用
在云原生架构中,资源配额是多租户隔离和容量规划的基础设施。其核心作用体现在以下五个方面:
| 作用维度 | 具体说明 | 典型场景 |
|---|---|---|
| 公平调度 | 防止某个应用或团队抢占全部集群资源,保障各租户获得公平的资源份额。 | 多个业务线共享同一 Kubernetes 集群 |
| 成本控制 | 通过配额限制资源使用上限,避免因资源滥用导致云费用超支。 | 开发/测试环境资源预算管控 |
| 稳定性保障 | 限制单个命名空间的资源消耗,防止“吵闹邻居”影响其他工作负载。 | 生产环境关键业务与批处理任务混部 |
| 容量规划 | 配额数据为集群扩容和资源预留提供可量化的依据。 | 根据配额使用率触发自动扩缩容 |
| 合规审计 | 配额策略可纳入策略即代码(Policy as Code)体系,实现自动化合规检查。 | Rego 策略校验配额是否满足安全基线 |
关键洞察:在云原生环境中,配额不仅仅是“限制”,更是治理工具。通过 Rego 策略,可以将配额与组织级规则(如环境标签、团队归属、成本中心)动态绑定,实现配额的自适应调整。
2.3 配额与限流的区别
资源配额(Quota)和限流(Rate Limiting)是两种不同的流量控制机制,经常被混淆。下表从多个维度进行对比:
| 对比维度 | 资源配额(Quota) | 限流(Rate Limiting) |
|---|---|---|
| 控制粒度 | 资源总量(CPU、内存、存储、对象数量) | 请求速率(QPS、TPS、并发连接数) |
| 时间维度 | 长期、静态或半静态(通常以小时/天为单位) | 短期、动态(通常以秒/分钟为单位) |
| 触发条件 | 累计资源使用达到上限 | 单位时间内的请求次数超过阈值 |
| 典型实现 | Kubernetes ResourceQuota、OpenStack 配额 | 令牌桶、漏桶、滑动窗口(如 Nginx、Envoy) |
| 失败行为 | 拒绝创建新资源(如 Pod 无法调度) | 返回 429 Too Many Requests 或排队等待 |
| 恢复方式 | 释放已有资源(删除 Pod、清理存储) | 等待时间窗口重置或令牌补充 |
| 适用场景 | 容量规划、多租户隔离、成本控制 | API 网关保护、防 DDoS、服务降级 |
常见误区:不要将配额与限流混为一谈。配额解决的是“资源总量”问题,限流解决的是“请求速率”问题。在云原生架构中,两者通常配合使用:配额防止资源耗尽,限流防止流量洪峰击垮服务。
2.4 配额模型在 Rego 策略中的映射
在基于 Rego 的策略即代码体系中,资源配额模型被抽象为可编程的策略规则。以下是一个简化的 Rego 配额校验示例:
package kubernetes.quotas
# 定义配额上限
default max_cpu_per_namespace = 8
default max_memory_per_namespace = 16384 # MB
# 校验命名空间 CPU 配额
deny[msg] {
ns := input.request.namespace
current_cpu := data.usage[ns].cpu
requested_cpu := input.request.resources.cpu
total_cpu := current_cpu + requested_cpu
total_cpu > max_cpu_per_namespace
msg := sprintf("命名空间 %v CPU 配额超限:当前 %v + 请求 %v > 上限 %v", [ns, current_cpu, requested_cpu, max_cpu_per_namespace])
}
# 校验命名空间内存配额
deny[msg] {
ns := input.request.namespace
current_mem := data.usage[ns].memory
requested_mem := input.request.resources.memory
total_mem := current_mem + requested_mem
total_mem > max_memory_per_namespace
msg := sprintf("命名空间 %v 内存配额超限:当前 %v + 请求 %v > 上限 %v", [ns, current_mem, requested_mem, max_memory_per_namespace])
}
实践要点:在 Rego 中实现配额模型时,建议将配额上限定义为可配置的 data 对象,而非硬编码在规则中。这样可以通过外部配置中心动态调整配额,无需修改策略代码。