3. 资源配额模型定义:分配策略与模型设计
云原生网关的资源配额模型是保障多租户隔离、服务质量(QoS)和成本可观测性的核心。资源配额不仅定义了单个网关实例或租户可使用的上限,还决定了在资源争抢时的调度行为。本节从配额维度、分配策略和模型数据结构三个层面展开。
3.1 核心配额维度与语义
网关资源配额通常围绕四个关键指标建模,每个指标对应不同的限流与调度语义:
| 配额维度 | 单位 | 语义说明 | 典型上限(参考) |
|---|---|---|---|
| CPU | mCores(毫核) | 网关 worker 进程可使用的 CPU 时间片上限,影响 TLS 握手、路由匹配、请求反序列化等计算密集型操作。 | 2000m ~ 8000m |
| 内存 | MiB / GiB | 网关进程堆外内存、连接池、缓存(如路由表、JWT 公钥)的总占用上限。 | 512Mi ~ 4Gi |
| 连接数 | 个 | 网关同时维持的 TCP 连接数(包括客户端侧与上游侧),直接影响文件描述符消耗与内存开销。 | 1000 ~ 50000 |
| QPS | 请求/秒 | 网关每秒可处理的请求速率,通常基于令牌桶或漏桶算法实现软限或硬限。 | 1000 ~ 100000 |
设计要点:CPU 与内存配额通常绑定到 Pod/容器资源限制(如 Kubernetes ResourceQuota),而连接数与 QPS 配额则属于应用层配额,需在网关配置中心(如控制面 xDS)中独立建模。
3.2 分配策略:静态预留 + 动态弹性
资源配额分配策略采用两层模型:
- 静态基线(Static Base):为每个租户或网关组分配固定的最小保障资源,确保基础流量不因争抢而饥饿。
- 动态弹性(Dynamic Burst):在全局资源池有余量时,允许租户临时突破静态配额,但受限于全局共享池上限。
分配公式如下:
有效配额 = 静态基线 + min(动态弹性请求, 全局共享池剩余量 × 权重因子)
其中权重因子由租户的优先级(critical / high / medium / low)决定,优先级越高,在共享池争抢时获得的比例越大。
漂移告警触发条件:当实际使用量持续超过静态基线 + 动态弹性上限的 90% 且持续时间超过 5 分钟,系统判定为“资源配额模型漂移”,触发告警并进入复测流程。
3.3 模型数据结构设计
资源配额模型在控制面中以 YAML/JSON 结构存储,并通过 xDS 协议下发给数据面。以下是一个简化但完整的模型定义:
{
"resourceQuota": {
"tenantId": "tenant-abc-123",
"gatewayGroup": "prod-gw-east",
"staticBase": {
"cpu": "2000m",
"memory": "1024Mi",
"connections": 5000,
"qps": 10000
},
"dynamicBurst": {
"cpu": "1000m",
"memory": "512Mi",
"connections": 2000,
"qps": 5000
},
"priority": "high",
"quotaScope": "namespace",
"validSince": "2025-01-01T00:00:00Z",
"validUntil": "2025-12-31T23:59:59Z"
}
}
模型字段说明:
- staticBase:硬保障资源,即使全局资源紧张也不允许被抢占。
- dynamicBurst:弹性资源上限,实际可突发量受全局共享池约束。
- priority:参与共享池分配时的权重等级。
- quotaScope:配额作用域(namespace / cluster / global),决定隔离粒度。
- validSince / validUntil:配额有效期,用于自动过期与回收。
3.4 配额模型架构关系
下图展示了资源配额模型在网关控制面与数据面之间的流转关系:
3.5 配额漂移的典型场景
资源配额模型漂移通常由以下原因引起:
- 流量突增:业务促销或攻击流量导致 QPS 和连接数远超静态基线 + 弹性上限。
- 配置变更未同步:控制面更新了配额模型,但数据面因 xDS 推送延迟或失败仍使用旧配置。
- 资源泄漏:网关连接池或内存缓存未及时释放,导致实际用量持续高于配额。
- 多租户干扰:高优先级租户抢占共享池资源,导致低优先级租户的有效配额被压缩。
注意:当检测到配额漂移时,不应立即调整模型,而应先通过复测流程确认漂移是临时峰值还是长期趋势。临时峰值可通过动态弹性吸收,长期趋势才需要修改静态基线。
3.6 模型设计的可观测性要求
为支持漂移告警与复测,配额模型必须暴露以下指标:
| 指标名称 | 类型 | 用途 |
|---|---|---|
quota_cpu_usage_ratio |
Gauge | CPU 使用量 / CPU 配额,用于判断 CPU 是否接近上限。 |
quota_memory_usage_ratio |
Gauge | 内存使用量 / 内存配额,用于判断内存是否接近上限。 |
quota_connections_usage |
Gauge | 当前活跃连接数,用于判断连接数是否接近配额。 |
quota_qps_current |
Gauge | 当前 QPS 速率,用于判断是否接近 QPS 配额。 |
quota_burst_remaining |
Gauge | 动态弹性剩余量,用于判断弹性池是否耗尽。 |