Title here
Summary here
本章深入解析 containerd 的整体架构设计,帮助你理解各组件之间的关系和数据流向。
containerd 的设计遵循以下核心原则:
containerd 通过 gRPC 暴露 API:
默认端点:
/run/containerd/containerd.sock代码路径:
cmd/containerd/command/main.go - 服务启动cmd/containerd/server/server.go - gRPC 服务器初始化服务层实现具体的业务逻辑:
| 服务 | 功能 | 代码路径 |
|---|---|---|
| Containers | 容器元数据 CRUD | plugins/services/containers/ |
| Images | 镜像管理 | plugins/services/images/ |
| Tasks | 容器生命周期 | plugins/services/tasks/ |
| Content | Blob 存储 | plugins/services/content/ |
| Snapshots | 快照管理 | plugins/services/snapshots/ |
| Events | 事件发布/订阅 | plugins/services/events/ |
| Leases | 资源租约 | plugins/services/leases/ |
| Namespaces | 命名空间管理 | plugins/services/namespaces/ |
| Diff | 文件系统差异 | plugins/services/diff/ |
| Introspection | 内省服务 | plugins/services/introspection/ |
核心层提供底层功能实现:
代码路径:core/content/
代码路径:
core/snapshots/snapshotter.goplugins/snapshots/使用 BoltDB 存储元数据:
/var/lib/containerd/io.containerd.metadata.v1.bolt/meta.db数据结构:
v1/
├── <namespace>/
│ ├── containers/
│ ├── images/
│ ├── snapshots/
│ ├── content/
│ └── leases/代码路径:core/metadata/
代码路径:
core/runtime/core/runtime/v2/shim_manager.gocontainerd 采用插件化架构,几乎所有功能都通过插件实现:
// 插件注册示例
func init() {
registry.Register(&plugin.Registration{
Type: plugins.GRPCPlugin,
ID: "images",
Requires: []plugin.Type{
plugins.ServicePlugin,
},
InitFn: func(ic *plugin.InitContext) (interface{}, error) {
// 初始化插件
return &service{...}, nil
},
})
}代码路径:plugins/
containerd/
├── api/ # Protobuf API 定义
│ ├── services/ # 服务定义
│ │ ├── containers/ # 容器服务
│ │ ├── images/ # 镜像服务
│ │ ├── tasks/ # 任务服务
│ │ └── ...
│ ├── types/ # 公共类型
│ └── events/ # 事件类型
│
├── client/ # Go 客户端库
│ ├── client.go # 客户端入口
│ ├── container.go # 容器操作
│ ├── image.go # 镜像操作
│ └── task.go # 任务操作
│
├── cmd/ # 可执行程序
│ ├── containerd/ # 主守护进程
│ │ ├── command/ # CLI 命令
│ │ ├── server/ # 服务器实现
│ │ └── builtins/ # 内置插件注册
│ ├── ctr/ # CLI 工具
│ └── containerd-shim-runc-v2/ # runc shim
│
├── core/ # 核心接口和实现
│ ├── content/ # 内容存储
│ ├── images/ # 镜像管理
│ ├── containers/ # 容器管理
│ ├── snapshots/ # 快照管理
│ ├── runtime/ # 运行时
│ ├── metadata/ # 元数据
│ ├── events/ # 事件系统
│ ├── leases/ # 租约管理
│ ├── mount/ # 挂载管理
│ ├── transfer/ # 传输管理
│ └── unpack/ # 解包管理
│
├── plugins/ # 插件实现
│ ├── services/ # 服务插件
│ ├── snapshots/ # 快照器插件
│ ├── content/ # 内容插件
│ ├── metadata/ # 元数据插件
│ ├── gc/ # GC 插件
│ ├── cri/ # CRI 插件
│ └── sandbox/ # Sandbox 插件
│
├── internal/ # 内部包(不导出)
│ ├── cri/ # CRI 实现
│ └── ...
│
└── pkg/ # 公共工具包
├── archive/ # 归档操作
├── cio/ # 容器 IO
├── oci/ # OCI 工具
└── .../var/lib/containerd/
├── io.containerd.content.v1.content/
│ ├── blobs/
│ │ └── sha256/
│ │ ├── <digest1>
│ │ └── <digest2>
│ └── ingest/
│
├── io.containerd.snapshotter.v1.overlayfs/
│ ├── metadata.db
│ └── snapshots/
│ ├── 1/
│ │ ├── fs/
│ │ └── work/
│ └── 2/
│
├── io.containerd.metadata.v1.bolt/
│ └── meta.db
│
├── io.containerd.runtime.v2.task/
│ └── <namespace>/
│ └── <container_id>/
│ ├── config.json
│ ├── rootfs/
│ └── work/
│
└── io.containerd.grpc.v1.cri/
└── sandboxes/containerd 支持命名空间隔离:
使用命名空间:
// Go 客户端
ctx := namespaces.WithNamespace(context.Background(), "my-namespace")
// ctr 命令
ctr -n my-namespace containers list/etc/containerd/config.tomlC:\Program Files\containerd\config.tomlversion = 2
# 基础配置
root = "/var/lib/containerd"
state = "/run/containerd"
# gRPC 配置
[grpc]
address = "/run/containerd/containerd.sock"
uid = 0
gid = 0
max_recv_message_size = 16777216
max_send_message_size = 16777216
# 调试配置
[debug]
address = "/run/containerd/debug.sock"
uid = 0
gid = 0
level = "info"
# 指标配置
[metrics]
address = "127.0.0.1:1338"
# 插件配置
[plugins]
# CRI 插件
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.k8s.io/pause:3.9"
[plugins."io.containerd.grpc.v1.cri".containerd]
default_runtime_name = "runc"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
# Snapshotter 配置
[plugins."io.containerd.snapshotter.v1.overlayfs"]
root_path = "/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs"containerd config default > /etc/containerd/config.tomlcontainerd 架构的核心特点:
理解这些架构设计有助于:
下一节我们将深入学习 插件系统设计。