imagefs和rootfs 7
在你现有表格基础上补充 「Linux实际路径」「为什么是这个路径」「Kubelet/Runtime如何确定」「相关配置」。
注意:Kubernetes 不是固定读取这些目录。路径由 kubelet、container runtime 配置决定。下面是默认 Linux 部署(systemd + containerd/docker)的典型情况。
| 指标 | Kubelet读取字段 | OS实际路径/对象 | 为什么是这个路径 | 路径来源/配置 |
|---|---|---|---|---|
| nodefs.available | summary.Node.Fs.AvailableBytes |
/ 根文件系统 |
nodefs代表Node本身的文件系统,kubelet需要知道整个节点磁盘压力,所以默认统计 kubelet 所在宿主机 root filesystem | kubelet启动参数 --root-dir 默认 /var/lib/kubelet;cAdvisor通过 statfs() 获取 kubelet所在filesystem |
| nodefs.available | summary.Node.Fs.CapacityBytes |
/ 对应块设备,例如 /dev/sda1 |
FsStats本质来自Linux statfs(),不是扫描目录 |
Linux kernel filesystem API |
| nodefs.used | summary.Node.Fs.UsedBytes |
/ 下所有数据 |
包括:OS文件、日志、kubelet目录、容器目录(如果没有独立imagefs/containerfs) | df / 等价 |
| imagefs.available | summary.Node.Runtime.ImageFs.AvailableBytes |
/var/lib/containerd 或 /var/lib/docker所在filesystem |
镜像layer由container runtime管理,不属于kubelet直接管理,因此通过CRI查询 | containerd配置 root;docker配置 data-root |
| imagefs.used | summary.Node.Runtime.ImageFs.UsedBytes |
containerd snapshot/content目录 | 镜像由snapshotter保存,例如overlay snapshot | containerd config.toml |
| containerfs.used | podStats.Container.Rootfs.UsedBytes |
OverlayFS upperdir,例如:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/<id>/fs |
容器启动后写入的数据必须落在可写层,OverlayFS结构:lower(readonly image)+upper(writable container) | containerd snapshotter配置 |
| containerfs.used | WritableLayer.UsedBytes |
Docker overlay2: /var/lib/docker/overlay2/<id>/diff |
Docker使用overlay2存储驱动,diff目录就是容器写层 | Docker daemon storage-driver=overlay2 |
| container logs | podStats.Container.Logs.UsedBytes |
/var/log/pods/<namespace>_<podname>_<uid>/<container>/0.log |
Kubernetes默认把stdout/stderr写到节点日志目录,然后由runtime/kubelet管理 | kubelet参数 --pod-manifest-path无关;日志位置由 kubelet/runtime约定 |
| container logs | Logs.UsedBytes |
/var/log/containers/*.log(软链接) |
用户kubectl logs看到的是这里对应的container日志 | kubelet负责创建链接 |
| emptyDir | VolumeStats.FsStats.UsedBytes |
/var/lib/kubelet/pods/<podUID>/volumes/kubernetes.io~empty-dir/<volumeName> |
emptyDir生命周期跟Pod绑定,由kubelet volume manager创建 | kubelet --root-dir |
| ephemeral-storage | PodStats.EphemeralStorage.UsedBytes |
没有单独目录 | 它是计算值,不对应filesystem | kubelet计算:rootfs + logs + emptyDir |
1. nodefs 为什么是 /
数据链路
Linux filesystem
|
| statfs("/")
|
v
cadvisor FsInfo
|
v
summary.Node.Fs
|
v
Eviction Manager
Linux调用:
statfs("/")
返回:
f_blocks = 总block数量
f_bavail = 可用block数量
f_bsize = block大小
计算:
CapacityBytes =
f_blocks * f_bsize
AvailableBytes =
f_bavail * f_bsize
例如:
/dev/sda1
Size:
100Gi
Available:
8Gi
进入:
summary.Node.Fs.AvailableBytes = 8589934592
2. imagefs 为什么是 /var/lib/containerd
因为镜像不是kubelet保存的。
链路:
kubectl create pod
|
v
kubelet
|
v
CRI
|
v
containerd
|
v
image store
containerd默认:
配置:
/etc/containerd/config.toml
例如:
version = 2
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.k8s.io/pause"
[plugins."io.containerd.snapshotter.v1.overlayfs"]
默认root:
/var/lib/containerd
里面:
/var/lib/containerd
|
├── io.containerd.content.v1.content
| 镜像blob
|
├── io.containerd.snapshotter.v1.overlayfs
镜像snapshot
所以:
imagefs
=
containerd image storage filesystem
3. containerfs 为什么是 overlay upperdir
容器启动:
镜像:
ubuntu image
layer1
layer2
layer3
都是只读:
lowerdir
启动容器:
overlay mount
lowerdir=image layers
upperdir=container writable layer
结构:
overlay
|
├── lowerdir
| 镜像
|
└── upperdir
容器写入
例如:
容器:
echo hello >/tmp/a
实际:
upperdir/tmp/a
所以:
containerfs.used
=
upperdir大小
4. emptyDir 为什么是这个路径
Pod创建:
volumes:
- name:data
emptyDir:{}
kubelet创建:
/var/lib/kubelet/pods/<uid>/volumes/
例如:
/var/lib/kubelet
|
└── pods
|
└── 123456
|
└── volumes
|
└── kubernetes.io~empty-dir
|
└── data
Pod删除:
整个目录删除。
所以它属于:
ephemeral storage
5. 为什么 ephemeral-storage 没有路径
因为它不是:
df xxx
得到的。
它是:
ephemeralStorage =
container.Rootfs.UsedBytes
+ container.Logs.UsedBytes
+ volume.UsedBytes
例如:
| 来源 | 路径 | 大小 |
|---|---|---|
| containerfs | overlay upperdir | 2Gi |
| logs | /var/log/pods |
1Gi |
| emptyDir | /var/lib/kubelet/pods/.../volumes |
3Gi |
最终:
Pod ephemeral-storage = 6Gi
6. 关键配置汇总
| 项目 | 默认配置 | 作用 |
|---|---|---|
| kubelet root目录 | /var/lib/kubelet |
emptyDir、Pod数据、volume统计 |
| kubelet参数 | --root-dir |
修改kubelet工作目录 |
| containerd root | /var/lib/containerd |
镜像和snapshot存储 |
| containerd配置 | /etc/containerd/config.toml |
修改runtime存储位置 |
| Docker root | /var/lib/docker |
Docker镜像和overlay2 |
| Docker配置 | /etc/docker/daemon.json |
修改data-root |
| Pod日志目录 | /var/log/pods |
stdout/stderr日志 |
| 容器日志链接 | /var/log/containers |
kubectl logs入口 |
最终对应关系:
| Kubernetes概念 | Linux实际位置 |
|---|---|
| nodefs | / |
| imagefs | /var/lib/containerd 或 /var/lib/docker |
| containerfs | overlay upperdir |
| logs | /var/log/pods |
| emptyDir | /var/lib/kubelet/pods/<uid>/volumes |
| ephemeral-storage | 上面几个加权计算结果 |
这样可以从 Eviction字段 → Go结构体 → Runtime接口 → Linux路径 → 配置来源 完整对应起来。
浙公网安备 33010602011771号