3. 资源争抢场景分析:CPU、内存、磁盘IO争抢的典型表现与根因

在 Kubernetes 多租户或混部场景中,多个 Pod 共享同一 Node 的计算与存储资源。当资源预留不足或 Limit 配置不合理时,Pod 之间会发生资源争抢,导致服务质量下降、延迟飙升甚至 Pod 被驱逐。本章从 CPU、内存、磁盘 IO 三个维度,分析争抢的典型表现与根因。

3.1 CPU 争抢:节流与调度延迟

CPU 是可压缩资源,争抢时不会直接杀死 Pod,但会导致 CPU Throttling(节流)和调度延迟增加。

典型表现 监控指标 根因
应用响应时间增加,但 CPU 使用率未达 100% container_cpu_cfs_throttled_seconds_total CPU Limit 设置过低,CFS 配额周期内被限流
Pod 启动变慢,就绪检查超时 node_cpu_seconds_total 各 mode 占比 Node 上 CPU 密集型 Pod 过多,内核调度器无法及时分配时间片
相同 Request 的 Pod 性能差异大 容器级别 CPU 使用率与 Limit 比值 CPU 亲和性设置不当或 NUMA 节点间资源不均衡
关键结论: CPU 争抢的根因通常是 Limit 设置过紧 或 Request 与 Limit 差距过大(Burstable QoS 导致节流)。建议为延迟敏感型业务设置 CPU Request = Limit,使用 Guaranteed QoS。

3.2 内存争抢:OOM 与驱逐

内存是不可压缩资源,一旦超过 Limit 或 Node 内存不足,会直接触发 OOM Kill 或 Pod 驱逐。

典型表现 监控指标 根因
Pod 突然重启,Exit Code 137 container_oom_events_total 容器内存使用超过 Limit,被 cgroup OOM Killer 杀死
Node 状态为 MemoryPressure,部分 Pod 被驱逐 node_memory_MemAvailable_bytes 低于阈值 Node 上所有 Pod 内存总和超过 Node 容量,kubelet 触发驱逐
应用出现频繁 GC 或 Swap 使用(已禁用) 容器 RSS 持续增长,接近 Limit 内存泄漏或业务突发流量导致内存需求超出预期
避坑提示: 不要在生产环境设置 memory.swappiness 为非零值。Kubernetes 默认禁用 Swap,开启 Swap 会导致 QoS 失效,OOM 行为不可预测。

3.3 磁盘 IO 争抢:吞吐与延迟抖动

磁盘 IO 是 不可压缩 但 可隔离 的资源。Kubernetes 原生不提供 IO 隔离,争抢时表现为吞吐下降和延迟抖动。

典型表现 监控指标 根因
日志写入延迟高,应用阻塞在 IO node_disk_io_time_seconds_total 升高 多个 Pod 同时写日志或写本地临时卷,磁盘队列深度过大
数据库 Pod 查询变慢,但 CPU 和内存正常 container_fs_io_current 持续高位 同一 Node 上存在大量 IO 密集型 Pod(如数据管道、ETL)
Pod 启动超时,镜像拉取慢 镜像层解压时间 > 预期 磁盘带宽被其他 Pod 占用,导致镜像层写入慢
推荐实践: 使用本地 SSD 或云盘时,为高 IO 应用设置 emptyDir.medium: Memory 或使用 PV 的 IOPS 限速(如 AWS EBS 的 volumeIOPS)。对于关键业务,考虑使用 cgroup v2 IO Controller 或第三方 IO 隔离方案。

3.4 三种资源争抢的对比与根因总结

资源类型 是否可压缩 争抢后果 典型根因 推荐修复方向
CPU 是 节流、延迟增加 Limit 过小 / Burstable QoS 设置 CPU Request = Limit
内存 否 OOM Kill / Pod 驱逐 Limit 超限 / 内存泄漏 设置合理 Limit + 垂直扩缩容
磁盘 IO 否(可隔离) 吞吐下降 / 延迟抖动 IO 密集型 Pod 混部 / 无 IO 限制 使用 PV IOPS 限速 / 专用节点池
Pod 资源争抢根因分析图 Pod 资源争抢 CPU 节流 CFS 配额限流 调度延迟增加 OOM / 驱逐 cgroup OOM Killer kubelet 驱逐 IO 延迟抖动 磁盘队列深度过大 IOPS 无限制 根因共性:资源预留不足 + 缺乏隔离机制 修复方向:合理设置 Request/Limit + 专用节点池 + QoS 保障

3.5 实战排查命令速查

当怀疑资源争抢时,按以下顺序快速定位根因:

  1. 检查 Pod 事件: kubectl describe pod <pod-name> 查看 OOM、驱逐、节流事件。
  2. 查看容器指标: 使用 kubectl top pod 对比 Request/Limit 使用率。
  3. 分析 CPU 节流: 进入容器执行 cat /sys/fs/cgroup/cpu/cpu.stat 查看 nr_throttled 值。
  4. 检查磁盘 IO: 在 Node 上执行 iostat -x 1 观察 await 和 %util。
  5. 确认 QoS 等级: kubectl get pod <pod-name> -o yaml | grep qosClass。
核心原则: 资源争抢的根因往往不是单一 Pod 的问题,而是 调度策略 + 资源配额 + 混部密度 三者失衡的结果。在排查时,始终从 Node 视角出发,先看整体资源水位,再定位具体 Pod。