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 配额超限的影响与连锁反应

当任一配额被突破时,系统会触发不同的保护机制,但后果往往是多层次的。下图展示了配额超限后的典型影响链路:

配额超限影响链路 配额超限触发 配额类型判断 CPU/内存超限 连接/速率超限 Pod OOMKill / CPU Throttling 网关重启 / 连接中断 429 Too Many Requests 连接池耗尽 / 请求排队超时 SLA 降级 / 业务中断

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 仓库中,可实现告警配置的版本化与自动化部署。