2. Kubernetes 资源模型基础:Requests 与 Limits 的区别与原理

在 Kubernetes 中,CPU 和 内存 是两种可压缩(CPU)与不可压缩(Memory)的资源。Operator 作为长期运行的控制面 Pod,其资源配额设置直接影响调度稳定性、节点压力与 OOM 风险。理解 requests 与 limits 的底层机制,是性能调优的第一步。

2.1 资源单位与语义

资源类型 单位 可压缩性 超卖风险
CPU m(毫核,1000m = 1 核) 可压缩(通过 CFS 配额限制) 低(超限后节流,不杀死进程)
内存 Mi / Gi(二进制字节) 不可压缩 高(超限触发 OOM Killer)
调优要点:Operator 通常对内存更敏感。内存超限会导致 Pod 被直接杀死并重启,影响控制面稳定性;CPU 超限仅导致限流,不会中断服务。

2.2 Requests:调度保证与资源预留

requests 是 Pod 启动时向 kube-scheduler 声明的“最低资源需求”。调度器根据每个 Node 上所有 Pod 的 requests 总和决定能否放置新 Pod。

  • CPU requests: 基于 CFS(Completely Fair Scheduler)的 cpu.shares 实现。每个 Pod 按 requests 比例获得 CPU 时间片。
  • 内存 requests: 作为内存资源预留的参考值,Kubelet 在计算节点压力时使用 requests 判断是否驱逐 Pod。
# 示例:Operator Deployment 资源声明
resources:
  requests:
    cpu: 500m        # 调度保证 0.5 核
    memory: 256Mi    # 调度保证 256 MiB
  limits:
    cpu: 1000m       # 最多使用 1 核
    memory: 512Mi    # 最多使用 512 MiB

2.3 Limits:硬上限与 OOM 防护

limits 是 Pod 运行时不能超过的硬性上限。超过 CPU limits 会被节流(throttle),超过内存 limits 会触发 OOM Killer。

  • CPU limits: 通过 CFS 的 cpu.cfs_quota_us 实现。Kubelet 在每个调度周期内强制限制 Pod 的 CPU 使用量。
  • 内存 limits: 通过 cgroup 的 memory.limit_in_bytes 实现。一旦超过,内核直接发送 SIGKILL。
常见陷阱:很多 Operator 将 limits.memory 设置得过高(如 4Gi),但 requests.memory 仅 128Mi。这会导致节点内存超卖严重,当多个 Pod 同时突发内存时,节点 OOM 概率急剧上升。

2.4 Requests 与 Limits 的三种配置模式

模式 配置方式 调度行为 运行时行为 适用场景
Guaranteed requests == limits(CPU 和内存均相等) 最高优先级,不会被抢占 无节流风险,内存稳定 核心 Operator、控制面组件
Burstable requests < limits(至少一个资源不等) 中等优先级,可被 Guaranteed 抢占 允许突发,但可能被节流或 OOM 非关键 Operator、批量任务
BestEffort 不设置 requests 和 limits 最低优先级,最先被驱逐 无资源保证,极不稳定 不推荐用于任何 Operator

2.5 资源模型核心原理:调度与运行时双视图

下面的 SVG 展示了 调度阶段 与 运行时阶段 两个视角下 requests 与 limits 的作用路径。

Requests 与 Limits 的双视图作用路径 调度阶段(Scheduler) 使用 requests 做决策 CPU requests cpu.shares 权重 内存 requests 节点压力驱逐 调度决策:Node 可分配资源 ≥ 所有 Pod requests 总和 运行时阶段(Kubelet) 使用 limits 做限制 CPU limits cfs_quota 节流 内存 limits OOM Killer 运行时限制:超过 limits 则节流或杀死 QoS 分类(由 requests 与 limits 关系决定) Guaranteed requests == limits 最高优先级 无节流/无驱逐 Burstable requests < limits 中等优先级 可能节流/OOM BestEffort 无 requests/limits 最低优先级 最先被驱逐

2.6 性能调优视角的关键结论

  1. Operator 推荐使用 Guaranteed QoS: 设置 requests == limits,避免被 BestEffort 或低优先级 Burstable Pod 抢占,保证控制面响应稳定。
  2. 内存 limits 必须精确: 通过压测获取 Operator 的稳态内存 + 20% 缓冲,设置 limits.memory。过高会导致节点超卖,过低会导致频繁 OOM。
  3. CPU limits 可适当宽松: 如果 Operator 有突发计算需求,可将 limits.cpu 设为 requests.cpu 的 2 倍,利用 Burstable 模式提升吞吐。
  4. 监控实际使用量: 使用 kubectl top pod 或 Prometheus 持续观察 Operator 的 CPU 和内存实际使用曲线,定期调整 requests/limits。
调优检查清单:
  • ✅ 所有 Operator Pod 已设置 requests 和 limits
  • ✅ 内存 requests 与 limits 差值不超过 20%
  • ✅ CPU limits 不超过节点总核数的 25%
  • ✅ 已配置 resources.requests.memory 不低于 128Mi
  • ✅ 已启用 --enforce-node-allocatable=pods 确保节点预留