节点资源竞争基础: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 选择进程终止。
limits.memory,却忽略了节点上系统进程(如 kubelet、dockerd、journald)的内存占用。系统进程被 OOM Kill 后,节点可能进入 NotReady 状态,间接导致其他 Pod 被驱逐。
磁盘 IO 资源竞争
磁盘 IO 竞争在日志密集型应用、数据库类 Pod 或使用本地 SSD 的场景中尤为突出。IO 竞争表现为 iowait 升高、容器启动超时(镜像拉取慢)、etcd 写入延迟增加。
磁盘 IO 的竞争模型可以通过以下结构图理解:
网络带宽资源竞争
网络带宽竞争在微服务架构中尤为隐蔽。当多个 Pod 共享同一宿主机网卡时,带宽争抢会导致 TCP 重传率上升、连接建立超时,进而引发 gRPC 调用失败、健康检查探针超时。
网络带宽竞争通常不直接导致 OOM 或进程退出,但会通过以下间接路径触发 CrashLoop:
- 就绪探针(readinessProbe)超时:服务无法在预期时间内响应 HTTP 请求,被标记为不健康。
- 存活探针(livenessProbe)失败:连续多次超时后 Kubelet 重启容器。
- 分布式组件失联:如 etcd 成员之间心跳超时,触发 leader 选举,导致写入延迟。
sar -n DEV 1 5 查看网卡带宽利用率,结合 ss -s 统计 TCP 重传段。若重传率超过 0.5%,且带宽利用率接近上限,则存在网络资源竞争。
资源竞争与调度亲和性的关联
节点资源竞争并非孤立现象,它与调度亲和性故障之间存在以下传导链条:
- 资源竞争导致节点压力:CPU 限流 / 内存压力 / IO 抖动 / 网络丢包。
- 节点压力触发驱逐或重启:Kubelet 驱逐 Pod,或容器健康检查失败被重启。
- Pod 频繁重启进入 CrashLoop:调度器尝试重新调度,但亲和性规则(nodeAffinity / podAntiAffinity)可能将 Pod 再次调度到同一问题节点。
- 亲和性规则加剧资源竞争:Pod 被强制绑定到特定节点,无法分散负载,形成恶性循环。
下表总结了不同资源竞争场景下,调度亲和性故障的典型表现:
| 资源竞争类型 | 亲和性故障表现 | 典型错误事件 |
|---|---|---|
| CPU 竞争 | Pod 调度到同一 CPU 密集型节点,限流加剧 | CPUThrottlingHigh 告警 |
| 内存竞争 | Pod 因 nodeAffinity 绑定到内存不足节点,反复 OOM | OOMKilling 事件 |
| 磁盘 IO 竞争 | 日志 Pod 与数据库 Pod 因 podAntiAffinity 不足而共享磁盘 | PodStartupTimeout |
| 网络带宽竞争 | 服务网格 sidecar 与业务容器争抢带宽,探针超时 | ProbeError / ReadinessProbeFailed |
综合资源竞争拓扑
以下 SVG 图展示了多维度资源竞争在节点层面的叠加效应,以及它们如何共同影响 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% |