3. 资源配额模型基础:Kubernetes ResourceQuota 与 LimitRange 机制

在云原生网关故障时间线中,资源配额模型是导致 Ingress 控制器异常退出的关键诱因之一。Kubernetes 通过 ResourceQuota 和 LimitRange 两个原生资源对象,构建了多租户场景下的资源管控边界。理解这两个机制的交互逻辑,是还原本次故障事件的前提。

3.1 ResourceQuota:命名空间级资源硬边界

ResourceQuota 为命名空间设置聚合资源上限,一旦总量超限,后续创建 Pod 的请求将被 API Server 拒绝。其核心管控维度包括:

资源维度 示例配置 作用范围
CPU 请求(requests.cpu) requests.cpu: "4" 命名空间内所有 Pod 的 CPU 请求总和
内存请求(requests.memory) requests.memory: "8Gi" 命名空间内所有 Pod 的内存请求总和
CPU 限制(limits.cpu) limits.cpu: "8" 命名空间内所有 Pod 的 CPU 限制总和
内存限制(limits.memory) limits.memory: "16Gi" 命名空间内所有 Pod 的内存限制总和
对象数量(count/*) count/ingresses.extensions: "10" 命名空间内 Ingress 资源实例数上限
故障关联点:当 Ingress 控制器所在命名空间配置了 ResourceQuota,且控制器 Deployment 的 requests 或 limits 未显式声明时,API Server 会依据 LimitRange 的默认值填充。若默认值超出 Quota 剩余容量,控制器 Pod 将无法调度,导致网关断流。

3.2 LimitRange:Pod 级资源默认值与约束

LimitRange 在命名空间级别为未显式设置资源请求/限制的 Pod 注入默认值,并设定每个容器可使用的资源上下界。其典型配置结构如下:

apiVersion: v1
kind: LimitRange
metadata:
  name: ingress-controller-lr
  namespace: ingress-system
spec:
  limits:
  - type: Container
    default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "250m"
      memory: "256Mi"
    max:
      cpu: "2"
      memory: "2Gi"
    min:
      cpu: "50m"
      memory: "64Mi"

关键字段说明:

  • default:当容器未设置 resources.limits 时,自动注入该值。
  • defaultRequest:当容器未设置 resources.requests 时,自动注入该值。
  • max / min:强制约束每个容器的资源上限和下限,超出则拒绝创建。

3.3 配额校验流程与故障触发路径

下图展示了从 Pod 创建请求到 ResourceQuota 校验的完整链路,以及 LimitRange 在其中扮演的“默认值注入”角色:

ResourceQuota 与 LimitRange 交互流程 用户创建 Pod API Server 准入控制 LimitRange 注入默认值 ResourceQuota 校验 通过 → Pod 创建成功 拒绝 → 返回错误 故障触发路径: Ingress 控制器 Deployment 未设置 resources → LimitRange 注入默认值 → ResourceQuota 校验失败 → Pod 创建被拒绝 → 网关断流。

3.4 配额冲突的典型场景

在本次故障时间线中,以下三种配额冲突模式直接导致了 Ingress 控制器不可用:

  1. 默认值超限:LimitRange 设置的 defaultRequest.memory: 512Mi,而 ResourceQuota 剩余内存仅 400Mi,导致控制器 Pod 无法调度。
  2. 对象计数配额:count/ingresses.extensions 设置为 50,但业务侧因配置错误创建了 60 个 Ingress 资源,超出配额后新 Ingress 无法生效。
  3. 资源范围冲突:LimitRange 的 max.cpu: "1" 与控制器实际需要的 limits.cpu: "2" 矛盾,Pod 被准入控制拒绝。

3.5 最佳实践:避免配额导致的网关故障

推荐做法:
  • 为 Ingress 控制器所在命名空间单独规划 ResourceQuota,预留 20% 的缓冲容量。
  • 在控制器 Deployment 中显式声明 resources.requests 和 resources.limits,避免依赖 LimitRange 默认值。
  • 定期使用 kubectl describe quota -n ingress-system 监控配额使用率,设置告警阈值(如使用率 > 80%)。
  • 将 Ingress 控制器与业务负载隔离到不同命名空间,避免业务配额波动影响网关。