containerd 2.1.8 超深度源码分析 — 总体架构与模块全景
分析对象:github.com/containerd/containerd v2.1.8
代码根目录:/home/lin/src/github.com/containerd-2.1.8
非测试非vendor Go源码:948 文件,174,070 行
一、项目定位
1.1 containerd 是什么
containerd 是云原生容器运行时的 核心基础设施层 ,介于编排系统(Kubernetes)和底层运行时(runc)之间:
容器生命周期管理 :创建/启动/停止/删除容器
镜像分发与存储 :pull/push/内容寻址存储
执行与运行时 :任务管理、shim 进程管理
快照与差异 :overlayfs/btrfs/devicemapper 快照
CRI 兼容 :直接对接 kubelet
1.2 在容器生态中的位置
Snapshotter (overlayfs/btrfs)
1.3 核心能力
#
能力
对应模块
1
Plugin 体系
插件注册/依赖解析/初始化
2
gRPC + ttrpc 双协议
daemon 暴露 gRPC,shim 通信用 ttrpc
3
Metadata 存储
BoltDB + 8 类 bucket
4
Content 寻址存储
CAS (Content Addressable Storage)
5
Snapshot 管理
overlayfs/btrfs/devicemapper/native
6
Diff 计算
walking diff / differ 插件
7
镜像管理
pull/push/unpack/resolve
8
Runtime 抽象
PlatformRuntime + Task 接口
9
Shim 进程管理
shim v2 (一容器一shim → 多容器一shim)
10
Sandbox 支持
Pod 级沙箱 + 独立控制器
11
事件系统
异步事件总线 + namespace 隔离
12
GC 回收
标记-清除式垃圾收集
13
Transfer 服务
统一传输接口 (pull/push/import/export)
14
CRI 插件
CRI 兼容层 (Pod/Sandbox/Container)
15
NRI 集成
Node Resource Interface 插件
二、源码目录结构与行数
2.1 顶层模块行数
模块
行数
文件数
功能
api/
38,331
108
Protobuf API 定义 + gRPC/ttrpc 服务桩
core/
37,903
181
核心业务逻辑(metadata/content/snapshot/diff/runtime/sandbox/images/remotes/mount/transfer/events/leases/streaming/unpack/containers/introspection/metrics)
internal/
31,572
205
内部工具(shim/runtime/task/userns/eventq/nri/erofs/kmutex/registrar/failpoint…)
cmd/
19,796
125
CLI入口(containerd/ctr/shim/stress)+ builtins
plugins/
17,944
99
插件实现(gc/sandbox/restart/transfer/streaming/cri/metadata/events/nri/leases/services/imageverifier)
pkg/
16,495
149
公共工具包(oci/archive/shim/filters/sys/cio/netns/tracing/progress/namespaces/reference/gc/…)
client/
6,744
30
Go SDK(New/Container/Task/Image/Pull/Transfer/Events/…)
contrib/
1,951
15
贡献代码(apparmor/seccomp/nvidia/gce)
defaults/
251
8
默认配置常量
version/
41
1
版本信息
2.2 core/ 子模块详解
子模块
行数
功能
metadata/
6,217
BoltDB 元数据存储(containers/images/content/gc/leases/namespaces)
mount/
2,155
Mount 操作封装
images/
1,135
镜像管理
content/
617
内容寻址存储接口
unpack/
599
镜像解压
runtime/
554
运行时抽象(PlatformRuntime/Task/IO)
remotes/
516
远程仓库访问
sandbox/
411
沙箱管理
diff/
684
差异计算
snapshots/
397
快照管理接口
leases/
245
租约管理
events/
80
事件接口
transfer/
178
传输服务
streaming/
47
流管理
containers/
117
容器数据模型
introspection/
30
自省服务
三、六层架构
Layer 5: Shim (cmd/shim + internal/shim)
Layer 4: Plugin 体系 (plugins/ + internal/)
Layer 2: Client SDK (client/)
gRPC Services
(containers/images/content/tasks/snapshots/diff/leases/sandbox/transfer/version/events/namespaces)
ttrpc Services
(events/task v2)
Protobuf Types
(task/runc/transfer/runtimeoptions)
四、核心数据流
4.1 镜像拉取完整流程
Metadata (BoltDB)
Snapshotter
Content Store
Docker Hub (Registry)
Transfer Service
containerd Client
用户/Controller
Metadata (BoltDB)
Snapshotter
Content Store
Docker Hub (Registry)
Transfer Service
containerd Client
用户/Controller
loop
[每个 layer blob]
client.Pull("docker.io/library/nginx:latest")
Transfer.Pull(ref)
Resolve ref → 获取 manifest digest
Fetch manifest
WriteBlob(manifest)
Fetch config blob
WriteBlob(config)
Fetch layer blob
WriteBlob(layer)
Unpack(layer blobs) → Apply diff
CreateImage("nginx:latest", manifest digest)
Image
*Image
4.2 容器创建完整流程
Metadata
runc
containerd-shim
Shim Manager
Tasks Service (gRPC)
containerd Client
用户
Metadata
runc
containerd-shim
Shim Manager
Tasks Service (gRPC)
containerd Client
用户
container.NewTask(ctx, cio.NewCreator())
Create(request{containerID, bundle, rootfs, terminal, stdin, stdout, stderr})
Create(containerID, opts)
启动/复用 shim 进程
runc create --bundle <bundle>
容器已创建 (PID)
Task{PID, Status=created}
CreateResponse{PID}
Task
task.Start(ctx)
Start(request{containerID})
Start(containerID)
ttrpc Start
runc start <id>
Status=running
StartResponse{PID}
OK
4.3 Plugin 加载流程
plugin.Register()
编译时注册所有插件
V2DisabledFilter
排除 DisabledPlugins
plugin.NewContext()
+ initialized set
grpcService → Register(grpcServer)
ttrpcService → RegisterTTRPC(ttrpcServer)
tcpService → RegisterTCP(tcpServer)
五、Plugin 体系核心类型
5.1 Plugin Type 常量
Type
值
描述
InternalPlugin
io.containerd.internal.v1
内部插件
RuntimePlugin
io.containerd.runtime.v1
运行时 v1
RuntimePluginV2
io.containerd.runtime.v2
运行时 v2
ServicePlugin
io.containerd.service.v1
内部服务
GRPCPlugin
io.containerd.grpc.v1
gRPC 服务
TTRPCPlugin
io.containerd.ttrpc.v1
ttrpc 服务
SnapshotPlugin
io.containerd.snapshotter.v1
快照驱动
DiffPlugin
io.containerd.differ.v1
差异计算
MetadataPlugin
io.containerd.metadata.v1
元数据
ContentPlugin
io.containerd.content.v1
内容存储
GCPlugin
io.containerd.gc.v1
GC 策略
EventPlugin
io.containerd.event.v1
事件处理
LeasePlugin
io.containerd.lease.v1
租约
StreamingPlugin
io.containerd.streaming.v1
流管理
TransferPlugin
io.containerd.transfer.v1
传输
SandboxStorePlugin
io.containerd.sandbox.store.v1
沙箱存储
SandboxControllerPlugin
io.containerd.sandbox.controller.v1
沙箱控制器
ShimPlugin
io.containerd.shim.v1
Shim
CRIServicePlugin
io.containerd.cri.v1
CRI 服务
NRIApiPlugin
io.containerd.nri.v1
NRI
ImageVerifierPlugin
io.containerd.image-verifier.v1
镜像验证
5.2 Plugin 注册结构
type Registration struct {
Type Type
ID string
Config interface { }
Requires [ ] Type
InitFn func ( * InitContext) ( interface { } , error )
}
六、Server 结构体 — daemon 核心
type Server struct {
prometheusServerMetrics * grpc_prometheus. ServerMetrics
grpcServer * grpc. Server
ttrpcServer * ttrpc. Server
tcpServer * grpc. Server
config * srvconfig. Config
plugins [ ] * plugin. Plugin
ready sync. WaitGroup
}
Server 服务矩阵
服务
协议
监听
用途
gRPC Server
gRPC
Unix socket
客户端 API
ttrpc Server
ttrpc
Unix socket
Shim 通信
TCP Server
gRPC+TLS
TCP
远程访问
Metrics
HTTP
TCP
Prometheus
Debug
HTTP
TCP
pprof/expvar
七、gRPC Service 清单
Service
包
功能
Containers
api/services/containers/v1
容器 CRUD
Content
api/services/content/v1
内容存储
Diff
api/services/diff/v1
差异计算
Events
api/services/events/v1
事件订阅
Images
api/services/images/v1
镜像管理
Leases
api/services/leases/v1
租约管理
Namespaces
api/services/namespaces/v1
命名空间
Snapshots
api/services/snapshots/v1
快照管理
Tasks
api/services/tasks/v1
任务管理
Transfer
api/services/transfer/v1
传输服务
Sandbox
api/services/sandbox/v1
沙箱管理
Version
api/services/version/v1
版本信息
Introspection
api/services/introspection/v1
自省
所有评论(0)