images和rootfs 1
可以,这次我给你一版**“不删关键细节 + 官方语义 + 实现机制全部保留 + 统一不冲突”完整版合并文档**。
你之前的问题本质是:想要既有官方定义,又有 kubelet真实行为,还不能丢细节——我这版会按这个标准来。
⭐ Kubernetes 磁盘模型(官方 + kubelet实现完整保留终极版)
⭐ 0. 总体原则(最关键,不要跳过)
Kubernetes 的磁盘模型不是静态设计,而是三层叠加:
① 官方语义层(Kubernetes docs定义)
② kubelet实现层(statfs + CRI + cadvisor)
③ runtime存储层(containerd/docker/overlayfs)
⭐ 1. 官方定义(不删减原意)
来源:
https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction/
✅ kubelet识别的 filesystem identifiers
官方明确:
nodefs
imagefs
containerfs
⭐ 2. nodefs(完整定义 + 实现 +边界)
✔ 官方语义
nodefs = node main filesystem used by the node
✔ 官方包含内容
-
local volumes
-
emptyDir volumes
-
kubelet state data
-
logs
✔ 实现来源(不能删)
kubelet通过:
statfs("/")
✔ 关键机制(核心)
nodefs = 所有挂载在 root filesystem device 上的 usage 汇总
✔ 实际包含(完整)
系统级:
-
/etc -
/usr -
/var -
/home
Kubernetes:
-
/var/lib/kubelet -
/var/log/pods -
/var/log/containers
Pod:
-
emptyDir(默认落在nodefs)
❗关键边界(不能删)
nodefs ≠ 某个目录
nodefs = root filesystem device usage
⭐ 3. imagefs(完整定义 + 识别逻辑 +边界)
✔ 官方语义
imagefs = filesystem used by container runtime to store images and read-only layers
✔ 实现来源(必须保留)
statfs(runtimeRoot)
runtimeRoot:
-
containerd →
/var/lib/containerd -
docker →
/var/lib/docker
✔ 关键识别逻辑(核心不能删)
if device(runtimeRoot) != device("/")
→ imagefs exists
else
→ imagefs == nodefs
✔ imagefs包含(完整)
镜像层:
-
pulled images
-
image manifests
-
blobs
runtime层:
-
overlay read-only layers
-
snapshot metadata
❗关键边界
imagefs = container runtime filesystem usage
不是路径 /var/lib/docker 本身
⚠️重要现实情况(必须保留)
情况1:独立磁盘
/dev/sdb1 → /var/lib/containerd
✔ imagefs 独立
情况2:同一盘
/var/lib/containerd → /
✔ imagefs = nodefs(合并)
⭐ 4. containerfs(官方新模型 + 实现)
✔ 官方语义
containerfs = writable container layers + logs + local storage
✔ 实现来源(不能删)
来自 cadvisor:
container_fs_usage_bytes
container_fs_limit_bytes
✔ 真实含义
containerfs = per-container filesystem usage
✔ 包含内容(完整)
-
overlay upperdir(写层)
-
container writable layer
-
container logs(部分场景)
-
container local writes
❗关键点(不能删)
containerfs = container级,不是node级
⭐ 5. rootfs(必须完整保留,不再简化)
❗重要纠正
rootfs 不是 filesystem 类型
✔ kubelet/cadvisor中的真实含义
rootfs = container writable layer usage(overlay upperdir)
✔ 实现路径(真实)
/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/
✔ 组成
-
upperdir(写入)
-
diff layer
-
container writable FS
✔ 关系(不能删)
rootfs ⊂ containerfs ⊂ imagefs(逻辑关系)
⭐ 6. kubelet识别机制(完整不删版本)
Step 1:statfs获取 filesystem
statfs(path) → fs device ID
Step 2:runtime提供root目录
-
containerd
-
docker
Step 3:device对比(关键)
device(runtimeRoot) vs device("/")
Step 4:分类结果
→ nodefs
→ imagefs
→ containerfs
Step 5:cadvisor补充数据
-
disk usage
-
inode usage
-
container-level FS usage
⭐ 7. 三种真实部署模型(完整保留)
🟢 模型 1:单filesystem
nodefs = /
imagefs = none
containerfs = derived from nodefs
🟡 模型 2:分盘模式
nodefs = /
imagefs = /var/lib/containerd (different disk)
🔵 模型 3:拆分 containerfs(新)
nodefs
imagefs
containerfs
⭐ 8. 完整资源地图(不删减终极版)
NODE┌──────────────────────────────────────┐
│ nodefs │
│──────────────────────────────────────│
│ /var/lib/kubelet │
│ /var/log │
│ emptyDir │
│ system files │
└───────────────┬────────────────────┘│ statfs("/")▼┌──────────────────────────────────────┐
│ imagefs │
│──────────────────────────────────────│
│ container images │
│ read-only layers │
│ snapshot data │
└───────────────┬────────────────────┘│ statfs(runtimeRoot)▼┌──────────────────────────────────────┐
│ containerfs │
│──────────────────────────────────────│
│ writable container layers │
│ container logs │
│ local container storage │
└───────────────┬────────────────────┘▼rootfs (per container)→ overlay upperdir
⭐ 9. eviction机制(完整不删)
Step 1:指标来源
nodefs.available
imagefs.available
containerfs.available
nodefs.inodesFree
Step 2:触发条件
usage > threshold → eviction
Step 3:清理顺序(完整)
1️⃣ image GC
-
unused images
-
dangling layers
2️⃣ container cleanup
-
exited containers
-
sandbox cleanup
3️⃣ pod eviction
BestEffort → Burstable → Guaranteed
⭐ 10. inode维度(不能删)
nodefs.inodesFree
imagefs.inodesFree
👉 inode单独触发 eviction
⭐ 11. 最终统一本质(完整保留版)
Kubernetes 的 nodefs / imagefs / containerfs / rootfs 并不是路径或磁盘概念,
而是 kubelet 通过 statfs() + CRI runtime + cadvisor 统计
在不同 filesystem device 上动态计算出的资源分类体系。
⭐ 如果你下一步还要更深(可以继续)
我可以继续帮你做三件更底层的:
🔥 1. kubelet eviction manager Go源码逐行解析
🔥 2. cadvisor 如何区分 imagefs vs containerfs
🔥 3. overlayfs upperdir 如何被统计成 containerfs
🔥 4. 为什么 image GC 和 docker prune 完全不是一回事
只要你说:继续源码级,我可以带你进 kubelet 内部实现层。
