- Authors

- Name
- Youngju Kim
- @fjvbn20031
containerdアーキテクチャ内部分析
containerdは業界標準のコンテナランタイムで、Dockerから分離されて独立プロジェクトとして発展しました。Kubernetes CRIを実装しコンテナの全ライフサイクルを管理します。
1. containerd概要
1.1 位置と役割
Kubernetes (kubelet)
|
v (CRI gRPC)
containerd
|
v (OCI runtime)
runc / kata / gVisor
|
v
Linux kernel (namespaces, cgroups)
主な役割: イメージ管理、コンテナライフサイクル管理、スナップショット管理、ネームスペース分離、タスク管理。
1.2 コア設計原則
- シンプルさ: 1つのことを上手く実行
- プラグインベース: すべての機能がプラグインで実装
- OCI準拠: OCIイメージスペックとランタイムスペック遵守
- gRPC API: すべてのインタラクションはgRPCを通じて
2. gRPC API構造
containerdはContainers、Content、Images、Namespaces、Snapshots、Tasks、Events、LeasesのgRPCサービスを提供します。
containerdのネームスペースはKubernetesネームスペースとは異なり、containerd内部でリソースを分離するメカニズムです:
- k8s.io: Kubernetes(CRI)が使用
- moby: Dockerが使用
3. プラグインシステム
3.1 プラグインタイプ
containerdのすべての機能はプラグインで実装: Service、Snapshotter、Runtime、GC、Content Store、Metadata、Differ。
3.2 依存関係解決
起動時にすべてのプラグインの依存関係を分析し、トポロジカルソートで正しい順序で初期化します。
3.3 プラグイン設定
version = 2
[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.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
4. CRI実装
containerdはCRI gRPCサービスを内蔵プラグインとして実装:
- RuntimeService: Pod/コンテナライフサイクル管理
- ImageService: イメージ管理
CRIリクエストフロー:
- kubeletがRunPodSandbox呼び出し
- containerdがpauseコンテナ作成
- CNIプラグイン呼び出し
- kubeletがCreateContainer + StartContainer呼び出し
- containerdがshimプロセスを通じてコンテナ実行
5. Shim v2アーキテクチャ
5.1 Shimの役割
containerd --> shim (containerd-shim-runc-v2) --> runc --> container process
Shimの責任: containerd再起動時もコンテナ維持、stdin/stdout/stderr管理、終了コード収集、OOMイベント報告。
5.2 ttrpcプロトコル
Shim v2はttrpc(tiny-ttrpc)を使用。gRPCの軽量版で、protobufシリアライゼーション、Unixドメインソケット通信、低メモリ使用、HTTP/2オーバーヘッドなし。
5.3 様々なShim実装
| Shim | ランタイム | 説明 |
|---|---|---|
| containerd-shim-runc-v2 | runc | デフォルトOCIランタイム |
| containerd-shim-kata-v2 | Kata | 軽量VMベース |
| containerd-shim-runsc-v1 | gVisor | ユーザー空間カーネル |
6. メタデータストア
containerdはBoltDBをメタデータストアとして使用。コンテナ定義、イメージメタデータ、スナップショットメタデータ、Lease情報を保存。
/var/lib/containerd/
io.containerd.metadata.v1.bolt/meta.db
io.containerd.content.v1.content/blobs/sha256/
io.containerd.snapshotter.v1.overlayfs/snapshots/
7. まとめ
containerdのプラグインベースアーキテクチャは高い拡張性と柔軟性を提供します。Shim v2のプロセス分離モデルはcontainerd再起動時もコンテナを安定的に維持し、ttrpcによる効率的な通信でオーバーヘッドを最小化します。