磁盘压力从哪来
节点磁盘容量或索引节点紧张时,节点会被标记为磁盘压力。触发后 kubelet 先回收镜像与已退出容器,压力持续则拒绝新 Pod 并驱逐已有工作负载。处理这类问题要先分清是容量不足还是索引节点耗尽,两者现象相似但清理手段不同。
基本信息
| 适用平台 | Kubernetes 1.20+,节点条件由 kubelet 维护 |
|---|---|
| 触发条件 | 磁盘容量低于阈值或可用索引节点不足 |
| 两种统计域 | 节点文件系统与镜像文件系统 |
| 自我恢复 | 回收未被使用的镜像与已结束的容器 |
| 升级后果 | 拒绝新 Pod、驱逐已有 Pod |
典型使用场景
- 节点突然标记不可调度,需要确认是不是磁盘问题
- 容器频繁被驱逐,事件原因指向本地存储不足
- 批量拉取大镜像后磁盘水位告警
- 索引节点耗尽导致无法创建新文件,容量却还有很多
- 清理前评估镜像、容器日志与业务数据各自占用
节点侧定位(节点上执行)
节点侧定位(节点上执行)
df -h /var/lib/kubelet /var/lib/containerd / 2>/dev/null # 容量水位
df -i / | tail -1 # 索引节点水位
journalctl -u kubelet --no-pager | grep -i -E 'imagefs|nodefs|disk' | tail -20
du -sh /var/lib/containerd/* 2>/dev/null | sort -h | tail -5 # 占用大头集群侧观察
集群侧观察
kubectl describe node node1 | grep -i -A2 DiskPressure # 节点条件
kubectl get events -A --field-selector reason=Evicted | tail -5 # 驱逐事件
kubectl get pods -A --field-selector spec.nodeName=node1 | grep -v Running # 受影响负载盘位与成因对照
| 观察点 | 含义 | 常见成因 |
|---|---|---|
| 节点文件系统 | 系统盘与容器日志所在分区 | 日志轮转缺失、临时文件堆积 |
| 镜像文件系统 | 镜像与容器层存放分区 | 镜像版本过多、长期不清理 |
| 索引节点 | 文件数量上限 | 大量小文件,容量仍有剩余 |
| 镜像回收 | 自动回收未使用镜像 | 回收后水位仍高说明有大文件占用 |
清理前先看清楚占用分布。多数情况下镜像层与容器日志才是大块头,只删业务日志往往收效有限,而且可能删掉排查所需的现场信息。
索引节点耗尽与容量耗尽表现相似但成因不同,只用容量命令检查会得出错误结论。两者应同时查看。