节点资源竞争基础:CPU、内存、磁盘IO、网络带宽等资源竞争的表现形式

在 Kubernetes 集群中,节点资源竞争是导致 Pod 异常重启(CrashLoopBackOff)的常见诱因之一。当多个工作负载共享同一节点的物理或虚拟资源时,资源争抢会引发性能抖动、调度失败甚至进程被强制终止。理解各类资源竞争的表现形式,是定位调度亲和性故障的前提。

资源竞争的核心维度

节点资源竞争主要发生在以下四个维度,每个维度的竞争特征和排查切入点各不相同:

资源类型 竞争本质 典型表现 Kubernetes 感知方式
CPU 时间片争抢 容器响应延迟、限流(throttling) CPU Throttling 指标、容器启动延迟
内存 物理页框争抢 OOM Kill、Swap 抖动 Pod 状态 OOMKilled、节点 MemoryPressure
磁盘 IO 块设备访问排队 读写延迟飙升、I/O 等待高 节点 iowait、Pod 启动超时
网络带宽 网卡队列与吞吐争抢 丢包、重传、连接超时 网络插件指标、TCP 重传率

CPU 资源竞争

CPU 是可压缩资源,竞争不会直接杀死进程,但会导致容器被内核限流(CFS quota 机制)。当节点上所有容器的 CPU 请求总和超过节点容量时,调度器会拒绝新 Pod;当 CPU 使用总和超过节点上限时,内核通过 CFS 对容器进行节流。

排查要点: 使用 kubectl top pod 观察 CPU 使用率,配合 /sys/fs/cgroup/cpu/cpu.stat 中的 nr_throttled 字段判断是否被限流。限流严重的容器会出现请求超时、健康检查失败,进而触发 CrashLoop。

内存资源竞争

内存是不可压缩资源,竞争直接导致 OOM Killer 介入。Kubelet 根据 memory.available 与 --eviction-hard 阈值触发节点压力驱逐,而内核 OOM Killer 则根据 oom_score 选择进程终止。

常见误区: 很多运维人员只关注 Pod 的 limits.memory,却忽略了节点上系统进程(如 kubelet、dockerd、journald)的内存占用。系统进程被 OOM Kill 后,节点可能进入 NotReady 状态,间接导致其他 Pod 被驱逐。

磁盘 IO 资源竞争

磁盘 IO 竞争在日志密集型应用、数据库类 Pod 或使用本地 SSD 的场景中尤为突出。IO 竞争表现为 iowait 升高、容器启动超时(镜像拉取慢)、etcd 写入延迟增加。

磁盘 IO 的竞争模型可以通过以下结构图理解:

磁盘 IO 竞争模型 Pod A(日志) Pod B(数据库) Pod C(文件处理) 内核 IO 调度器 (CFQ / Deadline / NOOP) 块设备 /dev/vda1 IOPS 上限 竞争后果: • 数据库 Pod 写入延迟增加 → 健康检查超时 → 重启 • 日志 Pod 大量写盘 → 挤占 IO 时间片 → 影响其他 Pod 启动速度

网络带宽资源竞争

网络带宽竞争在微服务架构中尤为隐蔽。当多个 Pod 共享同一宿主机网卡时,带宽争抢会导致 TCP 重传率上升、连接建立超时,进而引发 gRPC 调用失败、健康检查探针超时。

网络带宽竞争通常不直接导致 OOM 或进程退出,但会通过以下间接路径触发 CrashLoop:

  • 就绪探针(readinessProbe)超时:服务无法在预期时间内响应 HTTP 请求,被标记为不健康。
  • 存活探针(livenessProbe)失败:连续多次超时后 Kubelet 重启容器。
  • 分布式组件失联:如 etcd 成员之间心跳超时,触发 leader 选举,导致写入延迟。
排查建议: 在节点上执行 sar -n DEV 1 5 查看网卡带宽利用率,结合 ss -s 统计 TCP 重传段。若重传率超过 0.5%,且带宽利用率接近上限,则存在网络资源竞争。

资源竞争与调度亲和性的关联

节点资源竞争并非孤立现象,它与调度亲和性故障之间存在以下传导链条:

  1. 资源竞争导致节点压力:CPU 限流 / 内存压力 / IO 抖动 / 网络丢包。
  2. 节点压力触发驱逐或重启:Kubelet 驱逐 Pod,或容器健康检查失败被重启。
  3. Pod 频繁重启进入 CrashLoop:调度器尝试重新调度,但亲和性规则(nodeAffinity / podAntiAffinity)可能将 Pod 再次调度到同一问题节点。
  4. 亲和性规则加剧资源竞争:Pod 被强制绑定到特定节点,无法分散负载,形成恶性循环。

下表总结了不同资源竞争场景下,调度亲和性故障的典型表现:

资源竞争类型 亲和性故障表现 典型错误事件
CPU 竞争 Pod 调度到同一 CPU 密集型节点,限流加剧 CPUThrottlingHigh 告警
内存竞争 Pod 因 nodeAffinity 绑定到内存不足节点,反复 OOM OOMKilling 事件
磁盘 IO 竞争 日志 Pod 与数据库 Pod 因 podAntiAffinity 不足而共享磁盘 PodStartupTimeout
网络带宽竞争 服务网格 sidecar 与业务容器争抢带宽,探针超时 ProbeError / ReadinessProbeFailed

综合资源竞争拓扑

以下 SVG 图展示了多维度资源竞争在节点层面的叠加效应,以及它们如何共同影响 Pod 生命周期:

节点资源竞争综合拓扑 Kubernetes 节点 CPU 竞争 限流 / 调度延迟 CFS quota 内存竞争 OOM Kill MemoryPressure 磁盘 IO 竞争 iowait 飙升 启动超时 网络竞争 TCP 重传 探针超时 Pod 状态异常 CrashLoopBackOff / ImagePullBackOff / OOMKilled 调度亲和性规则(nodeAffinity / podAntiAffinity) 可能将 Pod 重新调度到同一竞争节点,形成恶性循环

关键指标速查表

在实际排查中,以下指标可以帮助快速判断节点是否存在资源竞争:

指标 数据来源 竞争阈值参考
node_cpu_seconds_total Prometheus Node Exporter 用户态 + 系统态 > 85% 持续 5 分钟
container_cpu_cfs_throttled_seconds_total cAdvisor / kubelet throttled 时间占比 > 10%
node_memory_MemAvailable_bytes Node Exporter 可用内存 < 节点总量 10%
node_disk_io_time_seconds_total Node Exporter iowait > 30% 且持续 3 分钟
node_network_transmit_drop_total Node Exporter 丢包率 > 0.1%
node_netstat_Tcp_RetransSegs Node Exporter 重传段占比 > 0.5%
核心结论: 节点资源竞争是 CrashLoop 的底层诱因之一,而调度亲和性规则可能放大这种竞争。在后续章节中,我们将深入分析如何通过 Pod 资源配额、Quality of Service (QoS) 等级、以及亲和性策略的合理配置,打破“竞争 → 故障 → 重新调度 → 再竞争”的恶性循环。