node节点的磁盘使用情况已经到达81%,进一步分析容器占用情况

df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        7.5G     0  7.5G   0% /dev
tmpfs           7.5G     0  7.5G   0% /dev/shm
tmpfs           7.5G  5.8M  7.5G   1% /run
/dev/vda3       118G   92G   22G  81% /
/dev/vda2       200M  5.8M  194M   3% /boot/efi
tmpfs           4.0G  4.0K  4.0G   1% /var/lib/kubelet/pods/ad3262a2-02cb-4a7e-961b-0aaa4224a729/volumes/kubernetes.io~secret/addon-token
tmpfs           1.0G   12K  1.0G   1% /var/lib/kubelet/pods/ce4db2f0-8998-4881-9740-553b0386079d/volumes/kubernetes.io~projected/kube-api-access-x2v5g
tmpfs           4.0G   12K  4.0G   1% /var/lib/kubelet/pods/ad3262a2-02cb-4a7e-961b-0aaa4224a729/volumes/kubernetes.io~projected/kube-api-access-cfd9m
tmpfs           2.0G   12K  2.0G   1% /var/lib/kubelet/pods/c2041bd5-9584-415d-9281-691193ad4e30/volumes/kubernetes.io~projected/kube-api-access-nhk7c
tmpfs           1.2G   12K  1.2G   1% /var/lib/kubelet/pods/edfe5a9a-bb65-4e10-bef2-048b96778af2/volumes/kubernetes.io~projected/kube-api-access-qd8jj
tmpfs            14G   12K   14G   1% /var/lib/kubelet/pods/2f464796-23b6-485c-a05b-4d163cc93c29/volumes/kubernetes.io~projected/kube-api-access-ddj5n
tmpfs            14G   12K   14G   1% /var/lib/kubelet/pods/5c03e649-fb11-49b4-9d4f-0092dad375c6/volumes/kubernetes.io~projected/kube-api-access-xqfbd
shm              64M     0   64M   0% /run/containerd/io.containerd.grpc.v1.cri/sandboxes/385242022ecabbd558202f26eace37851c65df1a12d5157672c6858c21e3bddc/shm
shm              64M     0   64M   0% /run/containerd/io.containerd.grpc.v1.cri/sandboxes/bbcc51107968c1309cf0d8ea5e32da407fa13ae98d3d348b418746e83755b96b/shm
overlay         118G   92G   22G  81% /run/containerd/io.containerd.runtime.v2.task/k8s.io/385242022ecabbd558202f26eace37851c65df1a12d5157672c6858c21e3bddc/rootfs
overlay         118G   92G   22G  81% /run/containerd/io.containerd.runtime.v2.task/k8s.io/bbcc51107968c1309cf0d8ea5e32da407fa13ae98d3d348b418746e83755b96b/rootfs

各文件格式说明:

类型

持久性 存储位置 典型场景 是否可清理
devtmpfs 临时 内存 设备文件,Linux 内核管理的设备节点文件系统
tmpfs 临时 内存

临时数据、共享内存

  • 典型挂载点

    • /dev/shm(POSIX 共享内存)

    • /run(运行时文件)

    • Kubernetes Pod 挂载点(如 /var/lib/kubelet/pods/*)

重启消失
ext4/XFS 持久 磁盘

系统文件、应用数据

需手动清理
VFAT 持久 磁盘

UEFI启动分区

不可清理
overlay

混合

联合文件系统

磁盘+内存

容器运行时

  • 容器场景

    • 路径示例:/run/containerd/.../rootfs

    • 实现容器镜像分层:

      • LowerDir:只读镜像层

      • UpperDir:容器可写层

      • Merged:统一视图

清理镜像
shm 临时 内存

容器间通信

  • 本质:tmpfs 的别名

  • 容器场景

    • 位于 /run/containerd/.../shm

    • 提供容器间共享内存

    • 每个容器分配独立 shm(如输出中的 64MB)

重启消失

Kubernetes 相关路径说明

  • /var/lib/kubelet/pods/*:
    Pod 临时卷(configMap/secret 挂载),由 kubelet 自动管理

  • /run/containerd/*:
    Containerd 容器运行时文件,包括:

    • io.containerd.grpc.v1.cri:CRI 接口层

    • io.containerd.runtime.v2.task:容器运行实例


io.containerd.grpc.v1.cri 是 containerd 中实现 Kubernetes CRI (Container Runtime Interface) 的核心组件,其作用和工作原理如下:

一、核心作用

  1. Kubernetes 运行时桥梁

    • 将 kubelet 的 CRI 请求(如 CreateContainer/StartContainer)转换为 containerd 的原生操作。
    • 实现 Kubernetes 与容器运行时之间的标准化通信。
  2. Pod 生命周期管理

    • 处理 Pod 沙箱(pause 容器)的创建/销毁。
    • 管理容器启停、资源隔离(通过底层 runc 或 gVisor 等运行时)。
  3. 镜像与存储对接

    • 从容器镜像仓库拉取镜像并解压到 overlayfs 存储。
    • 管理容器可写层(COW)和存储配额。

二、关键功能模块

1. Pod 沙箱管理
  • 每个 Pod 对应一个 sandbox 环境(通过 sandboxes/ 子目录管理)
  • 创建独立的 Linux namespaces(network/pid/ipc 等)
  • 生成 infra(pause)容器维持共享命名空间
2. CRI 服务协议
  • 实现以下 gRPC 服务接口:
service RuntimeService {
  rpc RunPodSandbox(RunPodSandboxRequest) returns (RunPodSandboxResponse) {}
  rpc CreateContainer(CreateContainerRequest) returns (CreateContainerResponse) {}
  rpc StartContainer(StartContainerRequest) returns (StartContainerResponse) {}
  // 其他接口...
}

三、目录结构解析

/run/containerd/io.containerd.grpc.v1.cri/
├── sandboxes/               # Pod沙箱实例
│   └── <sandbox-id>/        # 每个Pod对应一个目录
│       ├── shm              # 共享内存挂载点
│       ├── log.json         # 容器日志驱动配置
│       └── config.json      # 沙箱OCI规范配置
└── containers/              # 容器运行时实例
    └── <container-id>/
        ├── rootfs           # OverlayFS挂载点
        └── log              # 容器标准输出日志
        └── io               # 标准输入输出管道

四、工作流程示例

当 kubelet 创建 Pod 时:

  1. kubelet 调用 RunPodSandbox CRI 接口
  2. CRI 插件创建沙箱环境:
    // containerd内部处理逻辑
    func (c *criService) RunPodSandbox(ctx context.Context, r *pb.RunPodSandboxRequest) {
        // 1. 创建网络命名空间
        netNS := c.network.CreateSandbox(r)
        
        // 2. 启动pause容器
        container := c.client.NewContainer(ctx, "sandbox-"+r.GetPodSandboxId(),
            WithRuntime("io.containerd.runc.v2"),
            WithSpec(genPodSandboxSpec(r)),
        )
        task := container.NewTask(ctx, ...)
        task.Start(ctx)
        
        // 3. 写入沙箱元数据
        c.sandboxStore.Add(sandboxMeta{
            ID:     r.GetPodSandboxId(),
            NetNS:  netNS.Path(),
        })
    }
    
  3. 后续容器通过 CreateContainer CRI 接口在沙箱内创建

/var/lib/containerd 是 containerd 容器运行时的核心数据存储目录,其子目录各自承担关键功能。以下是详细解析:

一、核心目录结构及作用

/var/lib/containerd/
├── io.containerd.content.v1.content/   # 镜像内容存储(核心)
├── io.containerd.metadata.v1.bolt/     # 元数据库(SQLite)
├── io.containerd.runtime.v2.task/      # 容器运行时实例
├── io.containerd.snapshotter.v1.overlayfs/  # 镜像分层存储
├── tmp/                                # 临时文件
└── plugins/                            # 插件存储

二、关键目录深度解析

1. io.containerd.content.v1.content
  • 作用:存储镜像的内容寻址数据(Content-Addressable Storage)
  • 内容
    • 镜像层 tar 包(sha256 哈希命名)
    • 镜像 Manifest/Config 文件
      /var/lib/containerd/io.containerd.content.v1.content/
      └── blobs/
          └── sha256/
              ├── a3ed95caeb02...  # 镜像层Blob文件
              └── b4d2...
      
  • 2. io.containerd.metadata.v1.bolt
  • 作用:存储元数据的 BoltDB 数据库
  • 文件meta.db
  • 记录内容
    • 镜像/容器/Snapshot 的元信息
    • 标签与哈希的映射关系
  • 查看方法
    sudo boltb /var/lib/containerd/io.containerd.metadata.v1.bolt/meta.db
    
3. io.containerd.runtime.v2.task
  • 作用:运行中的容器实例数据
  • 结构
    /var/lib/containerd/io.containerd.runtime.v2.task/
    └── k8s.io/               # Kubernetes 容器专用命名空间
        └── <container-id>/   # 每个容器一个目录
            ├── rootfs/       # OverlayFS挂载点
            ├── config.json   # OCI运行时配置
            └── log.json      # 日志驱动配置
    
  • 关联进程
    ctr task ls -namespace k8s.io
    
4. io.containerd.snapshotter.v1.overlayfs
  • 作用:管理镜像的分层存储(OverlayFS)
  • 关键文件
    • metadata.db:Snapshot 元数据
    • snapshots/:每个层的可写目录(UpperDir)
  • 示例
    /var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/
    ├── snapshots/
    │   └── 1/
    │       ├── fs/    # 容器的可写层
    │       └── work/  # OverlayFS工作目录
    └── content/       # 镜像层硬链接(指向content目录)
    
5. plugins/
  • 作用:存储插件状态数据
  • 常见插件
    • cri:Kubernetes CRI 插件数据
    • diff:镜像差异比较数据

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐