关于容器运行时contained目录结构
node节点的磁盘使用情况已经到达81%,进一步分析容器占用情况各文件格式说明:类型临时数据、共享内存典型挂载点:(POSIX 共享内存)(运行时文件)Kubernetes Pod 挂载点(如 )系统文件、应用数据UEFI启动分区混合联合文件系统容器运行时容器场景:路径示例:实现容器镜像分层:LowerDir:只读镜像层UpperDir:容器可写层Merged:统一视图容器间通信本质:tmpfs
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 | 临时 | 内存 |
临时数据、共享内存
|
重启消失 |
ext4/XFS | 持久 | 磁盘 |
系统文件、应用数据 |
需手动清理 |
VFAT | 持久 | 磁盘 |
UEFI启动分区 |
不可清理 |
overlay |
混合 联合文件系统 |
磁盘+内存 |
容器运行时
|
清理镜像 |
shm | 临时 | 内存 |
容器间通信
|
重启消失 |
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) 的核心组件,其作用和工作原理如下:
一、核心作用
-
Kubernetes 运行时桥梁
- 将 kubelet 的 CRI 请求(如
CreateContainer
/StartContainer
)转换为 containerd 的原生操作。 - 实现 Kubernetes 与容器运行时之间的标准化通信。
- 将 kubelet 的 CRI 请求(如
-
Pod 生命周期管理
- 处理 Pod 沙箱(pause 容器)的创建/销毁。
- 管理容器启停、资源隔离(通过底层 runc 或 gVisor 等运行时)。
-
镜像与存储对接
- 从容器镜像仓库拉取镜像并解压到
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 时:
- kubelet 调用
RunPodSandbox
CRI 接口 - 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(), }) }
- 后续容器通过
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...
- 镜像层 tar 包(
- 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
:镜像差异比较数据
更多推荐
所有评论(0)