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 的作用路径。
2.6 性能调优视角的关键结论
- Operator 推荐使用 Guaranteed QoS: 设置
requests == limits,避免被 BestEffort 或低优先级 Burstable Pod 抢占,保证控制面响应稳定。 - 内存 limits 必须精确: 通过压测获取 Operator 的稳态内存 + 20% 缓冲,设置
limits.memory。过高会导致节点超卖,过低会导致频繁 OOM。 - CPU limits 可适当宽松: 如果 Operator 有突发计算需求,可将
limits.cpu设为requests.cpu的 2 倍,利用 Burstable 模式提升吞吐。 - 监控实际使用量: 使用
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确保节点预留