临时存储为什么会撑爆节点
容器的可写层、容器日志以及临时目录都占用节点本地磁盘,这部分资源没有天然上限。节点磁盘被写满后,kubelet 会对节点上的 Pod 做驱逐,受影响的不一定是写日志的那一个。给工作负载显式声明临时存储的请求与上限,是让调度与驱逐都有据可依的唯一办法。
基本信息
| 适用平台 | Kubernetes 1.20+,由 kubelet 统计与执行 |
|---|---|
| 统计范围 | 容器可写层、容器日志、临时目录 |
| 约束方式 | 声明临时存储的请求与上限 |
| 超限后果 | 容器被驱逐,事件原因标注为临时存储 |
| 关联机制 | 节点驱逐阈值与服务质量等级 |
典型使用场景
- 应用会写大量临时文件,需要限定用量避免撑满节点
- 发布脚本或构建容器会解压大文件,必须给出预算
- 多团队共用节点,防止某一方无节制占用磁盘
- 排查容器被驱逐:确认事件原因是不是临时存储超限
- 容量规划:把临时存储请求纳入节点可用量的计算
声明配额
声明配额
resources:
requests:
cpu: 500m
memory: 512Mi
ephemeral-storage: 1Gi # 调度依据
limits:
memory: 1Gi
ephemeral-storage: 2Gi # 超限触发驱逐查看用量
查看用量
kubectl describe node node1 | grep -A6 'Allocated resources' # 节点已分配量
kubectl describe pod web-x | grep -i -A2 'ephemeral-storage' # 单 Pod 的请求与用量
kubectl get pod web-x -o jsonpath='{.status.reason}' # 是否被驱逐
df -h /var/lib/kubelet # 节点磁盘水位字段与现象读法
| 项目 | 含义 | 说明 |
|---|---|---|
| requests | 调度时预留的量 | 不设置按零计算,节点可能被写满 |
| limits | 使用上限 | 超过后容器被驱逐或限制写入 |
| 驱逐事件 | 节点磁盘压力导致 | 事件里会注明临时存储超限 |
| 节点水位 | 本地磁盘使用率 | 水位过高会触发节点级驱逐 |
被驱逐后 Pod 会重建,但节点磁盘上的日志与可写层数据不会保留。排查日志类问题时要在驱逐发生前采集,或把日志输出到标准输出由采集系统接管。
应用狂写日志打满节点磁盘时,先触发的是节点级驱逐,同一节点上其他业务的 Pod 会一起被赶走。给日志设置轮转与上限,比事后加配额更有效。