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路径 → 配置来源 完整对应起来。

posted on 2026-07-14 10:20  小镇-做题家  阅读(1)  评论(0)    收藏  举报

导航