3. 资源配额基础概念:CPU/内存/连接数/请求速率等配额类型、配额超限的影响
在 GitOps 驱动的 Envoy 网关交付中,资源配额(Resource Quota)是保障集群稳定性与服务质量的第一道防线。配额不仅约束网关实例的物理资源消耗,还控制其逻辑处理能力。理解各类配额的定义、计量方式及超限后果,是后续进行配额校准的前提。
3.1 核心配额类型与计量维度
Envoy 网关涉及的资源配额可分为两大类:基础设施级配额(CPU、内存)和应用级配额(连接数、请求速率、并发流)。下表列出了主要配额类型及其典型计量单位:
| 配额类型 | 所属层级 | 典型计量单位 | Envoy 相关配置字段 |
|---|---|---|---|
| CPU | 基础设施 | m(毫核,1000m = 1 核) | resources.requests.cpu / limits.cpu |
| 内存 | 基础设施 | Mi / Gi | resources.requests.memory / limits.memory |
| 最大连接数 | 应用级 | 个(并发 TCP 连接) | listener.connection_limit |
| 请求速率 | 应用级 | rps(每秒请求数) | rate_limits / local_rate_limit |
| 并发请求/流 | 应用级 | 个(HTTP/2 流或 HTTP/1.1 请求) | cluster.max_requests |
| 重试次数 | 应用级 | 次/请求 | retry_policy.num_retries |
| 连接池大小 | 应用级 | 个(上游连接数) | cluster.circuit_breakers |
实践提示:在 Kubernetes 环境中,CPU 和内存配额通过
ResourceQuota 对象在命名空间级别强制限制;而连接数、请求速率等应用级配额通常在 Envoy 的 EnvoyFilter 或 RateLimitConfig CRD 中定义,并通过 GitOps 同步到集群。
3.2 配额超限的影响与连锁反应
当任一配额被突破时,系统会触发不同的保护机制,但后果往往是多层次的。下图展示了配额超限后的典型影响链路:
3.3 各类配额超限的具体表现
3.3.1 CPU 配额超限
- 现象:容器 CPU 使用率持续接近或超过
limits.cpu,触发 CPU Throttling(节流)。 - Envoy 影响:请求处理延迟增加,TLS 握手变慢,连接建立速率下降。
- 典型阈值:当 CPU 使用率超过 80% 持续 5 分钟,建议扩容或调整配额。
3.3.2 内存配额超限
- 现象:容器内存占用达到
limits.memory,触发 OOMKill。 - Envoy 影响:进程被强制终止,所有活跃连接断开,网关完全不可用。
- 典型场景:大量 HTTP/2 流缓存、大请求体缓冲、连接池膨胀导致内存泄漏。
3.3.3 连接数配额超限
- 现象:监听器或集群的连接数达到
connection_limit,新连接被拒绝。 - Envoy 影响:客户端收到
503 Service Unavailable或连接重置。 - 典型场景:突发流量高峰、DDoS 攻击、后端服务响应缓慢导致连接堆积。
3.3.4 请求速率配额超限
- 现象:每秒请求数超过配置的速率限制,触发限流。
- Envoy 影响:返回
429 Too Many Requests,并携带Retry-After头部。 - 典型场景:API 滥用、爬虫攻击、未配置合理的速率限制。
关键风险:配额超限往往不是孤立事件。例如,内存超限导致 Pod 重启,重启期间连接数配额瞬间被占满,进而触发请求速率限流,形成“配额连锁崩溃”。在 GitOps 流程中,必须为每个配额设置告警阈值(通常为 70%-80%),并在配额校准前收集至少 7 天的历史监控数据。
3.4 配额配置的 GitOps 管理要点
在 GitOps 工作流中,资源配额应作为声明式配置的一部分存储在 Git 仓库中。以下是一个典型的 Envoy 网关配额配置片段:
apiVersion: v1
kind: ResourceQuota
metadata:
name: envoy-gateway-quota
namespace: gateway-system
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
limits.cpu: "8"
limits.memory: "16Gi"
---
apiVersion: networking.istio.io/v1beta1
kind: EnvoyFilter
metadata:
name: rate-limit-filter
namespace: gateway-system
spec:
configPatches:
- applyTo: HTTP_FILTER
match:
context: GATEWAY
patch:
operation: INSERT_BEFORE
value:
name: envoy.filters.http.local_ratelimit
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.local_ratelimit.v3.LocalRateLimit
stat_prefix: http_local_rate_limiter
_bucket:
max_tokens: 10000
tokens_per_fill: 1000
fill_interval: 1s
filter_enabled:
default_value:
numerator: 100
denominator: HUNDRED
runtime_key: local_rate_limit_enabled
filter_enforced:
default_value:
numerator: 100
denominator: HUNDRED
runtime_key: local_rate_limit_enforced
response_headers_to_add:
- header:
key: "x-rate-limit-limit"
value: "10000"
- header:
key: "x-rate-limit-remaining"
value: "%RULE_REMAINING%"
校准要点:上述配置中,
max_tokens: 10000 表示允许的突发请求数,tokens_per_fill: 1000 表示每秒补充的令牌数。在 GitOps 实践中,这些数值应通过 Kustomize 或 Helm 的参数化模板管理,避免硬编码。
3.5 配额超限的监控与告警指标
为及时发现配额超限风险,建议在 Prometheus 中采集以下关键指标:
| 指标名称 | PromQL 示例 | 告警阈值 |
|---|---|---|
| CPU 使用率 | rate(container_cpu_usage_seconds_total{container="envoy"}[1m]) |
> 0.8 * limits.cpu |
| 内存使用率 | container_memory_working_set_bytes{container="envoy"} |
> 0.85 * limits.memory |
| 活跃连接数 | envoy_listener_downstream_cx_active |
> 0.9 * connection_limit |
| 请求速率 | rate(envoy_http_downstream_rq_total[1m]) |
> 0.8 * rate_limit |
| 429 响应数 | rate(envoy_http_downstream_rq_xx{response_code_class="4"}[1m]) |
> 0(出现即告警) |
通过 GitOps 将上述告警规则以 PrometheusRule CRD 形式存储在 Git 仓库中,可实现告警配置的版本化与自动化部署。